首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据库设计:如何建模一个表可以属于另外两个表之一的关系?

数据库设计:如何建模一个表可以属于另外两个表之一的关系?
EN

Stack Overflow用户
提问于 2021-05-02 00:08:16
回答 3查看 493关注 0票数 1

我有三个实体:

  1. 课程
  2. 部分
  3. 课程

每个“课程”都由几个“课程”组成。课程中的“课程”,可以分为“部分”,也可以不归为“部分”。

因此,一门课程的内容可以是这样的:

代码语言:javascript
复制
Foo Course:
    Lesson 1
    Lesson 2
    Lesson 3
    Lesson 4

或者像这样:

代码语言:javascript
复制
Bar Course:
    Section 1:
        Lesson 1
        Lesson 2
    Section 2:
        Lesson 3
        Lesson 4

因此,换句话说,一门课程可以直接上“课”,也可以有“节”,而“节”又有“课”。

从另一个角度来看,“课程”可以直接属于“课程”,也可以属于“部分”,而“部分”又属于“课程”。

我很难在关系数据库中实现这个结构。

如果每个“课程”都必须属于“部分”,那就很简单了,我只需要一个“课程”表、一个“章节”表和一个"CourseId“列,以及一个”课程“表和一个"SectionId”列。

但我的设想并不是那么简单。“部分”可能作为“课程”和若干“课程”之间的中间人存在,但也可能没有,在这种情况下,“课程”直接有“课程”,没有“部分”。

对于如何在关系数据库的上下文中理想地实现这样的结构,我将不胜感激。

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2021-05-06 00:55:59

1进度要求

一门课程可以直接有“课程”,也可以有“部分”,而“课程”又可以是“课程”(.  )--“课程”可以直接属于“课程”,也可以属于“部分”,而“部分”又属于“课程”。

  1. 虽然你已经给出了一些规则,但有些规则是隐含的,而不是明确的。我们需要把它们明确化。
  2. 还有其他需要评估和确定的考虑因素。确切地说,是什么课?
    • 课程是否是独立的,这样就可以在多个课程中使用,而不会重复上课? Lesson安全使用锤子可能在 Course木制品以及 CourseSection木匠,基座
    • 课程是否取决于课程和章节,因而是该结构所独有的?
    • 我会假设前者。

这是一个临时模型,显示了这两类课程,以及一个独立的课程,等待决策,以及进一步的数据建模。

2关系数据模型

如果我没有展示几个中间步骤(在所要求的简单问答格式中是不可能的),请原谅我,.  Here是最终的数据模型。

  • 规范化意味着数据库中没有空。
  • 无边无际的外国钥匙是特别坏的消息,严格禁止
  • “虚拟记录”不仅是尴尬和可怕的(影响访问该表的每个SELECT ),它也不是一个事实,它是完全不必要的。
  • RecordIds是物理的;反关系的,每一个都需要额外的列和索引.
  • 它使用关系键(由数据组成),它提供关系完整性(不同于引用完整性)
代码语言:javascript
复制
- `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是一个独占的子类型,以确保:
代码语言:javascript
复制
- a simple course `Course_TypeLesson` has lessons directly, and
- a sectioned course `Course_TypeSection` has lessons attached to the section, not the course.
  • Lesson是独立和完全定义的(一次)
代码语言:javascript
复制
- `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`.

更多?

经过改进的数据模型解决了许多问题,并希望回答您的问题。但是它可能会暴露其他问题,它可能需要进一步的定义:数据建模是一项反复的任务。请随时评论。

符号表示法

  • 我所有的数据模型都是在IDEF1X中呈现的,这是自1993年以来建立关系数据库的标准。
  • 我的IDEF1X简介对于那些刚接触到关系模型或它的建模方法的人来说是非常重要的。请注意,IDEF1X模型具有丰富的细节和精确性,显示了所有所需的细节,而本土的模型由于不了解标准的要求,所以定义要少得多。这意味着,这个符号需要被完全理解。
  • 有关完整的定义和使用注意事项,请参阅子类型定义
票数 5
EN

Stack Overflow用户

发布于 2021-05-02 00:16:19

转变你的观点:如果所有的Course都可以有讲座,但只有一些讲座属于一个部分,这会解决你的问题吗?

具体地说(如果你想学的话,甚至不用看这个:D):

Lesson属于course,外键不可空.Lesson有一个section的外键,可以为空。

现在,如果lessonssections可以属于其他课程,那就不一样了。

票数 0
EN

Stack Overflow用户

发布于 2021-05-02 00:57:29

最简单的方法是在Lesson**:**上有两个外键

代码语言:javascript
复制
CourseId null,
SectionId null

然后在表上放置一个CHECK约束

代码语言:javascript
复制
(CourseId IS NOT NULL AND SectionId IS NULL) OR (CourseId IS NULL AND SectionId IS NOT NULL)

这意味着双方都必须在场,但不能两者兼而有之。不要诱使CourseId放在属于节的课程中,因为这在表中引入了一种非正规化:如果节移到了不同的课程,那么您需要更新所有的子课程。

--严格地说, --你真的应该有一个更复杂的设计:

Lesson CourseLesson SectionLesson

然而,这使得不可能强制执行一门课,因为它只是其中一门课的一部分。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67351907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档