0

以下用例一直在困扰着我,它总是让我很烦恼,我并不真正了解这个解决方案。最近我碰到它一次:使用4表循环引用的表完整性

  • object已经0以上objectProperties;
  • an object用于1个或多个operations;
  • 部分operations使用1个或多个objectPropertiesobject他们在(0或更多关系)上操作;
  • an objectProperty将用于1个或多个operations

这使我下面的数据库设计:
circular referential integrity problem erd
注:表名是由为了说明问题


我的问题是

  • 这个db设计是否正确他说用例?
  • 是否有任何方法来强制引用完整性的用例如数据库引擎*中所述?

*)我可以执行我的应用程序代码的这一规则,但在我看来是相当脆弱的,所以我宁愿看到制约我的数据模型执行的完整性,如果在所有可能的。

+1

从来没有在任何情况下通过除数据库以外的任何事情强制数据或参照完整性。这将导致100%的错误数据。应用程序不是唯一可以更改数据库数据的东西。 – HLGEM

+0

也不要使用面向对象的原则来设计数据库。如果您有任何类型的循环引用,则数据库设计不正确。没有更多的信息,IT很难说实际的设计应该是什么。 – HLGEM

+0

@HLGEM,感谢您的支持,最大的问题仍然是:如何在OP中提供的用例中强制执行完整性? – Monika

回答

1

你的图正确地代表了所述的要求。

要强制执行参照完整性,可以将objectId添加到operationUsingObjectProperty表中。然后,您可以在objectId, objectPropertyIdobjectId, operationId上创建复合外键约束。

+0

在一个稍微复杂的模式中,'objectId'必须被添加到一系列表格中才能完成循环完整性,我猜...是否将'objectId'添加到'operationUsingObjectProperty'被认为是非规范化? – Monika

+0

是的,通过包含传递依赖关系,我们将非规范化为2NF。但是,FK约束将防止更新异常。还可以使用更昂贵的检查约束来将'objectProperty'与'operation'联合起来,以确保完整性而不会非规范化。 – reaanb