【问题标题】:design database for class with groups and students为有团体和学生的班级设计数据库
【发布时间】:2016-05-27 17:32:09
【问题描述】:

我正在尝试为一个班级设计数据库,每个班级有很多小组或没有小组,每个小组都有很多学生。

我画了两个这样的实体关系图。 对于图 1,出现圆形关系。 对于图 2,要将学生添加到班级中,我必须添加组,所以如果班级没有组,那么我将无法将学生添加到班级中。我该如何为这种情况设计数据库?

【问题讨论】:

  • 问题: 1. 1个学生可以属于1个以上的组吗? 2. 学生可以不属于任何群体吗?
  • 问题1:当前:否,将来可能,问题2:是

标签: database


【解决方案1】:

您的第一个图表没有循环功能依赖关系。从“多”端读到“一”端:

Student -> Group (Belong to)
Student -> Group (Manage)
Group -> Student (Manage)
Group -> Class (Has)
Student -> Class (Belong to)

类不决定学生或组,因此没有循环“引用”。

循环关系可能是一个警告,提醒您注意可能出现的异常情况 - 在这种情况下,请注意学生不能通过从学生到班级的两条路径与不同班级相关联。只要您注意数据保持有效,循环关系就不是问题。

对于您的第二个图表,您可以采用每个类至少有一个组的约定(即,如果没有子组,则整个类都算作一个组)。这样,每个学生都通过他们的小组与班级相关联,您无需直接记录该关联。

【讨论】:

  • 我宁愿说图表在这一点上是模棱两可的。直接从 ER 图实现数据库是有风险的,传统上人们会先准备一个物理模型以确保它实现所有逻辑要求。有一些方法可以在物理实现中处理完整性(即通过非规范化和复合 FK 约束),可以缓解问题,同时允许直接记录关联。
【解决方案2】:

这些应该是您数据库中的表:

  1. 类表:主键是 ClassId。
  2. 学生表:主键为 StudentId,FK(外键)为 ClassId。
  3. 组表:主键是 GroupId,它将包含 ClassId 作为 FK。
  4. Groups_Student 表:此表包含组和学生的映射。所以 FK 将是 GroupId 和 StudentId。

上述设计支持一个学生属于多个组或根本不属于任何组。这假设一个组只与一个类相关联。这也假设一个学生只与一个班级相关联。

【讨论】:

  • 您的实现涵盖了图 1 的大部分内容(管理关系除外),但没有解决循环关系混淆,解释为什么您更喜欢图 1 而不是图 2,或者警告可能存在异常。
  • 感谢您的跟进。可以通过将“ManagingStudentId”保留在 Group 表中来捕获管理关系(即 1:1)。关于 1 与 2,我更喜欢 1,因为它支持学生属于一个班级而不属于一个小组的想法。我没有看到我们需要规避的真正的循环关系。
猜你喜欢
  • 2016-11-04
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 2016-09-08
  • 2019-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多