我有4个表,链接在一个循环引用中 - 我记得大学时我被告知这很糟糕但有例外......我希望这是其中之一:)
我的数据库包含4个表格;教师,班级,科目和教师班级。
以下总结了我的关系:
如果你可以看到这个,我的ERD看起来像一个正方形(或圆圈)......我已经构建了我的简单应用程序,并且被其他人提示检查这个问题..请有人告诉我这是一个例外为什么?我记不起有关这方面的任何内容,但我的应用程序似乎对我想要它的工作完全正常!
答案 0 :(得分:2)
循环引用可能有几个原因:
假设你可以让没有课程和/或没有课程的科目的教师,听起来这两个中的一个将是“顶级”(从商业角度来看,我认为它将是主题)。
如果您的工作正常,我没有看到设计的问题,也没有看到另一种设计方法。
在评论后修改
片面依赖没有问题(这就是普通的'不可空的外键')。
我觉得我应该根据你的评论指出一些事情:对循环依赖的反对意见是技术,而不是逻辑。如果企业说没有没有教师就没有老师,没有老师就没有课程,这很好;你无法以这种方式建模数据,或者你永远无法添加任何东西。您必须定义哪些对象(类或教师)可以单独存在(从技术角度而非业务角度)。
你在教师和班级之间有一个M:M关系,这有点挽救你,因为这迫使你使两个能够独立存在(因为连接是在链接表,而不是参与者表本身。
因此,您没有真正的循环依赖关系。您的业务逻辑是循环的,但这没关系,因为您可以完全控制其运行方式。你的布局看起来像这样:
Teacher <----- TeacherClass -----> Class
^ ^
| |
| |
TeacherSubject --------------------> Subject
(如果教师可以有多个科目)
或者这个:
Teacher <----- TeacherClass -----> Class
| ^
| |
| |
\----------------------------> Subject
(如果教师只能有一个科目)
或者这个:
Teacher <----- TeacherClass -----> Class
^ ^
| |
| |
\----------------------------- Subject
(如果主题只能有一位老师)
在第一种情况下,Teacher
和Class
都是顶级实体,因为它们都没有指向其他任何内容(链接表完成此操作)。在第二个中,只有Class
是顶级实体。
只要在路径的某个地方有一个顶层实体,你就可以了。在第一个中,您可以按以下顺序添加记录:
Teacher -> Class -> (TeacherClass -> Subject) -> TeacherSubject
(我在parens中附上TeacherClass -> Subject
,因为您可以按任意顺序添加这些内容)
在第二个中,您可以按以下顺序添加它们:
Class -> Subject -> Teacher -> TeacherClass
在第三个中,您可以按以下顺序添加它们:
Class -> Teacher -> (TeacherClass -> Subject)
因此,从技术角度来看,您没有真正的循环依赖。