Votre cas ressemble à une instance de classe/sous-classe.
Il existe deux manières classiques de concevoir des tables SQL pour gérer les sous-classes. Chacun a ses avantages et ses inconvénients.
L'une d'entre elles s'appelle "l'héritage de table unique". Dans cette conception, il n'y a qu'une seule table pour tous les types d'utilisateurs. Si une colonne donnée ne se rapporte pas à une ligne donnée, l'intersection est laissée NULL. Une colonne peut être ajoutée pour indiquer le type d'utilisateur.
Une autre méthode s'appelle "l'héritage de la table de classe". Cela ressemble beaucoup à la réponse donnée par Nanego, avec quelques modifications mineures. Il y a une table pour les utilisateurs, avec toutes les données communes, et un champ id. Il y a un tableau pour chaque sous-classe, avec des données qui se rapportent à cette sous-classe. Le champ id est souvent configuré comme une copie du champ id dans la ligne correspondante dans la table des utilisateurs. De cette façon, la clé de sous-classe peut faire double emploi, agissant à la fois comme clé primaire et comme clé étrangère référençant la table utilisateur. Cette dernière technique est appelée "Clé Primaire Partagée". Cela nécessite un peu de programmation au moment de l'insertion, mais cela en vaut la peine. Il renforce la nature un à un de la relation et accélère les jointures nécessaires.
Vous pouvez rechercher ces trois conceptions sous forme de balises dans SO ou sous forme d'articles sur le Web.
héritage de table unique class-table-inheritance shared-primary-key