• 20 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 11/07/2019

Utilisez les tables d'association

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Réfléchissons...

Nous avons créé un lien entre pomme et variété à l'aide d'une clé étrangère.

Cela fonctionne plutôt bien, car une pomme n'a qu'une seule variété. Mais que se passerait-il si, dans un monde imaginaire, une pomme pouvait avoir plusieurs variétés ?

C'est un peu bizarre ton truc là ! :'(

C'est vrai. Oublions la variété, et prenons un meilleur exemple.

Disons qu'une pomme peut être mangée par quelqu'un. Du coup, j'introduis ici une table personne, qui contient des gens susceptibles de manger des pommes.

Une personne peut manger plusieurs pommes, mais plusieurs personnes peuvent se partager une même pomme (s'ils n'ont pas très faim, ou si la pomme est très grosse !).

Dans la table pomme, mettons une colonne mangé_par  qui est une clé étrangère vers la table personne.

Clé étrangère de Pomme vers Personne
Clé étrangère de Pomme vers Personne

Mais si la pomme est mangée par 2 personnes, que fait-on ?

On pourrait mettre 2 colonnes dans pomme : mangé_par_1, et mangé_par_2. Elles seraient toutes deux clés étrangères vers personne.

Mais si la pomme est mangée par plus de deux personnes, combien de colonnes doit-on mettre ? Doit-on en prévoir 1000, au cas où ?

Malheureusement, ce raisonnement est plutôt mauvais. En effet, une table avec plus de 1000 colonnes, c'est volumineux, et pas très pratique à manipuler. De plus, nous ne pouvons pas être certains qu'un jour, nous n'aurons pas besoin d'ajouter une 1001ième clé étrangère.

Bon. Et si on essayait autre chose. Plutôt que de mettre une clé étrangère de pomme vers personne, pourquoi ne pas en mettre une de personne vers pomme ?

Pourquoi pas, cela donnerait cela :

Clé étrangère de Personne vers Pomme
Clé étrangère de Personne vers Pomme

On voit qu'une pomme peut être mangée par plusieurs personnes.

Mais... :'( Inverser le sens de la clé étrangère n'a fait qu'inverser le problème ! Certes, une pomme peut être mangée par plusieurs personnes, mais avec notre nouveau modèle, une personne ne peut plus manger qu'une seule pomme !

Or dans la réalité, une seule personne a le droit de manger plusieurs pommes, non ?

La solution à notre problème est de créer une troisième table, que l'on appelle parfois table d'association, ou table de composition, ou bien d'un tout autre nom si vous en avez envie (pourquoi pas "mange" dans notre cas) !

La table d'association pour une cardinalité plusieurs-à-plusieurs

La table d'association est utilisée dans le cadre d'une cardinalité plusieurs-à-plusieurs entre deux objets. Elle est composée d'au moins 2 clés étrangères, référençant chacune l'un des 2 objets.

Voici un exemple dans le cas d'une pomme pouvant être mangée par plusieurs personnes, où chacune de ces personnes peut également manger plusieurs pommes différentes :

Table d'association
Table d'association

On remarque ici que Jeanne mange à la fois la pomme 1 et la pomme 2, mais que la pomme 2 est également mangée par Thanh !

Aller plus loin : Quelle clé primaire pour une table d'association ?

La clé primaire d'une telle table est composée au moins des 2 clés étrangères. Mais il est parfois nécessaire d'ajouter des colonnes supplémentaires à la clé.

Par exemple, si nous avions ajouté la notion de date dans notre table d'association, on pourrait dire "Heri a mangé la pomme 2 le 21 avril". Mais il aurait également pu manger la même pomme à une autre date (s'il ne l'a pas mangée en entier le 21 avril, il peut la finir le 22 avril). Ainsi, la clé primaire aurait été[pomme, date, personne].

Table d'association avec une PK de 3 colonnes
Table d'association avec une PK de 3 colonnes

Aller plus loin : modéliser les différents types de cardinalités

Si vous souhaitez mieux comprendre, ou mieux formaliser le concept de cardinalité et son implémentation, je vous invite à jeter un coup d’œil au chapitre Mettez en œuvre les différents types de relations à l'aide des clés étrangères du cours Faites une base de données avec UML.

En résumé

  • Se poser la question "Combien de pommes peut manger une personne, et par combien de personnes peut être mangée une pomme", c'est se poser la question de la cardinalité.

  • Pour une cardinalité plusieurs-à-plusieurs, on doit introduire une table d'association.

  • Une table d'association contient au moins deux clés étrangères vers les 2 objets qu'elle lie.

Exemple de certificat de réussite
Exemple de certificat de réussite