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

标签 mysql sql database-design

我为商店用户、学生和考官创建了 3 个表。

用户表包含登录详细信息

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

If user_type == 2 or 3, then based on that value, user_type_id field get student id or examiner id, if user_type == 1 then value == 0.

students 表包含学生详细信息

id
name
age
birthday

考官表包含考官详情

id
name
age
qualifications

我的问题是,用上面的方式连接用户、学生和考官是否可以?

如果不行,请提出一个方法。谢谢。

最佳答案

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

  1. 您将age 属性和birthday 属性放在Student 中。在数据库中添加年龄是不正确的。您应该只使用生日。考官也有同样的问题。
  2. 为具有身份验证(和授权)的信息系统设计数据模型的最佳做法是将它们分离到数据模型中的 2 个模块中。 AA模块和信息系统的其他部分。这种分离具有一些优势,例如整个系统的可扩展性和 AA 在其他系统中的可用性等。
  3. 另一个改进是定义一个名为UserType 的新实体,并在用户实体中使用外键。
  4. 当您在 Users 实体的一个属性中同时使用 Student ID 和 Examiner ID 时,您的模型不正常并且您不能设置外键。


其次:提供数据模型

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

在一对一关系中,我们有 2 种解决方案:
1- 将 1-1 关系中第 1 侧实体的主键作为外键传递给 第二面的实体。
2- 将 1-1 关系中第 2 端实体的主键作为外键传递给 第 1 面的实体。

两种解决方案都是正确且正常的。所以对于这种情况我们有 2 种解决方案:

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

解决方案 2:将 Student 和 Examiner ID 作为外键传递给 Users。这意味着用户实体有 2 个外键。第一个用于学生 ID,第二个用于考官 ID。这个解决方案接缝非常有效。但它与AA模块(Authentication and Authorization Module)的Modularity相冲突。当与 User 相关的其他表(Student、Examiner 等)的数量很高时,就会出现另一个问题。不管怎样,在小型信息系统中我们可以使用这个解决方案。

关于MySQL:存储 user_type 和 user_type_id 的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47397129/

相关文章:

PHP 要求与自动加载

sql - 包含对char不满意的内容(13)

mysql - 当时间和日期连接时选择数据范围

c# - ERP会计年度交易表的单数据库VS多数据库?

postgresql - 使用国民身份证作为主键

database-design - 1 到 0..1 的关系 - FK 应该指向哪个方向?

php - mySQL PHP 打印多行结果

mysql - 用于存储用户配置文件的更好数据模型是什么?

sql - 从列 sales 中每 7 行求和,而整数代表距安装促销 Material n 天(安装前后)

php - 无效查询或字符类型