我正在设计一个拥有多种类型用户的数据库,即管理员,编辑,教师和学生。现在,所有这些用户都有一些公共字段(CF)和一些与它们相关联的唯一字段(UF)。我想知道这是不是一个好的设计?
表用户:[user_id(PK),CF1,CF2,...,CFN,user_type(enum)]
表管理员:[id(PK),UF_A1,UF_A2,...,U_AN,user_id(FK)]
表编辑:[id(PK),UF_E1,UF_E2,...,U_EN,user_id(FK)]
表教师:[id(PK),UF_T1,UF_T2,...,U_TN,user_id(FK)]
表学生:[id(PK),UF_S1,UF_S2,...,U_SN,user_id(FK)]
其中UF_A,UF_E,UF_T和UF_S是每个表的唯一字段。
现在我的问题是:
PS:如果他们可能有助于获得更好的洞察力,还有更多要点:
答案 0 :(得分:1)
您的设计是在关系数据库中建模继承关系的3种公认方法之一;其他的是“每个类的类”,其中每个子类都有自己的完整表,或“一个表来统治它们”,其中所有可能的列都存在于一个表中。
其他替代方案是使用Entity-Attribute-Value或文档(例如JSON或XML)来存储数据。
您的设计具有以下优势:
缺点:
答案 1 :(得分:0)
您的设计说明了一种称为class-table-inheritance的设计技巧 此标记有一个信息选项卡,概述了该技术。
正如信息所说,还有另一种可能有用的技术,即 shared-primary-key。
答案 2 :(得分:0)
您的设计(Users.user_type)意味着某个人可以是管理员,或者该人可以是编辑,但不能同时为两者。这也意味着教师不能成为编辑。那是你的意图吗?
Admin.user_id,Editors.user_id,Teachers.user_id,Students.user_id列通常是您所描述的结构类型中的主键。如果CodeIgniter不允许您将它们作为主键,则仍需要声明它们是唯一的。
唯一字段的示例是。 。 。老师(大学名称,大学徽标,学位)
这可能不是真的。
如何确保user_type教师的用户不在学生表中存储?
具有重叠约束,默认值,检查约束和外键引用。它听起来比听起来容易。见this SO answer。但我不相信你真的想这样做。