2013-07-14 3 views
17

Je suis en train de concevoir une structure de base de données pour le projet de notre équipe. J'ai actuellement cette même question à l'esprit: est-il possible d'avoir une clé étrangère agissant comme une clé primaire sur une autre table?Une clé étrangère peut-elle agir comme une clé primaire?

Voici quelques-unes des tables de notre conception de base de données de système:

user_accounts 
students 
guidance_counselors 

Ce que je voulais arriver est que la table user_accounts doit contenir les ID (soi-disant les de lettres de créance de connexion au système) et les mots de passe à la fois les utilisateurs étudiants et les conseillers d'orientation. En résumé, les clés primaires des tables students et guidance_counselors sont également la clé étrangère de la table user_accounts. Mais je ne suis pas sûr que cela soit autorisé.

Une autre question est: une table student_rec existe aussi, ce qui nécessite un student_number (qui est le user_id dans le tableau user_accounts) et un guidance_counsellor_id (qui est aussi le user_id dans le user_accounts) pour chacun de son dossier. Si les ID d'un étudiant et d'un conseiller d'orientation proviennent tous les deux du user_accounts table, comment devrais-je concevoir la table student_rec? Et pour référence future, comment l'écrire manuellement en tant que code SQL?

Cela m'a dérangé et je ne trouve pas de réponse précise ou sûre à mes questions.

+1

Alors que la réponse à votre question est "oui, une clé primaire peut aussi agir comme une clé étrangère", ma recommandation serait d'éviter cela. La même relation peut être exprimée à l'aide de clés primaires discrètes et de clés étrangères, et le fait de surcharger une colonne avec des responsabilités multiples peut entraîner des difficultés sur la route. Par exemple, si la clé primaire est également une colonne d'identité ou est automatiquement affectée à l'aide d'une stratégie GuidComb via ORM, vous examinerez probablement deux transactions ou plus au lieu d'une. Le principe de la responsabilité unique est également utile pour la conception de bases de données. –

Répondre

21

Bien sûr. C'est une technique courante connue sous le nom de tables supertyping. Comme dans votre exemple, l'idée est qu'une table contient un surensemble d'entités et possède des attributs communs décrivant une entité générale, et d'autres tables contiennent des sous-ensembles de ces entités avec des attributs spécifiques. Ce n'est pas différent d'une simple hiérarchie de classes dans la conception orientée objet. Pour votre deuxième question, une table peut avoir deux colonnes qui sont des clés étrangères distinctes à la même autre table. Lorsque la base de données génère la requête, elle rejoint cette autre table deux fois. Pour illustrer dans une requête SQL (pas sûr de la syntaxe MySQL, je ne l'ai pas utilisé depuis longtemps, donc c'est la syntaxe MS SQL spécifiquement), vous donneriez à cette table deux alias distincts lors de la sélection des données. Quelque chose comme ceci:

SELECT 
    student_accounts.name AS student_name, 
    counselor_accounts.name AS counselor_name 
FROM 
    student_rec 
    INNER JOIN user_accounts AS student_accounts 
     ON student_rec.student_number = student_accounts.user_id 
    INNER JOIN user_accounts AS counselor_accounts 
     ON student_rec.guidance_counselor_id = counselor_accounts.user_id 

Cela prend essentiellement la table student_rec et combine avec la table user_accounts deux fois, une fois sur chaque colonne, et attribue deux alias différents lorsque les combiner de manière à les différencier.

+0

Ceci est juste une situation où un ensemble de colonnes est à la fois FK et PK. Chaque type de clé est défini indépendamment de l'autre. – philipxy

2

Oui, il ne devrait pas y avoir de problème. Les clés étrangères et les clés primaires sont orthogonales les unes aux autres, une colonne ou un ensemble de colonnes peut être à la fois la clé primaire de cette table (qui doit être unique) et être associée à une clé primaire/contrainte unique dans une autre table.

Questions connexes