Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/11/2006, 23h29   #1
Membre à l'essai
 
Inscription : novembre 2006
Messages : 62
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 62
Points : 23
Points : 23
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é
ulysse_31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2006, 11h32   #2
Membre Expert
 
Avatar de Sivrît
 
Inscription : février 2006
Messages : 953
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2006
Messages : 953
Points : 1 189
Points : 1 189
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.
Sivrît est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2006, 02h57   #3
Membre à l'essai
 
Inscription : novembre 2006
Messages : 62
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 62
Points : 23
Points : 23
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

ulysse_31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2006, 08h53   #4
Membre Expert
 
Avatar de Alexandre T
 
Inscription : mai 2002
Messages : 1 022
Détails du profil
Informations personnelles :
Âge : 35
Localisation : France, Meurthe et Moselle (Lorraine)

Informations forums :
Inscription : mai 2002
Messages : 1 022
Points : 1 123
Points : 1 123
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 :
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 :
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 T.

PHP5/MySQL5 Codes prêts à l'emploi
30 projets avec codes sources complets pour créer diaporamas photos, chat, arbre généalogique, statistiques de visites, création de graphiques, moteur de recherche, Sudoku etc...

Mes articles
Alexandre T est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2006, 10h26   #5
Membre Expert
 
Avatar de Sivrît
 
Inscription : février 2006
Messages : 953
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2006
Messages : 953
Points : 1 189
Points : 1 189
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
Sivrît est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2006, 22h02   #6
Membre à l'essai
 
Inscription : novembre 2006
Messages : 62
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 62
Points : 23
Points : 23
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.
ulysse_31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h04.


 
 
 
 
Partenaires

Hébergement Web