循环参考数据库的例外 - 这是一个吗?

时间:2010-04-29 13:59:28

标签: database database-design circular-reference

我有4个表,链接在一个循环引用中 - 我记得大学时我被告知这很糟糕但有例外......我希望这是其中之一:)

我的数据库包含4个表格;教师,班级,科目和教师班级。

以下总结了我的关系:

  • 老师可以有很多课程
  • 一个班级可以有很多老师(所以教师班级在这里取消了多对多)。
  • 课程可以有很多科目
  • 主题只能有1个类
  • 老师可以有很多科目

如果你可以看到这个,我的ERD看起来像一个正方形(或圆圈)......我已经构建了我的简单应用程序,并且被其他人提示检查这个问题..请有人告诉我这是一个例外为什么?我记不起有关这方面的任何内容,但我的应用程序似乎对我想要它的工作完全正常!

1 个答案:

答案 0 :(得分:2)

循环引用可能有几个原因:

  1. 如果必须的关系存在(即,教师必须有一个班级,而班级必须有教师,从业务和技术要求的角度来看,你遇到了一个鸡蛋或鸡蛋的场景:你不能在没有班级的情况下添加老师,也不能在没有老师的情况下添加班级。
  2. 很难弄清楚heirarchy的“顶部”是什么(因为,实际上,没有“顶部”)
  3. 假设你可以让没有课程和/或没有课程的科目的教师,听起来这两个中的一个将是“顶级”(从商业角度来看,我认为它将是主题)。

    如果您的工作正常,我没有看到设计的问题,也没有看到另一种设计方法。


    在评论后修改

    片面依赖没有问题(这就是普通的'不可空的外键')。

    我觉得我应该根据你的评论指出一些事情:对循环依赖的反对意见是技术,而不是逻辑。如果企业说没有没有教师就没有老师,没有老师就没有课程,这很好;你无法以这种方式建模数据,或者你永远无法添加任何东西。您必须定义哪些对象(类或教师)可以单独存在(从技术角度而非业务角度)。

    你在教师和班级之间有一个M:M关系,这有点挽救你,因为这迫使你使两个能够独立存在(因为连接是在链接表,而不是参与者表本身。

    因此,您没有真正的循环依赖关系。您的业​​务逻辑是循环的,但这没关系,因为您可以完全控制其运行方式。你的布局看起来像这样:

       Teacher <----- TeacherClass -----> Class
          ^                                 ^
          |                                 |
          |                                 |
    TeacherSubject --------------------> Subject
    

    (如果教师可以有多个科目)

    或者这个:

       Teacher <----- TeacherClass -----> Class
          |                                 ^
          |                                 |
          |                                 |
          \----------------------------> Subject
    

    (如果教师只能有一个科目)

    或者这个:

       Teacher <----- TeacherClass -----> Class
          ^                                 ^
          |                                 |
          |                                 |
          \----------------------------- Subject
    

    (如果主题只能有一位老师)

    在第一种情况下,TeacherClass都是顶级实体,因为它们都没有指向其他任何内容(链接表完成此操作)。在第二个中,只有Class是顶级实体。

    只要在路径的某个地方有一个顶层实体,你就可以了。在第一个中,您可以按以下顺序添加记录:

    Teacher -> Class -> (TeacherClass -> Subject) -> TeacherSubject
    

    (我在parens中附上TeacherClass -> Subject,因为您可以按任意顺序添加这些内容)

    在第二个中,您可以按以下顺序添加它们:

    Class -> Subject -> Teacher -> TeacherClass
    

    在第三个中,您可以按以下顺序添加它们:

    Class -> Teacher -> (TeacherClass -> Subject)
    

    因此,从技术角度来看,您没有真正的循环依赖。