【问题标题】:Should I make 1 or 2 tables for Lecturers and Students in MySql? [duplicate]我应该在 MySql 中为讲师和学生制作 1 个或 2 个表格吗? [复制]
【发布时间】:2014-11-17 16:02:52
【问题描述】:

我目前正在开展一个项目,您可以在其中保存讲师和学生的详细信息。 我不确定我应该使用一张桌子User 还是两张桌子LecturerStudent

当您以讲师身份登录时,您拥有作为项目组管理页面的特殊权限,在加载组页面时,学生将没有这些权限。在Usertbl 中会有一列 status在哪里注册,可以选择成为学生或讲师的页面并输入一个特殊的 讲师代码。我正在将 PHP 与 mySql 一起使用。

总之,我应该为学生和讲师使用 1 个User 表,还是使用 2 个单独的 StudentLecturer 表。

附加信息:1 门课程可以有很多讲师和学生,但 1 名学生可以有 1 门课程,而讲师有很多课程。

【问题讨论】:

  • 这是基于您的数据。如果所有用户都有相同的主数据,并且只有他们的类型在变化,那么使用一个带有标志字段的表。
  • 是的,非常依赖数据。一个讲师可以成为另一个讲师班级的学生吗?如果是这样,如果您使用两个不同的表,您将把一个人保存为两个实体,这通常是一个坏主意。我当然会倾向于一张桌子,但这取决于你的模型和你的现实的细节。 @ctrahey 建议将“角色”的概念添加到单个用户表中,这是一个非常传统且经过充分测试的问题解决方案。
  • Student 表中的某些信息是不同的,因为 Student 的 CourseID 是外国人,所以我假设我需要将 Student 和 Lecturer 放在不同的表中。一个学生有很多讲师,一个讲师有很多学生,我目前正在使用数据库中的链接器表来连接两者。我曾假设我可以将两者都放在一个 User 表中。
  • 我在一所大学任教,当时我是学生。其中一位讲师作为学生坐在我的课堂上。
  • 我在您的问题中添加了两个标签,即单表继承和类表继承。这两种设计模式可能是回答您自己问题的关键。

标签: mysql database database-design single-table-inheritance class-table-inheritance


【解决方案1】:

好问题!

它可能看起来过于复杂,但如果你想扩展这个系统,我强烈建议对它进行更“标准化”的建模。通过意识到讲师和学生都是同一个实体(人/用户),您已经走上了正确的道路。诀窍是您应该为“角色”建模,然后也为用户的角色建模。这为您的模型的这一小部分制作了 3 个表格。

USERS               USER_ROLES           ROLES
+------------+      +----------+         +--------+
| id         | <--> | user_id  |     /-->| id     |
| login_name |      | role_id  | <--/    | name   |
| etc        |      +----------+         +--------+
+------------+

users
======
id
login_name
etc

roles
=======
id
name

user_roles
===========
user_id
role_id
since

样本数据

USERS
+----+------------+
| id | login_name |
+----+------------+
| 1  | Chris      |
+----+------------+
| 2  | Cherri     |
+----+------------+


ROLES
+----+------------+
| id | name       |
+----+------------+
| 1  | Lecturer   |
+----+------------+
| 2  | Student    |
+----+------------+

USER_ROLES
+---------+---------+
| user_id | role_id |
+---------+---------+
|    1    |     1   | <-- Chris is a Lecturer
+---------+---------+
|    2    |     2   | <-- Cherri is a student
+---------+---------+
|    2    |     1   | <-- Cherri is also a lecturer
+---------+---------+

【讨论】:

  • @minboost 这并不复杂。这是一个非常灵活的解决方案,也非常明确
  • 此解决方案需要 3 个表,并且可能需要一个前端来管理角色。它比我的单列解决方案没有任何优势(如果您将其视为按位,它也允许多个角色)。唯一重要的是,如果您有一个额外的表来管理角色的权限,但在这种情况下,您只是创建了两个额外的表来为角色添加标签。
  • @minboost 指出这一点形成了鲜明的对比,但我想提倡持久的软件模式,尤其是。在 SO 上,许多未来的访问者会发现这篇文章,他们的需求可能略有不同。良好的数据建模是软件包中最持久的价值之一。我认为值得投资。
【解决方案2】:

使用单个表格,其中的字段指示它是学生还是讲师。它可以是一个简单的整数列名称“角色”,其中角色=0 表示学生,角色=1 表示讲师。

这很简单,可以快速实施,并且符合要求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    相关资源
    最近更新 更多