157 votes

Est-il possible d'avoir une clé étrangère comme clé primaire ?

J'ai deux tableaux :

  • Utilisateur (nom d'utilisateur, mot de passe)
  • Profil (profileId, sexe, date de naissance, ...)

Actuellement, j'utilise l'approche suivante : chaque enregistrement de profil possède un champ appelé "userId" sous la forme suivante clé étrangère qui renvoie au tableau des utilisateurs. Lorsqu'un utilisateur s'inscrit, son enregistrement de profil est automatiquement créé.

Je ne comprends pas bien la suggestion de mon ami : faire en sorte que le champ "userId" soit le champ étranger y primaire et supprimez le champ "profileId". Quelle est la meilleure approche ?

201voto

Robert Harvey Points 103562

Les clés étrangères sont presque toujours "Autoriser les doublons", ce qui les rend inadaptées en tant que clés primaires.

Au lieu de cela, trouvez un champ qui identifie de manière unique chaque enregistrement de la table, ou ajoutez un nouveau champ (soit un nombre entier auto-incrémenté, soit un GUID) qui servira de clé primaire.

La seule exception à cette règle concerne les tables ayant un un à un où le étranger et primaire de la table liée sont identiques.

63voto

kotekzot Points 388

Les clés primaires doivent toujours être uniques, les clés étrangères doivent permettre des valeurs non uniques si la table est une relation de type "un à plusieurs". Il est tout à fait possible d'utiliser une clé étrangère comme clé primaire si la table est reliée par une relation univoque, mais pas par une relation univoque. Si vous voulez que le même enregistrement d'utilisateur ait la possibilité d'avoir plus d'un enregistrement de profil lié, utilisez une clé primaire distincte, sinon tenez-vous en à ce que vous avez.

22voto

Oui, il est légal qu'une clé primaire soit une clé étrangère. Il s'agit d'une construction rare, mais elle s'applique pour :

  • une relation 1:1. Les deux tables ne peuvent pas être fusionnées en une seule en raison de permissions différentes et les privilèges ne s'appliquent qu'au niveau de la table (en 2017, une telle base de données serait étrange).

  • une relation 1:0..1. Le profil peut exister ou non, en fonction du type d'utilisateur.

  • les performances posent problème et la conception agit comme une partition : la table des profils est rarement consultée, elle est hébergée sur un disque distinct ou sa politique de partage est différente de celle de la table des utilisateurs. Cela n'aurait pas de sens si le stockage sous-jacent était en colonnes.

8voto

Riaj Ferdous Points 843

Oui, une clé étrangère peut être une clé primaire dans le cas d'une relation univoque entre ces tables.

3voto

Tshsmith Points 108

Il est généralement considéré comme une mauvaise pratique d'avoir une relation individuelle. En effet, les données pourraient être représentées dans une seule table et le résultat serait le même.

Toutefois, dans certains cas, il se peut que vous ne puissiez pas apporter ces modifications à la table à laquelle vous faites référence. Dans ce cas, il n'y a aucun problème à utiliser la clé étrangère comme clé primaire. Il peut être utile d'avoir une clé composite composée d'une clé primaire unique à incrémentation automatique et de la clé étrangère.

Je travaille actuellement sur un système où les utilisateurs peuvent se connecter et générer un code d'enregistrement à utiliser avec une application. Pour des raisons que je n'expliquerai pas, je ne peux pas simplement ajouter les colonnes nécessaires à la table des utilisateurs. Je suis donc en train de suivre une voie individuelle avec la table des codes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X