plobeme de "réflexion" pour la structure d'une base de données

plobeme de "réflexion" pour la structure d'une base de données - SQL/NoSQL - Programmation

Marsh Posté le 24-05-2006 à 14:56:45    

Bonjour,
 
Je suis débutant en création et utilisation de base de donnée et j'ai un probleme de "réflexion" et non pas un probleme technique pour la création de ma base.
 
Je suis en train de créer un site qui permet de créer sa liste perso de films.
Le principe est que l'intenaute (que nous appelerons ici Mr Duppont) parcours le "catalogue" comprenant tous les films et lorsqu'ils tombe sur un film qu'il posséde (exemple matrix) , il clique sur un lien qui indique à la base de donné que Mr Duppont possede Matrix.
 
Pour infos je possede deja 2 tables et j'utilise MySQL :  
1. la table "film" qui comporte plusieurs champs : titre du films, année , duréee, acteurs, resumé ...
2.La table "membres" qui comporte 3 champs : pseudo, mot de passe, et e-mail.

 
Mon probleme est que je ne sais pas quelle "structure" il faut utiliser .
 
J'ai pensé à 2 solutions :  
 
1. soit l'orsque Mr duppont s'insrcrit on créer une table que l'on appelle "liste_perso_Duppont" , et à chaque fois que Mr Duppont ajoute un film à sa liste et bien on ajoute une entrée à la table "liste_perso_Duppont" comprenant le titre du film ajouté.
Cela voudrait dire qu'il faut créer autant de tables que de membres et je ne sait pas si une base de données et limité en nombre de table.
 
2. soit lorsque Mr Duppont ajoute un film à sa liste on indique dans la table "film" au niveau de l'entree "matrix" dans un champs supplémentaire, que monsieur duppont possede ce film.
 
soit on fait autrement mais je ne vois pas ...
 
d'avance merci.


---------------
Mon site...
Reply

Marsh Posté le 24-05-2006 à 14:56:45   

Reply

Marsh Posté le 24-05-2006 à 15:00:13    

non, tu crées une table de liaison qui va associé la liste des films aux membres : film_membre (film_id,membre_id)
 
Tu auras donc :
Dupont Matrix
Dupont Matrix 2
Durand Matrix
Martin Matrix2
 
c'est la manière de modéliser une relation N-N ;)

Reply

Marsh Posté le 24-05-2006 à 15:11:02    

ok, merci pour cette réponse ultra rapide.
Je vais me pencher là dessus , mais effectivement çà à l'air d'être exactement ce dont j'avais besoin.
Merci encore.


---------------
Mon site...
Reply

Marsh Posté le 24-05-2006 à 18:36:30    

arkentiel a écrit :

Cela voudrait dire qu'il faut créer autant de tables que de membres et je ne sait pas si une base de données et limité en nombre de table.


 
Une base n'est pas vraiment limité en nb de tables (elle doit accepter sans pb 32767 tables) mais le pb, c'est que tu n'arrives pas encore à faire le distinguo entre

  • l'organisation des données
  • la valeur des données


Une table est faite pour contenir des données de même type. Exemple: la table "acteur" contiendra tous les acteurs de ta base. Et la table "membres" contiendra tous les membres de ta bdd.
Ensuite, le contenu de "acteurs" importe peu dans la conception. Qu'il y ait "Nicolas Cage" ou "Sean Connery" n'entre pas en ligne de compte pour toi.
 
Ensuite, arrive le pb de la redondance et des liens entre les informations. Comment séparer les tables pour réduire la recopie d'infos tout en gardant la cohérence des infos liées entre elles
Exemple: Tu veux stocker tes films, leur genre et l'acteur principal. Tu crées alors une table "films" contenant
- nom du film
- genre du film
- acteur principal
Mais tu vas te retrouver avec un max d'infos redondantes. Exemple, pour "Moonraker" et "Octopussy", tu auras les infos suivantes
Moonraker - Roger Moore - Espionnage
Octopussy - Roger Moore - Espionnage
Tu vois le pb des infos recopiées inutilement; ce pb va se retrouver dès que tu voudras remplacer (pour raison de commodité) le libellé "Roger moore" par "Moore Roger" => tu seras obligé de parcourir toute ta table et modifier "x" lignes.
 
Pour résoudre ce pb, on découpe les tables par rapport aux cardinalités des éléments. Ici, pour un film, tu as un genre et un acteur principal mais pour un genre ou un acteur, tu as "x" films. Donc tu crées 3 tables

  • genre qui contiendra

- libellé
- identifiant
Ex: Espionnage - 1
 

  • acteurs qui contiendra

- nom
- identifiant
Ex: Roger Moore - 1
 

  • films qui contiendra

- titre
- identifiant_acteur
- identifant_genre
Ex:
Octopussy - 1 - 1
Moonraker - 1 - 1
 
