1

我有三个表:什么是三个表关系的正确标准化?

  • 教师
  • 课程

的句子是:

  • 教师可能执教一个或更多的课程。
  • 老师可能会教授一门课或多门课。
  • 一位老师教授课程。

因此,我需要第三张表的PRIMARY KEY中的每一个表构成第四个表的PRIMARY KEY或UNIQUE INDEX。

这是什么正确的标准化?

  1. 表的名称:“class_course_teacher”应该是好的,我需要使用一个名称,比如“分配”这个?
  2. 该表的主键:“class_id + course_id + teacher_id”应该没问题,或者我需要为作业表创建“id”,并且应该将“class_id + course_id + teacher_id”作为唯一索引?

回答

0

标准化从功能依赖性开始。这是一种将一组信息分解为基本事实而不丢失信息的方法。把它看作是逻辑重构。

你的句子是一个开始,但不足以确定依赖关系。课程是否有一位或多位教师?班上有一位或多位教师吗?课程是否有一个或多个班级?课程是否属于一门或多门课程?教师能否“教”没有课程的课程(即,是否要记录哪些教师可以在任何课程分配之前教授课程)?你想在分配教师之前定义课程或课程吗?

你的两个问题与标准化无关。 assignments是一个体面的名字,只要你不会记录其他作业(如作业分配),在这种情况下teacher_assignmentsclass_assignments可能会更好。 class_course_teacher可能意味着只能有一个涉及这三个实体集合的关系,但它可以而且确实发生了不同的关系涉及相同的实体集合。

我建议不要使用代理id,直到您有理由使用它们。它们增加了所需的列数和索引数量,而无需添加有用的信息,并且可以增加查询中需要加入的表的数量(因为除非需要“取消引用”assignment_id才能到达class_idcourse_idteacher_id),除非您记录冗余数据(这有其自己的问题)。

+0

谢谢你的解释。我想我要去'teacher_assignments',并且因为这张桌子只会用于quering哪个老师教授哪一门课程,我不会为第四个桌子创建一个'id'。 –

+0

只是顺便说一句:课程是否有一位或多位教师? **是。**班级是否有一位或多位教师? **是。**课程是否有一个或多个班级? **是。**课程是否属于一门或多门课程? **是的。**教师能否在没有课程的情况下“教”课程(即,是否想记录哪些教师可以在任何课程分配之前教授课程)? **否。**在分配教师之前,您是否想定义课程或课程? **是。 ** –

+0

如果课程,课程和教师的任何组合都是有效的组合(即在每个方向上多对多),那么由所有三个组成的关系完全标准化。 – reaanb

0

正常化是关于数据结构 - 但不是关于命名。如果唯一的要求是“正确的标准化”,那么这两个决定都取决于你。

然而好名字在现实世界中很重要。我喜欢“作业” - 这是非常有意义的。

我喜欢为每个表创建ID列,它们可以更容易地改变表之间的关系。

+0

谢谢你的记住。 –

相关问题