Aide - Recherche - Membres - Calendrier
Version complète : [résolu] :  Relation entre 2 tables d'une BD ?
Forum Développeur - Administration serveur, programmation et base de données > Programmation > PHP
cinesia
Dans phpMyAdmin quand on se trouve dans l'affichage d'une table, en bas il y a un bouton "gestion des relation". Si on clique dessus on tombe sur un grand tableau avec tous les champs de la table en question et pour chaque champ se trouve à côté une liste déroulante indiquant vers quelle autre table de la base de donnée (vers quelle autre PRIMARY KEY en faite) on peut créer une relation.

Ma question est : à quoi ça sert ??

Je vais avoir 2 tables dans ma BD : un table "films" et une table "critiques", avec comme Primary Key "id_film" et "id_critique"
Sur les "pages film" de mon site pour extraire la critique correspondant au film je ferai dans mon code php en sorte que on prend le id_film et on cherche dans la table critique quelle critique a le même id que le film ! (car le id_critique est en faite le même que id_film)

en pensant comme ça je n'ai pas besoin de faire quoique ce soit d'autre dans la structure de ma BD à part définir les 2 tables.

J'aimerai en faite savoir si je passe à côté de quelque chose de plus simple pour faire la relation critique/film ?

Merci d'avance icon_smile.gif
thegwil
Bonjour !

Selon moi, les deux questions que tu dois impérativement te poser sont : suis-je bien certain que l'id du film sera toujours bien identique à l'id de la critique ? et n'y aura-t-il jamais qu'une et une seule critique par film ?

Si les réponses à ces deux questions sont oui, alors effectivement, tu ne dois pas t'occuper des relations entre tes deux tables.
Par contre, si au moins une réponse est non, alors il va falloir y penser sérieusement.

Et par prudence, personnellement, je considérerais d'avance qu'au moins une réponse sera non.

Bàt
thegwil
Je rajouterais même que si les deux réponses sont TOUJOURS oui, il n'y a vraiment aucune utilité à ce que tu aies une table "critiques".
cinesia
Alors en effet il y aura plusieurs critiques par film (dans ma table film il y a plusieurs champs de type LONGTEXT - ces champs sont simplement les noms de nos journalistes) et dans chaque champ on met la critique du journaliste.

La table critique :

Code
CREATE TABLE `reviews` (
 `id_review` int(4) NOT NULL default '0',
 `journaliste1` longtext NOT NULL,
 `journaliste2` longtext NOT NULL,
 `journaliste3` longtext NOT NULL,
 `journaliste4` longtext NOT NULL,
 PRIMARY KEY  (`id_review`)
);


Et je ne vois pas de raisons pour qu'il y ai une erreur dans la correspondance id_critique / id_film !? A chaque ajout de critique l'id_critique prendra la valeur de l'id_film qu'on a choisi.

Tu dis donc que si j'ai plusieurs critiques par film, je vais devoir faire des relation entres la table films et la table critiques !? Je ne vois toujours pas comment utiliser cette histoire de relation icon_confused.gif ?
thegwil
A bien y réfléchir je ne comprends pas trop bien la structure de ta bdd.
Tu dis que dans ta table films, il y a quatre champs destinés à recueillir chacun la critique d'un de vos 4 journalistes.
Puis tu montres une table critiques avec les 4 mêmes champs.
Il y a qqch de trop, je pense

Pour moi, soit tu laisses tes quatres champs dans ta table films et tu n'as alors pas besoin de table critiques ; soit tu supprimes les 4 champs de ta table films et dès ce moment la table critiques prend tout son sens. Mais je la concevrais différemment :

Sql
CREATE TABLE `reviews` (
`id_review` INT( 4 ) UNSIGNED NOT NULL AUTO_INCREMENT ,
`id_film` INT( 4 ) UNSIGNED NOT NULL ,
`review` TEXT NOT NULL ,
`author` VARCHAR( 100 ) NOT NULL ,
PRIMARY KEY ( `id_review` )
);


Et j'établirais une relation 1-n entre la table films et la table critiques, signifiant que un film peut avoir plusieurs critiques mais qu'une critique ne se rattache qu'à un et un seul film.
cinesia
Non ! sur chaque ligne de la table il y a plusieur critiques.

Prennons un exemple avec id_critique = 3 :

dans la table critique sous la ligne correspondant à l'id_critique 3 on trouvera la critique du journaliste 1, du journaliste 2, 3 et 4 du film dont l'id_film = 3

--------

J'ai vu comment tu vois la chose et je suis aussi d'accord mais je ne vois toujours pas à quoi sert la relation 1-N (je comprend le principe de cardinalité) comment cette méthode est-elle sensé me facilité les choses. Dans le concret, dans le code php de mes pages ça change quoi ??
thegwil
cinesia (Jul 17 2005, 12:07 PM) a dit :
comment cette méthode est-elle sensé me facilité les choses. Dans le concret, dans le code php de mes pages ça change quoi ??
*


Cette méthode n'est pas censée te faciliter les choses mais elle reste la plus logique.
Maintenant, il est vrai que tu pourrais très bien laisser ta table critiques telle qu'elle est.

Quant au code php, ça change pas grand-chose. C'est du côté de tes requêtes sql que ce sera légèrement différent.
cinesia
donc sa sert pas à grand chose dans mon cas puisque je ne fait que rajouté et extraire des donnée de la BD. Je ne fais même pas de suppression (si j'en fait c'est manuellement via phpMyAdmin).

j'hésite par contre entre les 2 façon d'organiser et faire la table critique :

cette méthode où je n'ai cas rajouter un colonne (journaliste 5,6 etc) si je veux rajouté un journaliste :
Code
CREATE TABLE `reviews` (
`id_review` int(4) NOT NULL default '0',
`journaliste1` longtext NOT NULL,
`journaliste2` longtext NOT NULL,
`journaliste3` longtext NOT NULL,
`journaliste4` longtext NOT NULL,
PRIMARY KEY  (`id_review`)
);


ou cette méthode, fondamentallement plus simple mais ce qui m'embête c'est qu'il y aura plusieur "lignes" pour un même film. J'aimais bien l'idée d'une ligne pour 1 même film dans laquelle se trouve toutes les critiques de ce film.

Code
CREATE TABLE `reviews` (
`id_review` INT( 4 ) UNSIGNED NOT NULL AUTO_INCREMENT ,
`id_film` INT( 4 ) UNSIGNED NOT NULL ,
`review` TEXT NOT NULL ,
`author` VARCHAR( 100 ) NOT NULL ,
PRIMARY KEY ( `id_review` )
);
thegwil
Si tu utilises ta première méthode, cela sous-entend que d'une part, dès que tu ajoutes un nouveau film, il faut qu'au moins un journaliste écrive sa critique simultanément faute de quoi l'id de la critique ne sera plus identique à l'id du film et ta requête sera donc foireuse ; d'autre part, tu es obligé d'intervenir sur ta table pour ajouter un nouveau journaliste.

Dans la 2e méthode, il n'est plus du tout question de ça ; la critique d'un film peut être ajoutée n'importe quand et autant de personnes qui le souhaitent peuvent ajouter une critique sans que tu doives chaque fois rajouter un champ correspondant à lanouvelle personne qui souhaiterait critiquer le film.
C'est quand même bcp plus souple non ? Et surtout, j'insiste, plus logique.
cinesia
ta raison je prend ta méthode !!

(comment met-on [résolu] dans le titre de ce message ?)
Antoine
C'est nous, modo qui décidons quand on mets résolu wink.gif
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2009 Invision Power Services, Inc.