【问题标题】:An exception for a circular reference database - is this one?循环参考数据库的一个例外——是这个吗?
【发布时间】:2010-04-29 13:59:27
【问题描述】:

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

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

以下总结了我的关系:

  • 一个老师可以有很多课
  • 一个班级可以有很多老师(因此,teachers_classes 消除了这里的多对多)。
  • 一个班级可以有很多科目
  • 一个学科只能有一个类
  • 一个老师可以有很多科目

如果您可以想象一下,我的 ERD 看起来像一个正方形(或圆形)...我已经构建了我的简单应用程序,并被其他人提示检查此问题..请有人告诉我这是一个例外为什么?我不记得我被教过的任何东西,但我的应用程序似乎完全可以正常工作!

【问题讨论】:

  • 哪个表包含教师-科目关系?
  • 不存在教师-学科关系,一个学科只能有1个教师!这是我计划为进一步的工作而改变的东西

标签: database database-design circular-reference


【解决方案1】:

由于以下几个原因,循环引用可能不好:

  1. 在关系必须存在的情况下(即,教师必须有班级,班级必须有教师,两者从业务和技术需求的角度来看),您会遇到先有鸡还是先有蛋的场景:您无法添加没有课程的老师,也无法添加没有老师的课程。
  2. 很难弄清楚层次结构的“顶部”是什么(因为说实话,没有“顶部”)

假设您可以有没有课程的老师和/或没有课程的科目,听起来这两者中的一个将是“顶级”(从商业角度来看,我假设它会是科目)。

如果您所拥有的一切正常,我认为设计没有问题,也没有其他设计方法。


评论后编辑

单向依赖没有问题(这就是普通的不可为空的外键)。

根据您的评论,我觉得我也应该指出一些事情:对循环依赖的反对意见是技术上的,而不是逻辑上的。如果企业说没有课就没有老师,没有老师就没有课,那很好;您只是无法以这种方式对数据进行建模,否则您将永远无法添加任何内容。您必须定义哪些对象(班级或教师)可以独立存在(从技术角度,而不是业务角度)。

您在教师和班级之间存在 M:M 关系这一事实在一定程度上拯救了您,因为这迫使您使 两者 能够孤立地存在(因为这种联系是在链接表,而不是参与者表本身。

因此,您没有真正的循环依赖。您的业​​务逻辑是循环的,但这很好,因为您可以完全控制它的运行方式。您的布局如下所示:

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

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

或者这个:

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

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

或者这个:

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

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

在第一种情况下,TeacherClass 都是顶级实体,因为它们都不指向其他任何东西(链接表完成了这一点)。第二种,只有Class是顶级实体。

只要路径上的某处存在顶级实体,就可以了。首先,您可以按以下顺序添加记录:

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

(我将TeacherClass -&gt; Subject 括在括号中,因为您可以按任何顺序添加它们)

第二个,可以按这个顺序添加:

Class -> Subject -> Teacher -> TeacherClass

第三个,可以按这个顺序添加:

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

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

【讨论】:

  • 感谢您的回复 Adam,您在 (1) 中提到的鸡肉和鸡蛋 scnerio 是我所拥有的,但实际上是我需要的吗?因为如果没有为班级分配教师就无法创建班级,但是您可以在没有班级的情况下添加教师。我真的没有一张“顶级”桌子,应该有一张吗?你不能有没有课的科目;教师被创建,然后是班级(分配给教师),然后是学科(分配给班级),如果有意义的话......
  • 感谢亚当的更新答案...我真的应该提到一个老师可以有很多科目,但是一个科目只能有一个老师...所以我认为你的第二个例子适用于我更是如此。谢谢。
  • @Yvonne:谢谢,你提出了我没有考虑到的第三种可能性。虽然这已经解决了您的问题并被接受,但我已经编辑了我的答案以包含该场景。
  • 这是一个完美的答案。非常感谢。我试图理解为什么循环引用不好
猜你喜欢
  • 2016-11-17
  • 1970-01-01
  • 2019-06-14
  • 2018-09-30
  • 1970-01-01
  • 2010-09-11
  • 2011-02-22
  • 2022-12-17
相关资源
最近更新 更多