相关业务领域中有四种实体类型: USER、COURSE、MODULE和TOPIC。
业务规则是这样的:
- 一门课程包含一个或多个模块,并且
- 每个模块包含一个或多个主题。
所以,我画了下面的实体关系图(ERD):
现在,
- 一个用户可以学习很多课程,并且
- 许多用户可以参加一个课程。_ _
我想保持用户在该课程中的进度,因此我在研究关系中存储了一个主题实例。
关系表示
我的关系表如下所示:
此表中的topic_id
列代表用户需要完成的下一个主题。因此,每当用户注册课程时,我都会获取课程第一个模块的第一个主题并更新行。所以(user_id, course_id)
成为我的复合主键。此外,当用户完成一个主题时,我会获取列表中的下一个主题并更新实例。
问题
我如何用上述约束来表示 ERD 中的关系?
由于存在三种参与实体类型,这是否构成三元关系,如果是,基数应该是什么样的?
任何见解将不胜感激。
有点不直观,您应该删除对的引用,
course
只保留对user
和表topic
中的引用Undergoing
。直接回答你的问题:应该只有两个参与实体,所以它不是三元关系。这是规范化中那些有趣的案例之一,其中满足第三范式 (3NF)但不满足Boyce–Codd 范式 (BCNF)。两者都是正常数据库形式化中的理想形式。打破 BCNF 的是依赖
topic_id
->course_id
。用简单的英语来说:如果你知道 thetopic_id
你也可以推断出 thecourse_id
also 所以你不需要明确的参考。当您
user_topics
仅与引用相关时user_id
,topic_id
您可以轻松地通过常规JOIN
(通过模块到课程)获取用户的课程。这里更正式地放置了 3NF 中允许但 BCNF 中不允许的依赖项(第三范式 - 维基百科):
Boyce–Codd 范式(维基百科):