我正在创建一个具有users
表的数据库,但有三种类型的用户(管理员,教师和学生),有些类型有自己的属性。以下是我的解决方案:
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 :(得分: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
这将抽象出用户信息,因此没有任何冗余。
答案 1 :(得分:0)
我会选择有两个表,一个名为user
,用于存储用户名,角色和其他元数据,另一个名为user_relation
,用于存储用户之间的关系。
用户强>
id
name
email
password
role (admin, teacher, or student)
<强> user_relation 强>
id1
id2
我在设计中做了两个假设。首先,用户的角色只有admin
,teacher
或student
。如果用户可以是多个角色,那么您将需要创建一个存储此信息的新表user_role
。第二个假设是,很明显,关系的性质仅仅取决于用户的类型。例如,如果来自user_relation
的记录包含学生和教师,则将隐含地假定该学生属于该教师的班级。同样,如果教师和管理员有条目,则会假设后者管理前者。但是,如果您想让关键字更灵活,您可以轻松地为关系类型添加列,例如,允许管理员也是学生。
答案 2 :(得分: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