三表关系的正确规范化是什么?

Whats the correct normalization of a relationship of three tables?

我有三个 table:

句子是:

所以我需要第四个 table,三个 table 中的每一个的主键构成第四个 table 的主键或唯一索引。

正确的标准化是什么?

  1. table: "class_course_teacher" 的名称应该可以,或者我需要使用像 "assignments" 这样的名称?
  2. table: "class_id + course_id + teacher_id" 的主键应该没问题,否则我需要为赋值创建 "id" table 这应该有 "class_id + course_id + teacher_id" 作为唯一索引?

规范化 是关于数据结构的,而不是关于命名的。如果唯一的要求是 "correct normalization",这两个决定都由您决定。

然而,好名字在现实世界中很重要。我喜欢"assignments" - 很有意义

我喜欢为每个 table 创建 ID 列,这样可以更轻松地更改 table 之间的关系。

规范化从函数依赖开始。这是一种在不丢失信息的情况下将一组信息分解为基本事实的方法。将其视为逻辑重构。

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

你的两个问题与规范化无关。 assignments 是一个不错的名字,前提是您不会记录其他作业(如家庭作业),在这种情况下 teacher_assignmentsclass_assignments 可能更好。 class_course_teacher 可能意味着只能存在一种涉及这三个实体集的关系,但不同的关系可能并且确实会涉及相同的实体集。

我建议您不要使用代理 ID,除非您有理由使用它们。它们在不添加有用信息的情况下增加了所需的列和索引的数量,并且可以增加需要在查询中连接的表的数量(因为您需要 "dereference" assignment_id 才能到达 class_id, course_idteacher_id) 除非你记录冗余数据(它有自己的问题)。