数据库设计 – 元关系(关系之间的关系)与元组

我正在设计一个数据库,需要在许多不同类型的实体之间存储一些相当复杂的关系.

在最简单的例子中,让我们说我有三种类型的实体 – “学生”,“导师”和“课程”,每个实体都有自己的表格(学生,导师,课程).首先,我需要在每对可能的实体类型之间表示简单的多对多关系:

> student_course – 每个学生可以注册零个或多个课程,每个课程可以有零个或多个学生. (例如:“亚历克斯就读于生物学”).
> student_tutor – 每个学生可以与零个或多个导师一起工作,每个导师可以分配给零个或多个学生. (例如:“艾玛被分配给亚历克斯”).
> course_tutor – 每位导师都可以被批准教授零个或多个课程,每个课程可以有零个或多个批准的导师. (例如:“艾玛知道如何辅导物理”).

很容易.但是,我还需要代表一些更高级的关系,例如:

>“导师约翰正在与学生亚历克斯和玛丽亚合作课程化学”
>“导师约翰正在与学生亚历克斯一起学习代数课程”

请注意,这些不是我之前描述的二元多对多关系所捕获的 – John可以辅导Maria,而Maria可以注册历史,但这并不意味着John在历史中辅导Maria.

我看到它的方式,我有两个选择:

选项1 – 包含三元组的单个表

表student_course_tutor:

| student_id | course_id | tutor_id |
|------------|-----------|----------|
| 1          | 1         | 1        |
| 1          | 1         | 2        |
| 1          | 2         | 5        |

这很好,因为它明确地在一行中列出了完整的关系.但是,我现在需要在我的简单关系表之外维护这个表.

选项2 – 元关系

表student_course:

| id | student_id | course_id |
|----|------------|-----------|
| 1  | 1          | 1         |
| 2  | 1          | 2         |

表student_course__tutor:

| student_course_id | tutor_id  |
|-------------------|-----------|
| 1                 | 1         |
| 1                 | 2         |
| 2                 | 5         |

因为我还是要有一个student_course表,所以添加这个“元关系”表比表示完整的三元组更没有多余.但是,它现在变得更加抽象,难以理解.

哪种方式更正确?

最佳答案
这两个例子不是等同的和可互换的实现;它们体现了不同的语义.

首先,三向表对参与者没有任何条件.该示例显示了这一点.亚历克斯注册了生物学,艾玛被分配到亚历克斯,艾玛知道如何辅导物理.导师的主题是物理学,但有一个学生参加了生物学,模型中没有任何东西阻止他们讨论,比如说,经济学.

在第二个中,tutor_id只能与预先存在的student_course_id相关联.所以亚历克斯必须在艾玛成为他的导师之前就读于生物学.由于只有一个course_id(通过相关的student_course),我们可以假设这是他们将在他们的教程中讨论的内容.然而,仍然没有办法断言艾玛是亚历克斯教师的一部分.

如果你还在计算逻辑数据模型,我建议你跳过代理键,现在只使用自然键,即删除各种“id”列,只使用course.name,student.name和tutor.name.代理键是实际DBMS实现中的强大性能增强器,但在理解和记录问题时不需要.当您确信自己已经解决了问题时,可以在以后替换它们.

接下来,您需要了解数据的约束以及数据库必须回答的问题.例如,约束可以是教师只能在她受雇的受试者中工作.一个问题可能是“谁可以为化学专业的学生提供辅导?”一旦你有这些,将出现强制执行和回答它们的表,以及外键约束.

您可能会满足于任何导师向任何学生教授任何科目.如果是这样的话就没关系,我无法说出这个问题.或者您可以选择在数据库外部强制执行此操作 – 例如,在应用程序中,或通过管理层强制执行的书面策略.重要的是理解规则,以及它们是如何实施的,这样当它们改变时,可以进行适当的调整.

如果这是数据需要的话,不要害怕有很多行的表.您是否会因为“无论如何都要拥有它”而在现有网站的中途点击新的点击流?

转载注明原文:数据库设计 – 元关系(关系之间的关系)与元组 - 代码日志