MySQL:存储user_type和user_type_id的最佳方法是什么?

时间:2017-11-20 16:52:33

标签: mysql sql database-design

我为商店用户,学生和考官创建了3张桌子。

用户表包含登录详细信息

posts
  

如果user_type == 2或3,则根据该值,获取user_type_id字段   学生ID或考官ID,如果user_type == 1则值== 0。

学生表包含学生详细信息

id
name
email
password
user_type (3 user types: 1 - administrators, 2 - students, 3 - examiners) 
user_type_id

审查员表包含审查员详细信息

id
name
age
birthday

我的问题是,使用上述方式链接用户,学生和审查员是否可以?

如果没有,请提出建议。谢谢。

1 个答案:

答案 0 :(得分:1)

首先:您的数据模型需要一些改进。

  1. 您在学生中添加年龄属性和生日属性。在数据库中添加年龄不正确。您应仅使用生日。审查员中的问题相同。
  2. 使用身份验证(和授权)为信息系统设计数据模型的最佳做法是将它们分离为数据模型中的2个模块。 AA模块和信息系统的其他部分。这种分离具有诸如整个系统的可扩展性和其他系统中AA的可用性等优点。
  3. 另一项改进是定义名为 UserType 的新实体,并在Users实体中使用外键。
  4. 当您在“用户”实体的一个属性中同时使用“学生ID”和“考官ID”时,您的模型不正常,并且您无法设置外键。

  5. 其次:提供数据模型

    我们在用户和另外两个实体(学生和考官)之间建立了关系。也许将来其他实体会添加到此列表中。
    我们有两种关系: 用户与学生之间的一种关系以及用户与审查员之间的另一种关系 这些关系是一对一的。例如,每个学生都有一个用户,每个用户只能设置一个学生。用户和检查之间的类似声明。

    在一对一关系中,我们有两个解决方案: 1-通过1-1关系中第1侧实体的主键作为外键 方2的实体。
    以1-1关系将第2侧实体的主键作为外键 第1方的实体。

    两种解决方案都是正确的。所以我们有两种解决方案:

    解决方案1 ​​:将用户ID作为外键传输给Student和Examiner。在此解决方案中,我们可以轻松找到特定学生或特定考官的每个用户ID。 此解决方案的难点在于找到基于用户ID的学生或考官。答案是:请注意,我们为每个用户ID都有用户类型。因此,根据用户ID的用户类型,我们知道要搜索哪个表(学生或考官)。

    解决方案2 :将Student和Examiner ID作为外键传输到用户。意味着User Entity有2个外键。第一个是学生ID,第二个是考官ID。这种解决方案非常有效。但它与AA模块(认证和授权模块)的模块化冲突。当与User有关的其他表(Student,Examiner,...)的数量为HIGH时,会出现另一个问题。无论如何,在小型信息系统中我们可以使用这个解决方案。