Can I avoid a relation loop in my database design?可能重复,但我希望获得比特定设计更广泛的答案。
这种情况下的目标是存储生成的自动化测试数据。关系图的一部分如下所示。
LT_HeaderParts和PartsChangeLog似乎都有使用DT_Parts的有效,非冗余原因,但是此设置会创建一个引用循环,并且存在从build_id到session_id创建错误的多对多桥的危险,这会产生错误关系。
这是一个好的结构吗?为什么或为什么不呢?
答案 0 :(得分:1)
您拥有的是与会话相关联的两组部件:构建部件(session -> build ->> part
)和更改部件(session ->> partschangelog -> part
)。正如JJ32关联的问题的答案所解释的那样,在这些情况下,一致性是主要关注点。在这种情况下,我怀疑更改的部分集应该是构建部分的子集,但是您的模式不会强制执行此操作。
实施它的一种方法是通过受控冗余。如果在build_id
中包含PartsChangeLog
作为非素数属性(并相应地修改对Sessions
的外键引用),则可以创建引用LT_HeaderParts
的两个复合外键约束(适用于build_id, part_added
和build_id, part_removed
)。
这消除了通过多对多桥关联不一致session_id
和build_id
的可能性;虽然如果没有任何部件改变,就不会有这样的桥梁。这是可以理解的,我们的目标不是取代session_id
和build_id
之间的直接映射,只是为了确保一致性。其余的由查询开发人员决定。
答案 1 :(得分:1)
尝试回答实际的标题问题"什么时候可以在我的数据库中建立关系循环?"。
答案的一部分是它取决于架构/图表本身的预期用途。它是否旨在作为概念模型,旨在说明业务概念?那么基本上你可以突出你喜欢的任何关系。我的意思是,如果您认为关系对目标商业受众感兴趣,您可以以关系的形式突出显示任何内容。或者它是否作为逻辑数据库模式?
在这种情况下,它主要取决于精确的语义和#34;关系。如果两个关系说的是语义不同的东西,那么你可以打赌......这两个都与被建模的业务相关,你应该同时保留这两个。
这种循环的最简单的例子是物料清单结构。这种结构有一个单一的部件和#34;实体,具有多对多关系"遏制"。这个"收容"关系被实例化为"遏制"与"部分有关系的实体"实体。这两种关系中的每一种都有不同的语义(一种说法"包含部分必须是已知部分"另一种说"包含部分必须是已知部分")因此它们应该绝对要保持两者。