Quote
seb seb
Une brique peut très bien se retrouver 2 fois dans une même séquence (à un rank différent).
Une brique peut très bien se retrouver dans deux séquences différentes.
Salut, je reviens sur le sujet parce que je viens de réaliser (j'ai mis le temps...) que j'avais omis la seconde de ces deux règles. Et avec cette règle, la relation est donc effectivement n/n et non pas 1/n comme je l'avais compris. Et donc en fin de compte ton premier modèle a plus de sens. Le seul point à modifier dans ce cas est que ta table relationnelle x_has_y n'a pas besoin d'une colonne id : la clé primaire sera composite avec x_id, y_id et rank_y.
Le Modèle devient alors ceci :
Un détail, sur cette image, tu noteras que j'ai utilisé une manière particulière de nommer les tables.
Chaque nom de table est composé :
- d'un préfixe, t pour Table ou r pour table-relationnelle;
- d'un nom (normal et explicite);
- d'un suffixe en trigramme;
Les colonnes ont toutes un préfixe par rapport à leur table de rattachement. Je me sers également des suffixes de tables pour créer le nom des tables relationnelles, ça fait des noms plus courts.
Cette manière de faire présente en outre l'avantage qu'une colonne ne change pas de nom lorsqu'elle est en clé étrangère dans une autre table, ce qui permet de raccourcir la syntaxe des requêtes de jointure : on peut faire du NATURAL JOIN sans devoir préciser les conditions de jointures, MySQL va les trouver automatiquement.
Si une brique n'est rattachée à aucune séquence, la ligne correspondante dans la table relationnelle peut alors tout simplement sauter. Une brique peut être rattacher autant de fois que nécessaire à un même chapitre à la condition impérative toutefois d'avoir une valeur de rank différent, et dans l'autre sens un chapitre peut avoir autant de briques que voulu.
Quant à la requête, elle deviendra alors :
SELECT
m.mod_nom,
c.cha_nom,
s.seq_nom,
b.bri_nom
FROM t_modules_mod m
NATURAL JOIN r_mod_has_cha_rmc rc
NATURAL JOIN t_chapitres_cha c
NATURAL JOIN r_cha_has_seq_rcs rs
NATURAL JOIN t_sequences_seq s
NATURAL JOIN r_seq_has_bri_rcb rb
NATURAL JOIN t_briques_bri b
ORDER BY rc.rmc_rank, rs.rcs_rank, rb.rcb_rank
WHERE m.mod_id = 1;
Voilà, désolé pour mon manque de sens de l'observation sur les précédentes réponses.
______________________________________________________________
Une question bien formulée, c'est un problème bien compris : ça représente déjà les 3/4 de la réponse ;)