设计SQL用户表的问题

时间:2016-05-20 01:59:40

标签: mysql sql

我正在创建一个具有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

哪个是最好的设计选择?还有其他解决方案吗?

3 个答案:

答案 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

我在设计中做了两个假设。首先,用户的角色只有adminteacherstudent。如果用户可以是多个角色,那么您将需要创建一个存储此信息的新表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