Database design 数据库设计中的循环关系

Database design 数据库设计中的循环关系,database-design,Database Design,我有一个包含4个表的数据库(还有更多的表,但只有4个表导致了问题)。规则是:一个模型有1到多个任务。一个任务有一对多个集合。超集有一对多集,模型有一对多超集。超集基本上只是一组集合的列表。该设计产生了一个圆形依赖关系图,如下所示: Models <--------------------------- SuperSets ^ ^ | |

我有一个包含4个表的数据库(还有更多的表,但只有4个表导致了问题)。规则是:一个模型有1到多个任务。一个任务有一对多个集合。超集有一对多集,模型有一对多超集。超集基本上只是一组集合的列表。该设计产生了一个圆形依赖关系图,如下所示:

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

模型您的设计不是圆形的

顶层有
模型
,有两个子表
任务
超集
。然后在最底层有
集合
。所有级别都不会返回到更高级别的表


这很好,不会引起任何问题。

如前所述,您的模型中没有循环引用。这些箭头不是绕着一圈的

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

外键就位后,这将确保
集合中的每一行只属于一个模型

因此,设计如下:

  • Model
    表的主键为
    ModelId
  • Tasks
    表有一个主键
    ModelId
    和其他一些东西,比如
    TaskNumber
    ModelId
    也是
    Models
    的外键
  • SuperSets
    表有一个主键
    ModelId
    ,还有其他一些东西,比如说
    SuperSetNumber
    ModelId
    也是
    Models
    的外键
  • Sets
    的主键为
    ModelId
    TaskNumber
    SuperSetNumber
    。它的外键可以是
    任务
    超集

在这种设计中,由于单列
集合.ModelId
是两个外键的一部分,因此数据完整性得到加强。

假设在示例图中放置了正确的方向箭头,我看不到任何循环。模型有任务和超集,任务有集,超集有集。根据我发布的链接,这种设计很糟糕。我想投票,看看共识是什么谢谢,我选择了这个作为接受的建议,以确保模型pk是其他三个表pk的一部分。