我有三个实体:
每个“课程”都由几个“课程”组成。课程中的“课程”,可以分为“部分”,也可以不归为“部分”。
因此,一门课程的内容可以是这样的:
Foo Course:
Lesson 1
Lesson 2
Lesson 3
Lesson 4或者像这样:
Bar Course:
Section 1:
Lesson 1
Lesson 2
Section 2:
Lesson 3
Lesson 4因此,换句话说,一门课程可以直接上“课”,也可以有“节”,而“节”又有“课”。
从另一个角度来看,“课程”可以直接属于“课程”,也可以属于“部分”,而“部分”又属于“课程”。
我很难在关系数据库中实现这个结构。
如果每个“课程”都必须属于“部分”,那就很简单了,我只需要一个“课程”表、一个“章节”表和一个"CourseId“列,以及一个”课程“表和一个"SectionId”列。
但我的设想并不是那么简单。“部分”可能作为“课程”和若干“课程”之间的中间人存在,但也可能没有,在这种情况下,“课程”直接有“课程”,没有“部分”。
对于如何在关系数据库的上下文中理想地实现这样的结构,我将不胜感激。
谢谢。
发布于 2021-05-06 00:55:59
1进度要求
一门课程可以直接有“课程”,也可以有“部分”,而“课程”又可以是“课程”(. )--“课程”可以直接属于“课程”,也可以属于“部分”,而“部分”又属于“课程”。
Lesson安全使用锤子可能在
Course木制品以及
CourseSection木匠,基座这是一个临时模型,显示了这两类课程,以及一个独立的课程,等待决策,以及进一步的数据建模。

2关系数据模型
如果我没有展示几个中间步骤(在所要求的简单问答格式中是不可能的),请原谅我,. Here是最终的数据模型。
SELECT ),它也不是一个事实,它是完全不必要的。RecordIds是物理的;反关系的,每一个都需要额外的列和索引.
- `CourseLesson.CourseLesson` identifies the lesson within the course, such that it has meaning within the course, independent of the `LessonNo`
- `SectionLesson.SectionLesson` identifies the lesson within the section, such that it has meaning within the course and section, independent of the `LessonNo`Course是一个独占的子类型,以确保:- a simple course `Course_TypeLesson` has lessons directly, and
- a sectioned course `Course_TypeSection` has lessons attached to the section, not the course.Lesson是独立和完全定义的(一次)- `Lesson is used in` either type of `Course`
- `CourseLesson.AK` prevents the `Lesson` from being duplicated within the simple `Course`
- `SectionLesson.AK` prevents the `Lesson` from being duplicated within the sectioned `Course`.更多?
经过改进的数据模型解决了许多问题,并希望回答您的问题。但是它可能会暴露其他问题,它可能需要进一步的定义:数据建模是一项反复的任务。请随时评论。
符号表示法
发布于 2021-05-02 00:16:19
转变你的观点:如果所有的Course都可以有讲座,但只有一些讲座属于一个部分,这会解决你的问题吗?
具体地说(如果你想学的话,甚至不用看这个:D):
Lesson属于course,外键不可空.Lesson有一个section的外键,可以为空。
现在,如果lessons或sections可以属于其他课程,那就不一样了。
发布于 2021-05-02 00:57:29
最简单的方法是在Lesson**:**上有两个外键
CourseId null,
SectionId null然后在表上放置一个CHECK约束
(CourseId IS NOT NULL AND SectionId IS NULL) OR (CourseId IS NULL AND SectionId IS NOT NULL)这意味着双方都必须在场,但不能两者兼而有之。不要诱使将CourseId放在属于节的课程中,因为这在表中引入了一种非正规化:如果节移到了不同的课程,那么您需要更新所有的子课程。
--严格地说, --你真的应该有一个更复杂的设计:
Lesson CourseLesson SectionLesson
然而,这使得不可能强制执行一门课,因为它只是其中一门课的一部分。
https://stackoverflow.com/questions/67351907
复制相似问题