[英]Rails — How to setup model that can belong to either of 3 different models
[英]Database design: How to model a relationship where a table can belong to either of two other tables?
我有三个实体:
每个“课程”由几个“课程”组成。 课程中的“课程”可以分类为“部分”,也可以不分类。
因此,课程的内容可能如下所示:
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”列。
但我的情况并不那么简单。 “部分”可能作为“课程”和几个“课程”之间的中间人存在,但它也可以不存在,在这种情况下,“课程”直接具有“课程”而没有“部分”。
对于如何在关系数据库的上下文中理想地实现这种结构的任何建议,我将不胜感激。
谢谢。
一门课程可以直接有“课程”,也可以有“部分”,然后有“课程”。 “课程”可以直接属于“课程”,也可以属于“部分”,而“部分”又属于“课程”。
Lesson
[安全使用锤子]可能在Course
[木制品] 以及CourseSection
[木工,基础]`这是一个临时的 model,显示了两种类型的课程,以及一个独立的课程,等待决策和进一步的数据建模。 重复的元素以红色显示。
如果我没有展示几个中间步骤(在要求的简单问答格式中不可能),请原谅我。 这是最终数据 model。
规范化意味着数据库中没有空值
可空外键是特别坏消息,严格禁止
“虚拟记录”不仅尴尬和可怕(影响每个访问表的SELECT
),它不是事实,完全没有必要
RecordIds
是物理的; 反关系,每个都需要一个额外的列和索引。
这使用关系键(由数据组成),它提供关系完整性(不同于参照完整性)
CourseLesson.CourseLesson
标识课程中的课程,使其在课程中有意义,独立于LessonNo
SectionLesson.SectionLesson
标识该部分中的课程,使其在课程和部分中具有意义,独立于LessonNo
Course
是独占子类型,以确保:
Course_TypeLesson
直接有课程,并且Course_TypeSection
有附加到该部分的课程,而不是课程。 Lesson
是独立且完全定义的(一次)
Lesson is used in
任一类型的Course
CourseLesson.AK
防止Lesson
在简单Course
中重复SectionLesson.AK
防止Lesson
在分段Course
中重复。进度数据 model 解决了很多问题,希望能回答您的问题。 但它可能会暴露其他人,它可能需要进一步定义:数据建模是一项迭代任务。 请随意发表评论。
转变你的观点:如果所有Course
都可以有讲座,但只有一些讲座属于一个部分,那会解决你的问题吗?
具体而言(如果您想学习,甚至不必费心阅读此内容:D):
Lesson
属于course
,外键,不可为空。 Lesson
有一个section
的外键,可以为空。
现在,如果lessons
或sections
可以属于其他课程,那就另当别论了。
最简单的方法是在Lesson
上有两个外键:
CourseId null,
SectionId null
然后在表上放置一个CHECK
约束
(CourseId IS NOT NULL AND SectionId IS NULL) OR (CourseId IS NULL AND SectionId IS NOT NULL)
这意味着任何一个都必须存在,但不能同时存在。 不要试图将CourseId
放在属于某个 Section 的 Lesson 上,因为这会在表中引入非规范化:如果 Section 移动到不同的 Course,那么您将需要更新所有子课程。
严格来说,你真的应该有一个更复杂的设计:
Lesson
CourseLesson
SectionLesson
但是,这使得无法强制将课程仅作为其中一个或另一个的一部分。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.