Bon, je vais essayer de résumer.
Il peut exister des relations entre tables qu'on nomme "cardinalité. Par exemple, supposons une table membre et une table téléphone. Un membre peut avoir
0 à n numéros de téléphone, mais un numéro de téléphone ne correspond qu'à un et un seul membre. On parle dans ce cas à d'une relation
1/1 - 0/n. Donc pour retrouver les numéros d'un membre en particulier, je dois avoir un point de repère devant chaque numéro de téléphone : ce point de repère sera une clé étrangère qui aura la valeur de la clé primaire du membre correspondant.
Maintenant prenons le cas qui nous occupe : nous avons des participants et des clubs. Un club peut compter
0 à n participant, mais au fil du temps, un participant peut changer de club et de ce fait être membre de
1 à n clubs. En pratique, il n'est membre que d'un seul club à la fois, mais si on conserve les archives, il aura plusieurs clubs. On a donc une cardinalité
0/n - 1/n, ce qui pose un problème puisque si je mets la clé primaire participant en clé étrangère dans la table clubs, ça voudrait dire qu'un participant peut être membre de
0 à n club mais dans l'autre sens, un club ne peut avoir qu'un seul participant. À l'inverse, si je mets en clé étrangère dans la table participant la clé primaire d'un club, j'aurai une rlation à sens unique qui n'est pas plus satisfaisante.
La solution consiste donc à avoir une table intermédiaire comportant une clé primaire composite, c'est à dire constituée de plusieurs champs et ici, ce seront les deux clés étrangères, l'une correspondant à la clé primaire club, l'autre la clé primaire participant. Dans cette ralation, je devrais aussi ajouter une clé primaire : l'année parce qu'un participant peut changer de club d'une année sur l'autre... ou ne pas changer auquel cas il me faut un point de repère unique, l'id du club et l'ic du particpant ne changeant pas.
Ça donnerait quelque chose comme ceci:
Code : Tout sélectionner
+------------------------+
| club |
+---------+--------------+
|club_id | club_nom |
+---------+--------------+
| 1 | Les moineaux |
| 2 | Les dragons |
| 3 | Les aigles |
| 4 | Les écureils |
+---------+--------------+
+-------------------+
| participants |
+--------+----------+
|part_id | par_nom |
+--------+----------+
| 1 | Dupond |
| 2 | Durand |
| 3 | Dugenou |
+--------+----------+
+---------------------------------------+
| affilie |
+--------+----------+-------+-----------+
|club_id |part_id | annee | dossard |
+--------+----------+-------+-----------+
| 1 | 1 | 2004 | 115 |
| 2 | 1 | 2005 | 17 |
| 1 | 3 | 2004 | 42 |
| 1 | 3 | 2005 | 42 |
| 4 | 2 | 2005 | 30 |
+--------+----------+-------+-----------+
Partant de ce schéma, tu vas retrouver le club d'un participant en fonction de l'année via la relation "affilie" ou les membres pour un club particulier pour une année définie. Mais tu n'auras aucun doublon nulle part.
Alors je ne garantis pas que ce ce qu'il y a de plus optimal, certains gourous de la modélisation trouveront peut-être à redire, mais l'idée générale est là : est-ce que c'est plus clair comme ça ?