web-dev-qa-db-ja.com

複数のユーザータイプ-DB設計のアドバイス

各ユーザーに対応するロールを持つユーザー認証をサポートするWebアプリケーションを開発しています。また、ユーザーはさまざまなタイプで、さまざまなフィールドが関連付けられている場合があります。各ユーザーが持ついくつかのフィールドは、次のように同じになります。

email, password, first_name, last_name, etc.

ただし、ユーザータイプごとに一部のフィールドは異なります。例えば:

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

これは、これらのタイプのユーザー間で類似し、一意である可能性があるフィールドのタイプの簡単な例です。

私が考えた可能な設定は次のとおりです:

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`

または:

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

私の質問:これらのうちの1つは他の方法よりも優れているのですか、それともひどいので、他のことを完全に検討する必要がありますか?

8
tptcat

私は1つ目はより良いアプローチであるとアドバイスします

テーブル: `users`;同様のすべてのフィールドと `user_type_id`列(` user_types` 
の `id`の外部キー;テーブル:` user_types`;には `id`と` type`が含まれます(学生、インストラクター、 etc。)
テーブル: `students`;には、学生のみに関連するフィールドと、` user_id`列( `users`の` id`の外部キー)が含まれます。
テーブル: `instructors `;は、インストラクターのみに関連するフィールドと、` user_id`列( `users`の` id`の外部キー)
などすべての `user_types` 
に含まれます

理由:-

学生の列、インストラクターなどのテーブルなどのユーザー関連データは将来増加する可能性があるため、1番目のアプローチで管理するのは簡単です。

そして、他のオプションを選択して、列の数が多すぎるテーブルを作成します。これは、将来のデータベース管理の観点からは好ましくなく、将来、列の数が増えると、さらに問題が発生します。

9
vijayp