数据库设计模式帮助2个实体

时间:2011-11-20 01:54:59

标签: php mysql

我们假设网站上有两个不同的实体。

教师和学生

他们都登录网站。现在我有以下表格

**Users**

 - id
 - email
 - password

**Students**

 - GPA
 - SAT
 - ACT
 - user_id references Users ID

**Teachers**

 - user_id references Users ID
 - classroom_no
 - salary
 - average_class_size

因此,当学生注册时,我在“用户”和“教师”表中都添加了一行。

当教师注册时,我在“用户”和“教师”表中都添加了一行。

让一个表具有以下字段的用户更好吗?

**Users:**

 - id
 - ACT
 - GPA
 - SAT
 - average_class_size
 - salary
 - classroom_no
 - role (0 = teacher 1 = student)

即使有些行会引用教师(因此也不会使用ACT,SAT,GPA字段)

...

谢谢!

5 个答案:

答案 0 :(得分:3)

如果您不熟悉数据库规范化,请阅读this

除非性能是一个严重的问题,否则我不会考虑为此结构使用单个表。随着您的项目进行,您很可能会为每个角色添加更多字段,并且可能还会添加更多角色。维持这一点将变得越来越困难。

我实际上会更进一步,在您的应用程序中引入另一个名为role的概念,以及相应的数据模型来保持它。

你的桌子应该是:

users:
 - id
 - email
 - password

roles:
 - id
 - type

user_roles:
 - user_id
 - role_id

role_teacher:
 - user_id
 - classroom_no
 - salary
 - average_class_size

role_student:
 - user_id
 - GPA
 - SAT
 - ACT

拥有单独的角色表可以让您将身份验证表(用户)与其他数据分开。如果用户既可以是教师又可以是学生,这可能会变得很重要。

这应该让您基本了解如何构建数据库。

您可能会发现您将开始为系统中的类等其他概念建模。因此,添加适当的表可能类似于:

role_teacher:
 - user_id
 - salary

classroom:
 - id
 - capacity

class:
 - id
 - name
 - teacher_id
 - classroom_id
 - start_date
 - end_date

class_enrollment:
 - class_id
 - student_id
 - enrollment_date
 - grade

教师课堂等项目现在转移到课堂上,允许教师教授多个课程(也许你需要重新添加"家庭室"的概念)。教师的平均班级大小只是一个计算(尽管为了提高效率,你可能还想存储它)。

希望这有助于指导您朝着正确的方向前进!

答案 1 :(得分:1)

您应该使用TeachersStudents表格。数据库中的表应该反映真实世界模型(当然可能的话)。将所有内容合并到单个User表中几乎没有什么价值,并引入了以下问题:

  • 冗余(教师不需要你提到的ACT,GPA等字段)
  • 复杂性(您需要额外的逻辑来确定用户是学生还是教师)
  • 歧义(用户是系统用户,还是现实世界的个人数据,或只是登录信息......?),术语过于通用

最重要的是,我将Users表重命名为UserLogins - 它更明确地表明其目的。

答案 2 :(得分:0)

我的感觉是你拥有它的方式更好 - 你必须维护两个表以便它们保持同步,但你最好将“用户”,“学生”和“老师”的角色封装起来这条路。它还为您提供了更好的维护工作 - 如果您希望允许“父级”使用对其子级的引用登录,该怎么办?那么“校长”怎么样?这些都是用户,但很快就会破坏统一的表格。

答案 3 :(得分:0)

有几种方法可以做到这一点,但我认为一个用户表是正确的方法。你可以拥有空列 - 它看起来不是最好的,但是如果它适合你,它将允许最少的编码来获得你需要的值。

另一个选项可能是拥有一个属性表{UserId,Attribute,Value},然后你可以拥有:User1 GMAT 710,User1 ACT 30等等。这样你就可以获得一个属性列表用户通过select * from UserId = user.UserId或其他类似的属性。更多的代码开销,更清洁。这也允许您在将来为了任何目的添加更多属性,并保持数据库相同。

答案 4 :(得分:0)

如果一位教师可以参加多个班级,那么您的设计就会失败,因为教师表会有多个参赛作品。

相反,创建一个教师表,我们可以存储教师表,创建一个中间表,我们可以存储教师和他的课程。

同样,教师和用户表应该是分开的.. 我们可以存储单独的用户表,我们可以存储使用详细信息..