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.