数据库设计:如何对一个表可以属于另外两个表中的任何一个的关系进行建模?

Ami*_*adi 4 database database-design relational-database

我有三个实体:

  1. 课程
  2. 部分

每门“课程”由若干“课”组成。课程中的“课程”可以分为“部分”,也可以不分为“部分”。

因此,课程的内容可能如下所示:

Foo Course:
    Lesson 1
    Lesson 2
    Lesson 3
    Lesson 4
Run Code Online (Sandbox Code Playgroud)

或者像这样:

Bar Course:
    Section 1:
        Lesson 1
        Lesson 2
    Section 2:
        Lesson 3
        Lesson 4
Run Code Online (Sandbox Code Playgroud)

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

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

我正在努力找出如何最好地在关系数据库中实现这样的结构。

如果每个“课程”都必须属于一个“部分”,那就很容易了,我可以简单地有一个“课程”表,一个带有“CourseId”列的“部分”表,以及一个带有“课程”表的“课程”表“SectionId”列。

但我的情况并不那么简单。“部分”可能作为“课程”和多个“课程”之间的中间人存在,但也可以不存在,在这种情况下,“课程”直接具有“课程”,而不存在“部分”。

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

谢谢。

Per*_*DBA 7

1 进度要求

\n
\n

课程可以直接有“课程”,也可以有“部分”,而“部分”又有“课程”。\xc2\xa0\xc2\xa0\na“课程”可以直接属于“课程”,也可以属于属于“课程”的“部分”。

\n
\n
    \n
  1. 尽管您给出了一些规则,但还有其他规则是隐含的,而不是明确的。\xc2\xa0\xc2\xa0我们需要使它们明确。
  2. \n
  3. 还有其他考虑因素,需要评估和确定。\xc2\xa0\xc2\xa0\n例如。到底什么是教训?\n
      \n
    • 课程是否独立,以便可以在多个课程中使用,而无需重复课程?
      \n Lesson[安全使用锤子] 可能在
      \n Course[木制品] 以及
      \n CourseSection[木工,基础知识]`
    • \n
    • 课程是否依赖于课程[和部分],因此该结构是独特的?
    • \n
    • 我假设是前者。
    • \n
    \n
  4. \n
\n

这是一个临时模型,显示两种类型的课程和一个独立的课程,等待决策和进一步的数据建模。\xc2\xa0\xc2\xa0重复的元素显示为红色。\n非标准化表格,用于理解

\n

2 关系数据模型

\n

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

\n
    \n
  • 标准化意味着数据库中没有空值

    \n
  • \n
  • 可空外键是特别坏消息,严格禁止

    \n
  • \n
  • “虚拟记录”不仅尴尬和可怕(影响每个SELECT访问表的人),它不是事实,而且完全没有必要

    \n
  • \n
  • RecordIds是身体上的;反关系型,每个都需要额外的列和索引。\n关系型、标准化

    \n
  • \n
  • 这使用关系键(由数据组成),它提供关系完整性(与引用完整性不同)

    \n
      \n
    • CourseLesson.CourseLesson标识课程中的课程,使其在课程中具有意义,独立于课程内容LessonNo
    • \n
    • SectionLesson.SectionLesson标识该部分中的课程,使其在课程和部分中具有意义,独立于课程LessonNo
    • \n
    \n
  • \n
  • Course是独占子类型,以确保:

    \n
      \n
    • 简单的课程Course_TypeLesson直接有课,并且
    • \n
    • 分段课程的Course_TypeSection课程附加到该部分,而不是课程。
    • \n
    \n
  • \n
  • Lesson是独立且完全定义的(一次)

    \n
      \n
    • Lesson is used in任一类型Course
    • \n
    • CourseLesson.AK防止Lesson在简单的情况下重复Course
    • \n
    • SectionLesson.AK防止Lesson在分段内重复Course
    • \n
    \n
  • \n
\n

更多的 ?

\n

进步的数据模型解决了许多问题,并希望回答您的问题。\xc2\xa0\xc2\xa0但它可能会暴露其他人,可能需要进一步定义:数据建模是一项迭代任务。\xc2\xa0\xc2\xa0请随意评论。

\n

符号

\n
    \n
  • 我的所有数据模型均在IDEF1X中呈现,IDEF1X 是自 1993 年以来的关系数据库建模标准。
  • \n
  • 对于那些刚接触关系模型或其建模方法的人来说,我的IDEF1X 简介是必不可少的读物。请注意,IDEF1X 模型具有丰富的细节和精度,显示了所有必需的细节,而本土模型由于不了解标准的要求,因此定义要少得多。这意味着,需要完全理解该符号。
  • \n
  • 有关子类型的完整定义和使用注意事项,请参阅子类型定义
  • \n
\n