Les clés étrangères sont des copies de clé primaire qui vont symbolisé la relation entre deux tables.

Relations

Dans le modèle logique des données, il n’y a pas de cardinalité de N à N, nous aborderons ce sujet avec plus de détails dans le chapitre sur les tables intermédiaires.

Donc nous aurons toujours des relations de 1 (ou 0) à N.

Prenons deux tables bien connues:

Dans le MLD, les relations se simplifie pour ne laisser que la ligne entre les deux tables.

Certains aiment bien garder une trace de la relation sur forme d’un petit texte, mais personnellement je ne le fais que très rarement (lorsque la relation n’est pas du tout claire, et même dans ce cas, on peut toujours faire référence au MCD pour clarifier).

Création de la clé étrangère

On a ici deux tables, une table Personne et une table Localite.

Dans une base de données, les relations sont toujours “mère-fille”. La “mère” sera la table qui contiendra les données. Pour la reconnaître c’est facile c’est celle qui se trouve du coté “N” des cardinalité.

Dans notre exemple c’est la table Localite qui est la table “mère” car elle une cardinalité 1, N avec la table Personne.

Et donc la table “fille” est la table Personne.

La “mère” va transmettre une copie de sa clé primaire à sa fille, c’est cette clé qu’on appellera clé étrangère.

Le champ qui en résultera sera noté avec un # devant pour qu’on sache que c’est une clé étrangère 1

Par convention, la clé étrangère peut s’abréger en FK (Primary Key) ou XID (le X est our Xeno (étrangé en grecque) et le ID est pour Identifier). J’ai une petite préférence pour XID mais c’est personnel, libre à vous de choisir FK. On retrouvera souvent cette abréviation dans le nom des champs qui sont des clés étrangères.

La clé étrangère garantit l’intégrité référentielle entre deux tables. Ce qui veut dire qu’il ne peut exister de valeur dans le champ localite_xid de Personne si il n’y a pas au préalable une valeur correspondant dans localite_id de Localite.

Si on imagine les données dans nos tables

Table Localite

localite_idnomcode postal
1Schaerbeek1030
2Bruxelles1000
3Wavre1300

Table Personne

personne_idnomprenomruenumérolocalite_xid
1LenoirNicolerue Gaucheret88-901
2StassinThomasrue d’Alost7-112
3TeslaNikolaboulevard Simon Bolivar362
4SmartSamrue des brasseries123
5CarterSamantaavenue du chevron76
La dernière ligne ne pourrait pas exister car le champ localite_xid contient une donnée qui n’a pas d’équivalent dans le champ localite_id de la table Personne.

Cette impossibilité d’exister est ce qu’on appelle une contrainte d’intégrité et elle est garantie par l’existence de la clé étrangère.

Footnotes

  1. le # ne fait pas partie du nom de l’attribut c’est juste un moyen visuel de repérer les clés étrangères.