Mysql
 sql >> Base de données >  >> RDS >> Mysql

Une clé étrangère peut-elle faire office de clé primaire ?

Bien sûr. Il s'agit d'une technique courante connue sous le nom de supertypage les tables. Comme dans votre exemple, l'idée est qu'une table contient un sur-ensemble d'entités et a 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 sans rappeler 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 séparément des clés étrangères vers la même autre table. Lorsque la base de données construit la requête, elle rejoint cette autre table deux fois. Pour illustrer dans une requête SQL (je ne suis pas sûr de la syntaxe MySQL, je ne l'ai pas utilisée depuis longtemps, il s'agit donc spécifiquement de la syntaxe MS SQL), vous donneriez à cette table deux alias distincts lors de la sélection des données. Quelque chose comme ça :

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 le student_rec table et la combine avec le user_accounts table deux fois, une fois sur chaque colonne, et attribue deux alias différents lors de leur combinaison afin de les différencier.