IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Procédural MySQL Discussion :

Tables avec champs multidimentionnels ?


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 81
    Par défaut Tables avec champs multidimentionnels ?
    Bonsoir tout le monde

    J'ai une question bete ( ou hors sujet ?! ) concernant l'organisation de mes tables.

    Tout d'abord je precise que j'utilise wamp
    Apache/2.0.59 (Win32) PHP/5.2.0
    Mysql 5.0.27

    Voici ma question :

    avec une table, disons "vaisseaux_spatiaux"
    je voudrais pouvoir obtenir ceci
    ... une table avec caracteristiques_vaisseau qui soit multidimentionnel
    exemple :

    ----------------------------------------------------------------
    id_vaisseau | nom_vaisseau | caracteristiques_vaisseau |
    --------------------------------------------------------------

    | type_cargaison | volume_cargaison |
    ----------------------------------------------------------------
    1 | ulyss | eau | 3000 |
    | | dechets | 5000 |
    vegetaux | 300 |

    ----------------------------------------------------------------
    2 | alika | eau | 3000 |
    vegetaux | 300 |

    ----------------------------------------------------------------
    3 | ulyss | eau | 3000 |
    | | dechets | 5000 |
    vegetaux | 300 |

    ----------------------------------------------------------------
    4 | ulyss | eau | 3000 |
    | | dechets | 5000 |
    vegetaux | 300 |




    2 eme question :
    Est t-il possible de redefinir caracteristiques_vaisseau dans cette meme table vaisseaux_spatiaux ?

    ----------------------------------------------------------------
    id_vaisseau | nom_vaisseau | caracteristiques_vaisseau |
    --------------------------------------------------------------

    | type_cargaison | volume_cargaison |
    ----------------------------------------------------------------
    1 | ortica | eau | 3000 |
    | | dechets | 5000 |
    vegetaux | 300 |


    | type | volume | prix | origine |
    ----------------------------------------------------------------
    2 | vampiris | eau | 8000 | 154 | terre |
    3 | madila | sable | 34 | 44 | mars |


    Voili voila en gros sur une structure de table donnée est t-il possible de definir une colonne caracteristiques_vaisseaux qui contient des champs multidimensionnels dont je ne connais ni le nom des colonnes ni le nombre de lignes..

    J'ai bien sur une tonne de question autour de ce thème...
    Si vous voulez bien eclairer ma lanterne je suis preneur les sgbd n'etant pas ma spécialité

  2. #2
    Membre Expert
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Par défaut
    Avec MySQL ce n'est a ma connaissance pas réalisable en l'état.

    Une BDD plus évoluée pourrait stocker des listes et/ou des objets (Oracle le fait).

    Sans cela, une possibilité (à fuir à mom avis) serait de stocker tout ça sous forme de chaine de caractères dans la colonnes 'caracteristiques_vaisseau'. Maléable mais pas pratique.

    La solution relationnelle est de faire une table 'cargaison' qui contient ('idVaisseau', 'idTypeCargaison', 'quantité'). Il est ensuite facile de retrouver la cargaison d'un vaisseau donné avec une jointure. Par contre il faudra une table par caractéristique.
    Pour avoir une forme de polymorphisme ça devient plus délicat. Si c'est l'ajout de quelques champs on peut mettre les colonnes et les laisser vide dans certains cas ou leur donner une table dédiée qu'on ne remplit que dans certains cas. C'est somme toute du mapping objet relationnel et l'héritage n'est pas simple a réaliser.

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 81
    Par défaut
    Citation Envoyé par Sivrît
    Avec MySQL ce n'est a ma connaissance pas réalisable en l'état.
    Tant pis ...
    Je sais pas si sur oracle c'est pratique a "manier" SQLment parlant...

    Merci a toi Sivrit pour tes réponses.
    Quant a moi je continue de chercher (sqlite etc .. ) ma base de données gratuite miracle


  4. #4
    Membre Expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Par défaut
    Citation Envoyé par Sivrît
    Avec MySQL ce n'est a ma connaissance pas réalisable en l'état.

    Une BDD plus évoluée pourrait stocker des listes et/ou des objets (Oracle le fait).
    C'est une erreur. MySql gère les colonnes de types liste et ensemble et peut stocker des objets sérialisés.

    Le type liste : 11.4.4. Le type ENUM
    Le type ensemble : 11.4.5. Le type SET
    Les types TEXT et BLOB : 11.4.3. Les types BLOB et TEXT

    Plusieurs solutions :Stocker le type de cargaison dans un ensemble
    1. Stocker le type de cargaison dans un ensemble exemple (végétaux,déchets) ou (végétaux) ou (déchets) ou (null)
    2. Dans la colonne en réalité, ces données sont stockés comme des nombres binaires.... A l'ensemble (végétaux,déchets) correspond 1*2^1 + 1*2^0. A l'ensemble (végétaux) correspond 1*2^1+0*2^0, etc...
    3. Dans votre colonne stock, stocké cela sous forme de puissance. Prenez un BIGINT. Admettons que le stock maxi soit 1024. Si vous avez 1000 végétaux et 50 déchets, votre valeur de stock sera 1000*1024^1 + 50 *1024^0
    Utiliser le type TEXT et sérialiser votre objet en XML
    PHP permet de sérialiser un objet. Donc votre objet aurait la forme suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <?php
     
    //Initialisation de cargaison
    $cargaison->VEGETAUX = 1024;
    $cargaison->DECHET = 50;
     
    //affichage de l'objet
    var_dump($cargaison);
     
    //sérialisation de l'objet avant son stockage dans la base de donnée
    $cargaison_serialise = serialize($cargaison);
     
    //Affichage de l'objet sérialisé
    var_dump($cargaison_serialise);
     
    ?>
    Ceci donne à l'affichage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    object(stdClass)#1 (2) {
      ["VEGETAUX"]=>
      int(1024)
      ["DECHET"]=>
      int(50)
    }
    string(59) "O:8:"stdClass":2:{s:8:"VEGETAUX";i:1024;s:6:"DECHET";i:50;}"
    Il ne vous reste plus qu'à stocker la variable $cargaison_serialize

    Je vous invite à lire les définitions des fonctions PHP serialize
    unserialize


    Troisième méthode : Modélisez mieux votre base de données.

    La table cargaison doit être dépendante de la table vaisseau et de la table matière

    Vaisseau ( id_vaisseau, nom_vaisseau, etc...)
    Matière (id_matiere, nom_matiere, etc...)
    Cargaison (id_vaisseau, id_matiere, stock)

    Voilà.

    Arrêtons de dire tel type de base est plus adaptée qu'une autre. Les combats Oracle, MySQL et SqlLite sont stériles à ce niveau. a partir du moment où la modélisation de la base de données est correcte, leurs avantages et inconvénients se limitent essentiellement aux parties hardware, consommations de ressources, coût d'entretien et coût d'acquisition. Si votre base de données est mal modélisée, aucun moteur de base de données ne répondra réellement à vos besoins.
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  5. #5
    Membre Expert
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Par défaut
    Je ne connaissais pas les SET, c'est intéressant.

    Citation Envoyé par Alexandre T
    Arrêtons de dire tel type de base est plus adaptée qu'une autre. Les combats Oracle, MySQL et SqlLite sont stériles à ce niveau. a partir du moment où la modélisation de la base de données est correcte, leurs avantages et inconvénients se limitent essentiellement aux parties hardware, consommations de ressources, coût d'entretien et coût d'acquisition. Si votre base de données est mal modélisée, aucun moteur de base de données ne répondra réellement à vos besoins.
    Pas taper, pas taper ! Je ne voulais absolument pas lancer une guerre des BDD. C'est juste qu'avec certaines bases on peut faire des tables imbriquées, de l'objet et de l'héritage et que je sais que c'est le cas pour Oracle. Je n'ai par contre aucune idée de la praticité réelle de ces fonctionnalités, et de toute façon Oracle n'est pas vraiment pour les particuliers.


    Pour en revenir au cas qui nous intéresse... utiliser des SET et BIGINT est conceptuellement intéressant, mais juste pour conserver des cargaisons ça me semble bien compliqué. Je crois que la solution 3 est toute indiquée.

    Par contre cela ne permet pas de placer des attributs polymorphiques et tout, il faudra à chaque fois ajouter d'autres tables. Pour ce genre de chose je ne vois effectivement que la sérialisation mais c'est lourd: il faut systématiquement tout récupérer, décoder, puis tout resérialiser pour l'update. D'après mois ça ramène à l'option trois qui est le standard avec les BDD.

    Idée en passant: pour les attributs simples et optionnels (si c'est du fixe autant les mettre directement dans la tables des vaisseaux), utiliser une table attribut du genre (id_vaisseau, enum_type_attribut, valeur). Voire mettre deux valeurs. Par contre ça ne me semble pas très adapté pour la cargaison qui doit être systématique, assez importante pour avoir sa table, et est une liste.

    Citation Envoyé par ulysse_31
    Quant a moi je continue de chercher (sqlite etc .. ) ma base de données gratuite miracle
    MySQL 5 est très bien, c'est juste que c'est une base de données relationnelle, ce qui suppose quelques contraintes, ie faire un brin de modélisation. Il n'y a pas de BDD miracle, et encore moins gratuite... enfin si quelqu'un a je suis preneur

  6. #6
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 81
    Par défaut
    Bien bien

    Je m'en va pour quelques essais de serialisation mais je pense quand meme que je vais rester sur la methode 3 ( bien eclater les tables , des identifiants partout et sans serialisation )

    Je reviendrai avec d'autres questions plus precises si besoin s'en fait sentir ... Dans un autre thread

    Sujet résolu

    Merci a vous pour ce debut de reponse.
    Merci pour la qualité de ce forum et des intervenants.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur sur CREATE TABLE avec champ boolean
    Par codial dans le forum Bases de données
    Réponses: 1
    Dernier message: 23/03/2007, 18h30
  2. [MySQL] Requete sur 2 tables avec champs commun
    Par marcd dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 20/04/2006, 16h14
  3. [VBA] : Pb Create Table avec Champs Oui/Non
    Par GuidoBrasletti dans le forum Access
    Réponses: 8
    Dernier message: 15/03/2006, 19h11
  4. Table avec champ calule
    Par Treuze dans le forum Access
    Réponses: 2
    Dernier message: 11/01/2006, 16h06
  5. Réponses: 2
    Dernier message: 27/10/2005, 19h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo