三表关系的正确规范化是什么?
Whats the correct normalization of a relationship of three tables?
我有三个 table:
- 教师
- classes
- 课程
句子是:
- 一名教师可以教授一门或多门课程。
- 一个老师可以教一个或多个classes。
- 一位老师教授 class 课程。
所以我需要第四个 table,三个 table 中的每一个的主键构成第四个 table 的主键或唯一索引。
正确的标准化是什么?
- table: "class_course_teacher" 的名称应该可以,或者我需要使用像 "assignments" 这样的名称?
- table: "class_id + course_id + teacher_id" 的主键应该没问题,否则我需要为赋值创建 "id" table 这应该有 "class_id + course_id + teacher_id" 作为唯一索引?
规范化 是关于数据结构的,而不是关于命名的。如果唯一的要求是 "correct normalization",这两个决定都由您决定。
然而,好名字在现实世界中很重要。我喜欢"assignments" - 很有意义
我喜欢为每个 table 创建 ID 列,这样可以更轻松地更改 table 之间的关系。
规范化从函数依赖开始。这是一种在不丢失信息的情况下将一组信息分解为基本事实的方法。将其视为逻辑重构。
你的句子是一个开始,但不足以确定依赖关系。课程是否有一名或多名教师? 类 有一位或多位老师吗?课程是否有一个或多个 类? 类 属于一门还是多门课程?老师可以 "teach" 没有 类 的课程吗(即你想在分配任何 类 之前记录哪些老师可以教授课程)?您要在分配教师之前定义 类 或课程吗?
你的两个问题与规范化无关。 assignments
是一个不错的名字,前提是您不会记录其他作业(如家庭作业),在这种情况下 teacher_assignments
或 class_assignments
可能更好。 class_course_teacher
可能意味着只能存在一种涉及这三个实体集的关系,但不同的关系可能并且确实会涉及相同的实体集。
我建议您不要使用代理 ID,除非您有理由使用它们。它们在不添加有用信息的情况下增加了所需的列和索引的数量,并且可以增加需要在查询中连接的表的数量(因为您需要 "dereference" assignment_id
才能到达 class_id
, course_id
和 teacher_id
) 除非你记录冗余数据(它有自己的问题)。
我有三个 table:
- 教师
- classes
- 课程
句子是:
- 一名教师可以教授一门或多门课程。
- 一个老师可以教一个或多个classes。
- 一位老师教授 class 课程。
所以我需要第四个 table,三个 table 中的每一个的主键构成第四个 table 的主键或唯一索引。
正确的标准化是什么?
- table: "class_course_teacher" 的名称应该可以,或者我需要使用像 "assignments" 这样的名称?
- table: "class_id + course_id + teacher_id" 的主键应该没问题,否则我需要为赋值创建 "id" table 这应该有 "class_id + course_id + teacher_id" 作为唯一索引?
规范化 是关于数据结构的,而不是关于命名的。如果唯一的要求是 "correct normalization",这两个决定都由您决定。
然而,好名字在现实世界中很重要。我喜欢"assignments" - 很有意义
我喜欢为每个 table 创建 ID 列,这样可以更轻松地更改 table 之间的关系。
规范化从函数依赖开始。这是一种在不丢失信息的情况下将一组信息分解为基本事实的方法。将其视为逻辑重构。
你的句子是一个开始,但不足以确定依赖关系。课程是否有一名或多名教师? 类 有一位或多位老师吗?课程是否有一个或多个 类? 类 属于一门还是多门课程?老师可以 "teach" 没有 类 的课程吗(即你想在分配任何 类 之前记录哪些老师可以教授课程)?您要在分配教师之前定义 类 或课程吗?
你的两个问题与规范化无关。 assignments
是一个不错的名字,前提是您不会记录其他作业(如家庭作业),在这种情况下 teacher_assignments
或 class_assignments
可能更好。 class_course_teacher
可能意味着只能存在一种涉及这三个实体集的关系,但不同的关系可能并且确实会涉及相同的实体集。
我建议您不要使用代理 ID,除非您有理由使用它们。它们在不添加有用信息的情况下增加了所需的列和索引的数量,并且可以增加需要在查询中连接的表的数量(因为您需要 "dereference" assignment_id
才能到达 class_id
, course_id
和 teacher_id
) 除非你记录冗余数据(它有自己的问题)。