web-dev-qa-db-fra.com

Types d'utilisateurs multiples - Conseils de conception de DB

Je développe une application Web qui prendra en charge l'authentification de l'utilisateur avec des rôles correspondants pour chaque utilisateur. En outre, mes utilisateurs peuvent être de types différents et avoir des champs différents associés à eux. Certains des champs que chaque utilisateur sera le même, comme dans:

email, password, first_name, last_name, etc.

Mais certains des champs pour différents types d'utilisateurs seront différents. Par exemple:

User Type: Instructor
Fields unique to this type of user
----------------------------------
hourly_rate, tax_status

==================================

User Type: Student   
Fields unique to this type of user
----------------------------------
instrument, monthly_charge, program

==================================

User Type: Employee
Fields unique to this type of user
----------------------------------
hourly_rate, location

Il s'agit d'un bref exemple des types de champs pouvant être similaires et uniques entre ces types d'utilisateurs.

Les configurations possibles que j'ai pensées sont:

Table: `users`; contains all similar fields as well as a `user_type_id` column (a foreign key on `id` in `user_types`
Table: `user_types`; contains an `id` and a `type` (Student, Instructor, etc.)
Table: `students`; contains fields only related to students as well as a `user_id` column (a foreign key of `id` on `users`)
Table: `instructors`; contains fields only related to instructors as well as a `user_id` column (a foreign key of `id` on `users`)
etc. for all `user_types`

ou alors:

Table: `users`; contains all possible columns for all users and allow columns that could be filled for one user type but not another to be NULL

Ma question : est l'une de ces réponses une meilleure approche sur l'autre ou est à la fois terrible et je devrais regarder autre chose?

8
tptcat

Je conseillerais 1er une meilleure approche, ce qui est

 Table: "Utilisateurs"; contient tous les champs similaires ainsi qu'une colonne `user_type_id` (une clé étrangère sur` id` in` user_types` 
 Table: `user_types`; contient un` id` et un `type` (étudiant, instructeur, etc.) 
 Table: `Étudiants`; contient des champs uniquement liés aux étudiants ainsi qu'à une colonne` user_id` (une clé étrangère de "id" sur `utilisateurs") 
 Table: `Instructeurs `; contient des champs uniquement liés aux instructeurs ainsi qu'à une colonne` user_id` (une clé étrangère de `id` sur` utilisateurs`) 
, etc.] pour tous `user_types` [.____]

Raison:-

Les données relatives aux utilisateurs telles que les colonnes des étudiants, des instructeurs, etc. Les tables peuvent augmenter à l'avenir afin qu'il soit facile de gérer avec la 1ère approche.

et choisir les autres options pour créer une table avec trop de numéros de colonnes qui ne seraient pas bonnes en termes de gestion de la base de données future et d'un nombre croissant de colonnes à l'avenir, il sera plus problématique.

9
vijayp