Grace au SQL, tu peux aller chercher dans différentes tables les libellés correspondants aux identifiants de chaque film et les afficher quand t'en as besoin.
Ensuite, si tu veux modifier "Roger Moore" en "Moore Roger", tu n'as qu'une seule modif à faire.
 
Ce pb d'organisation de bdd a été développé dans une méthode appelé "Merise". Cette méthode t'aide à identifier les infos et les liens qui vont entre elles pour créer une bdd avec le moins de redondance possible.

Message cité 1 fois
Message édité par Sve@r le 24-05-2006 à 19:03:41

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 24-05-2006 à 19:00:07    

Sve@r a écrit :

Ce pb d'organisation de bdd a été développé dans une méthode appelé "Merise". Cette méthode t'aide à identifier les infos et les liens qui vont entre elles pour créer une bdd avec le moins de redondance possible


 
Y'a une autre méthode appellée "deux sous de jugeotte" assez efficace aussi ;)


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 24-05-2006 à 19:11:40    

0x90 a écrit :

Y'a une autre méthode appellée "deux sous de jugeotte" assez efficace aussi ;)


 
Evidemment, avec mes 3 pauvres tables mises à titre d'exemple, Merise ne s'impose vraiment pas. Mais quand on commence à vouloir gérer des trucs comme les impôts, les assédics ou la sécu, il vaut mieux commencer par bien établir les cardinalités des éléments et concevoir une bdd solide parce que "2 sous de jugeotte" ce n'est pas suffisant. Quoi que, quand je vois le bordel de ces 3 organisations, je pense qu'ils n'ont appliqué ni Merise, ni "2 sous de jugeotte". Ptet qu'ils ont essayé la méthode "jetons nos tables au pif et voyons le résultat"... :sol:


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 24-05-2006 à 21:50:51    

Sve@r a écrit :

Evidemment, avec mes 3 pauvres tables mises à titre d'exemple, Merise ne s'impose vraiment pas. Mais quand on commence à vouloir gérer des trucs comme les impôts, les assédics ou la sécu, il vaut mieux commencer par bien établir les cardinalités des éléments et concevoir une bdd solide parce que "2 sous de jugeotte" ce n'est pas suffisant. Quoi que, quand je vois le bordel de ces 3 organisations, je pense qu'ils n'ont appliqué ni Merise, ni "2 sous de jugeotte". Ptet qu'ils ont essayé la méthode "jetons nos tables au pif et voyons le résultat"... :sol:


 
Ouais pour du gros je veut bien, je parlais du cas présent ;) Encore que de ce que j'ai appris de Merise, j'ose espérer qu'on a trouvé mieux depuis ...


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 25-05-2006 à 13:55:45    

Sve@r  > Merci beaucoup pour ton explication détaillé qui m'a vraiment eclaircit mon esprit...


---------------
Mon site...
Reply

Marsh Posté le 25-05-2006 à 18:32:54    

arkentiel a écrit :

Sve@r  > Merci beaucoup pour ton explication détaillé qui m'a vraiment eclaircit mon esprit...


 
Une fois qu'on a les bonnes cardinalités, on crée la base selon les règles suivantes

  • table1 (1,1) <-> table2 (0,n)

Ca veut dire que pour un élément de "table1", on a de 0 à n éléments correspondants à "table2", mais pour un élément de "table2", on n'a qu'un élément de "table1"
On crée "table2" et on y insère l'identifiant de "table1"
Exemple
pour un genre (table1) -> on a plusieurs films (table2)
pour un film(table2) -> on n'a qu'un genre (table1)
On insère dans la table "films" (table2) l'identifiant de "genre" (table1)
Ca donne
[genre]
1 - Action
2 - SF
 
[films]
MI3 - 1
Star Wars - 2
 

  • table1 (0,n) <-> table2 (0,n)

Ca veut dire que pour un élément de "table1", on a de 0 à n éléments correspondants à "table2", et pour un élément de "table2", on a aussi de à à n éléments correspondants à "table1"
On crée une 3° table "table3" et on y insère les identifiants de "table1" et "table2"
Exemple
pour un acteur (table1) -> on a plusieurs films (table2)
pour un film (table2) -> on a plusieurs acteurs (table1)
On crée la table "jouer" (en général, ces tables de liaison portent souvent un nom de verbe) contenant "identifiant film, identifiant acteur"
Ca donne
[Acteur]
1 - Audrey Tautou
2 - Tom hanks
3 - Tom Cruise
 
[Films]
1 - MI3
2 - Da Vinci Code
3 - Top Gun
 
[Jouer (identifiant film, identifiant acteur)]
1 - 3
2 - 1
2 - 2
3 - 3


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 26-05-2006 à 14:55:31    

