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

时间:2009-07-03 14:14:05

标签: database-design

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

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

COLOR
 !Id
 +MultiColorGroupId

MULTICOLOR
  !Id
  +MultiColorGroupId
  +ColorId
  +Type

这可以非常清晰地包含我需要的所有信息。 我认为唯一可能发生的事情是我得到一个循环引用,其中颜色本身就是childColor。 目前,捕获这一点的唯一方法是在数据库或应用程序中构建插入检查。由于圆参考可以是任意深度的,并且当前结构可能相当宽,我宁愿选择更确定的数据结构。

有没有更好的方法来定义它?

3 个答案:

答案 0 :(得分:1)

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

我的食谱也有类似的问题。酸奶制作酸奶(选择一个常见的例子),所以我们必须支持存储,并在检索上加上逻辑,以确保给定的成分只爆炸一次。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我认为你必须在代码中执行此操作,尽管我会警告不要使用触发器 - 正如您所指出的那样,触发器的成本将比线性关系更糟糕,具体取决于您的结构的复杂程度。

在包含集合的代码中,这是一个非常简单的问题需要解决。

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

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