Database design 这个循环数据参考可以设计得更好吗?

Database design 这个循环数据参考可以设计得更好吗?,database-design,Database Design,我有关于颜色的数据。 其中一些颜色由多种颜色组合而成。 其中一种组合理论上可以是另一种组合颜色。 对于组合颜色,我需要定义一些关于“子”颜色的属性 我目前的数据库定义如下: COLOR !Id +MultiColorGroupId MULTICOLOR !Id +MultiColorGroupId +ColorId +Type 这可以包含所有的信息,我需要在一个相当明确的方式。 我认为唯一可能发生的事情是,我得到一个循环引用,其中一种颜色本身就是childColor。 目

我有关于颜色的数据。 其中一些颜色由多种颜色组合而成。 其中一种组合理论上可以是另一种组合颜色。 对于组合颜色,我需要定义一些关于“子”颜色的属性

我目前的数据库定义如下:

COLOR
 !Id
 +MultiColorGroupId

MULTICOLOR
  !Id
  +MultiColorGroupId
  +ColorId
  +Type
这可以包含所有的信息,我需要在一个相当明确的方式。 我认为唯一可能发生的事情是,我得到一个循环引用,其中一种颜色本身就是childColor。 目前唯一的方法是在数据库或应用程序中构建一个insert检查。由于循环引用可能很深,而当前结构可能相当宽,因此我更喜欢更具确定性的数据结构


是否有更好的方法来定义此选项?

如果这些表有接口(SQL除外),则可以轻松地从可用选项中排除所有“非法”选项。否则,可以使用插入和更新触发器或检查约束。

我认为您必须在代码中这样做,尽管我会警告不要使用触发器-正如您指出的,触发器的成本将比线性关系糟糕得多,这取决于您的结构有多复杂

在带有集合的代码中,这是一个非常简单的问题

实际上,您的表定义无法定义这个场景,它是一个规则,是数据本身的属性,而不是存储结构


至于数据结构,我提出了相同的结构。

如果深度可以是任意的,那么就无法解决数据结构中的问题。要考虑的是,如果自引用实际上存储在数据库中,这是否是一个问题。也许应该由检索代码来确保它不会无限地读取数据


我对食物配方也有类似的问题。制作酸奶需要酸奶(选择一个常见的例子),因此我们必须支持存储酸奶,并在检索过程中加入逻辑,以确保给定成分只爆炸一次。

显而易见的答案-将检查结果建立到数据库中。或许可以将问题扩展到解释为什么这不是一个选项?问题是,这个循环可能会任意深入,因此每次检查都可能会花费高昂的成本。但到目前为止,插入触发器是我见过的最好的东西:)