@ Sve@ar : personnellement, tu ne m'apprends rien, mais si les enseignants/intervenants/professionnels pouvaient s'inspirer de tes méthodes d'enseignement (je crois que le mot n'est pas trop fort), bon nombre d'étudiants comprendraient en deux temps trois mouvements ce que ces premiers s'obstinent à expliquer pendant des jours et des jours
...
 
Bref, concernant la Sécu, je suis actuellement en stage chez eux, et l'appli' que je développe m'a nécessité un mois d'analyse. BDD assez importante à vrai dire. ;)

Reply

Marsh Posté le 26-05-2006 à 14:55:31   

Reply

Marsh Posté le 26-05-2006 à 18:08:37    

Fiiies1 a écrit :

@ Sve@ar : personnellement, tu ne m'apprends rien, mais si les enseignants/intervenants/professionnels pouvaient s'inspirer de tes méthodes d'enseignement (je crois que le mot n'est pas trop fort), bon nombre d'étudiants comprendraient en deux temps trois mouvements ce que ces premiers s'obstinent à expliquer pendant des jours et des jours
...
 
Bref, concernant la Sécu, je suis actuellement en stage chez eux, et l'appli' que je développe m'a nécessité un mois d'analyse. BDD assez importante à vrai dire. ;)


+1
 
Merci encore Sve@ar de cette explication vraiment ... explicite . :D  
Je n'ais encore eu le temps de l'appliquer à mon site mais si j'ai un probleme je repasserais par ici ... :p  
Bon week-end. :hello:


---------------
Mon site...
Reply

Marsh Posté le 26-05-2006 à 18:46:35    

Fiiies1 a écrit :

@ Sve@ar : personnellement, tu ne m'apprends rien, mais si les enseignants/intervenants/professionnels pouvaient s'inspirer de tes méthodes d'enseignement (je crois que le mot n'est pas trop fort), bon nombre d'étudiants comprendraient en deux temps trois mouvements ce que ces premiers s'obstinent à expliquer pendant des jours et des jours

 
:love:  
Euh... j'ai pas tellement de méthode. Et pis la règle décrite ci-dessus est une règle de Merise, pas de moi.
Et pis il y a un monde énorme entre un exemple théorique à 3 balles (non 3 tables) et une analyse complète d'un pb pour créer la bdd correspondante. Je me souviens encore d'exercices sur des sujets comme "gestion vidéo-club" où je me prenais la tête entre les clients à carte, les clients sans carte, les promos du WE et toussa quoi...
 
Mais c'est vrai que j'ai enseigné Unix et C pendant 4 ans et que j'ai adoré faire de l'enseignement (j'enseigne d'ailleurs encore Unix en tant que "vacataire" 3 x 3 jours/an)


Message édité par Sve@r le 26-05-2006 à 18:49:04

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 12-06-2006 à 13:50:04    

Bon , j'ai bien compris ce que vous m'avez expliqué et je l'ai appliqué :
 
j'ai donc créer 1 table de liaison entre ma table de films et ma table de membre,
ainsi lorsque le membre ajoute un film à sa liste, un lien se créer dans la table de liaison entre le film et e membre.
 
J'ai un autre soucis  :sweat:  :
 
Je voudrais que les membres puissent ajouter un films eux même à la BDD :
pour cela il devrait remplir un formulaire avec :
 
titre du film
résumé
...
acteurs
 
et c'est là où çà se complique (pour moi) car je voudrais créer (comme çà m'a été coseillé plus haut) une table a part pour les acteurs :
 
ainsi j'aurai 5 tables  :
 
- une table pour les films
- une table pour les membres
- une table pour les acteurs
- une table de liaison entre films et membres
- une table de liaison entre films et acteurs

 
Mon problème et que je ne sais pas comment faire pour que quand un membre veut ajouter un film à la base de données il puisse y associé un (et même plusieurs ) acteur(s).
 
 
quelqu'un aurait il une idée ?  :??:  :??:  
Merci... :)  
 
ensuite quand j'aurais compris le truc je pourrais même créer une table supplémentaire pour chaque genre de film...


---------------
Mon site...
Reply

Marsh Posté le 12-06-2006 à 16:39:16    

"ensuite quand j'aurais compris le truc je pourrais même créer une table supplémentaire pour chaque genre de film..."
 
Ce qui est dit un peu plus haut c'est que ça n'a pas d'intérêt de faire une table par genre de film.
 
Sauf si il faut y stocker des informations qui varient d'un genre a l'autre et que dans un soucis d'économie de place et de structure d'info tu souhaites que ce soit stocké dans des tables différentes. ex:
 
Qualité des effets spéciaux pour les film de SF.  
Respect des aspect historique pour des film d'Histoire. (probablement toujours à blanc pour les films de SF)

Reply

Marsh Posté le 12-06-2006 à 21:52:46    

ok...merci de l'info.
 
As tu une idee pour mon probleme ?


---------------
Mon site...
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed