Database 数据库设计:如何对一个表可以属于其他两个表的关系建模?
我有三个实体:Database 数据库设计:如何对一个表可以属于其他两个表的关系建模?,database,database-design,relational-database,Database,Database Design,Relational Database,我有三个实体: 课程 部分 教训 每个“课程”都由几个“课程”组成。 课程中的“课程”可以分为“部分”,也可以不分 因此,课程内容可以如下所示: Foo Course: Lesson 1 Lesson 2 Lesson 3 Lesson 4 Bar Course: Section 1: Lesson 1 Lesson 2 Section 2: Lesson 3 Lesson 4 或
Foo Course:
Lesson 1
Lesson 2
Lesson 3
Lesson 4
Bar Course:
Section 1:
Lesson 1
Lesson 2
Section 2:
Lesson 3
Lesson 4
或者像这样:
Foo Course:
Lesson 1
Lesson 2
Lesson 3
Lesson 4
Bar Course:
Section 1:
Lesson 1
Lesson 2
Section 2:
Lesson 3
Lesson 4
因此,换句话说,一门课程既可以直接有“课程”,也可以有“部分”,而“部分”又有“课程”
从另一个角度看,“课程”既可以直接属于“课程”,也可以属于属于“课程”的“部分”
我正在努力研究如何在关系数据库中实现这种结构
如果每个“课程”都必须属于一个“部分”,那就很简单了,我可以简单地拥有一个“课程”表、一个带有“课程ID”列的“部分”表和一个带有“部分ID”列的“课程”表
但我的设想并没有那么简单。“部分”可能作为“课程”和几个“课程”之间的中间人存在,但也可能不存在,在这种情况下,“课程”直接有“课程”,没有“部分”
对于如何在关系数据库的上下文中理想地实现这样的结构,我非常感谢任何建议
谢谢。改变你的观点:如果所有的
课程都可以有讲座,但只有一些讲座属于某个部分,那会解决你的问题吗
具体地说(如果你想学习,甚至不用费心读这个:D):
课程
属于课程
,外键,不可为空。
课程
有一个外键指向部分
,可为空
现在,如果课程
或部分
可以属于其他课程,那就不同了。最简单的方法是在课程
上有两个外键:
CourseId null,
SectionId null
然后在表上放置一个检查
约束
(CourseId IS NOT NULL AND SectionId IS NULL) OR (CourseId IS NULL AND SectionId IS NOT NULL)
这意味着其中一方必须在场,但不能同时在场不要受诱惑将课程ID
放在属于某个部分的课程上,因为这会在表中引入非规范化:如果某个部分移动到其他课程,则需要更新所有子课程
严格地说,你真的应该有一个更复杂的设计:
课程
CourseLesson
章节课程
但是,这使得仅作为其中一个或另一个课程的一部分的课程无法实施。1进度要求
一门课程既可以直接有“课程”,也可以有“部分”,而“部分”又有“课程”
“课程”可以直接属于“课程”,也可以属于属于“课程”的“部分”
虽然你已经给出了一些规则,但还有一些是隐含的,而不是明确的。我们需要让它们明确
还有其他需要评估和确定的考虑因素
确切地说,什么是教训?
- 课程是否独立,可以在多个课程中使用,而不会重复课程?
课程
[安全使用锤子]可能在
课程
[木制品]以及
课程部分
[木工,基础]`
- 课程是否取决于课程[和章节],因此对该结构而言是唯一的
- 我假设是前者
这是一个临时模型,显示了两种类型的课程,一个独立的课程,等待决定,以及进一步的数据建模。重复的元素以红色显示。
2关系数据模型
请原谅,如果我没有展示几个中间步骤(在要求的简单问答格式中不可能),这里是最终的数据模型
- 标准化表示数据库中没有空值
- 可为空的外键尤其是坏消息,严格禁止
- “虚拟记录”不仅笨拙可怕(影响每个访问表的
SELECT
),而且不是事实,完全没有必要
记录ID
是物理的;反关系,每个都需要一个额外的列和索引。
- 它使用关系键(由数据组成),提供关系完整性(与引用完整性不同)
CourseLesson.CourseLesson
识别课程中的课程,使其在课程中具有意义,独立于第一课
SectionLesson.SectionLesson
标识了该部分中的课程,使其在课程和部分中具有意义,与LessonNo
课程
是唯一的子类型,以确保:
- 简单课程
课程类型课程
直接上课,并且
- 分段课程
course\u TypeSection
将课程附加到该部分,而不是课程
课程
独立且完全定义(一次)
课程用于
任一类型的课程
CourseLesson.AK
防止在简单的课程中重复课程
SectionLesson.AK
防止Lesson
在分段的课程中重复
更多
Progress data model解决了许多问题,并有望回答您的问题。但它可能会暴露其他问题,可能需要进一步定义:数据建模是一项迭代任务。请随时发表评论
符号
- 我所有的数据模型都在中呈现,这是自1993年以来关系数据库建模的标准
- M