2016-05-20 5 views
1

usersテーブルを持つデータベースを作成していますが、3種類のユーザー(管理者、教師、生徒)があり、一部の種類には独自のプロパティがあります。ここに私の解決策は以下のとおりです。SQLユーザーの設計に関する問題

1 - 三つの異なるテーブル:

table_admin  
    id 
    name 
    email 
    password 

table_teachers 
    id 
    name 
    email 
    password 
    teacher_only_a 
    teacher_only_b 

table_students 
    id 
    name 
    email 
    password 
    student_only_a 
    student_only_b 

2 - ワンテーブル、NULL値を許可する:

table_users 
    id 
    name 
    email 
    password 
    teacher_only_a (null on admin and student) 
    teacher_only_b (null on admin and student) 
    student_only_a (null on admin and teacher) 
    student_only_b (null on admin and teacher) 

3 - 関連テーブル:

table_users 
    id 
    name 
    email 
    password 
    teacher_id (null on admin and student) 
    student_id (null on admin and teacher) 

table_teachers 
    id 
    teacher_only_a 
    teacher_only_b 

table_students 
    id 
    student_only_a 
    student_only_b 

どのデザインが最適ですか?別の解決策がありますか?

+0

他の人と 'admin'の関係は何ですか? –

+0

'admin'には追加のプロパティがありません – Leonardo

答えて

0

なぜ

table_users 
    id 
    name 
    email 
    password 
    is_admin 

table_teachers 
    user_id 
    teacher_only_a 
    teacher_only_b 

table_students 
    user_id 
    student_only_a 
    student_only_b 

ユーザー情報アウト抽象ので任意の冗長性がありませんだろうと。

+0

良いJJ32!正しく結合テーブルを構築するために 'type'フィールド(' is_admin'と同じように)を追加したいと思います。私は3番目のソリューションを使用していましたが、そのパターンで外部キーを使用できませんでした。どうもありがとう! – Leonardo

0

ユーザー名、役割、およびその他のメタデータを格納するuserという2つのテーブルと、ユーザー間の関係を格納するuser_relationという2つ目のテーブルがあります。

ユーザー

id 
name 
email 
password 
role (admin, teacher, or student) 

user_relation

id1 
id2 

私はここに私のデザインの2つの仮定を作っています。 1つは、ユーザーの役割がadminteacher、またはstudentであることです。ユーザーが複数のロールになることができる場合は、この情報を格納する新しいテーブルuser_roleを作成する必要があります。第二の前提は、関係の性質が単にユーザーのタイプによるものであることが明らかであるということです。たとえば、user_relationのレコードに生徒と教師が含まれている場合、その生徒がその教師のクラスに属していると暗黙のうちに仮定されます。同様に、教師および管理者がエントリを有する場合、後者がエントリを管理すると仮定する。ただし、リレーションタイプの列を簡単に追加することができます。たとえば、管理者が学生でもあることを許可するなど、柔軟性を持たせたい場合などです。

0

ユーザーには動的に変化する属性があるため、マッピング属性を作成して、それらが同じデータ型を持つことを考慮して個別に取得するほうが適しています。 teacher_only_aとstudent_only_aの値は何ですか?ここにはどのような種類のデータが格納されていますか?

table_user 
    id 
    name 
    email 
    password 
    type // T:Teacher S:Student 

table_user_attributes 
    user_id 
    attribute_name 
    attribute_value 
+0

文字列、数値、日付などがあり、時にはNULLでない場合もあります – Leonardo