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