数据库设计中的循环关系

时间:2014-03-20 01:47:00

标签: database-design

我有一个包含4个表的数据库(还有更多,但只有4个导致问题)。规则是:模型具有1到多个任务。任务具有一对多集。 SuperSet具有一对多集合,而Model具有一对多SuperSet。 SuperSet基本上只是一组集合。该设计导致了一个循环外观依赖图,如下所示:

Models <--------------------------- SuperSets
   ^                                    ^
   |                                    |
   |                                    |
Tasks  <---------------------------- Sets

我已经阅读了这个http://www.codeproject.com/Articles/38655/Prevent-Circular-References-in-Database-Design,但我无法摆脱任何表格,第二个例子与我的不同。我已经读过,循环关系是不可取的,但我真的没有看到任何解决这个问题的方法。这甚至是一个问题,如果是这样,我该如何解决?请帮帮我!

2 个答案:

答案 0 :(得分:6)

您的设计不是循环的。

顶级Models有2个子表TasksSupersets。然后是最低级别的Sets。这些级别都没有回到更高级别的表格。

这很好,不会造成任何问题。

答案 1 :(得分:6)

如前所述,您的模型中没有循环引用。箭头不会围成一圈。

也许你担心Sets可以通过两个不同的父母到达祖父母Models。这是一个合理的问题,可以通过确保Models的主键是其他三个表的主键的一部分来解决。

使用外键,这可以确保Sets中的每一行都属于一个模型。

所以设计如下:

  • Model表的主键为ModelId
  • Tasks表的主键为ModelId,其他内容为TaskNumberModelId也是Models的外键。
  • SuperSets表的主键为ModelId,其他内容为SuperSetNumberModelId也是Models的外键。
  • Sets的主键为ModelIdTaskNumberSuperSetNumber。它的外键为TasksSuperSets

在此设计中,因为单列Sets.ModelId是两个外键的一部分,所以强制执行数据完整性。