什么时候可以在我的数据库中建立关系循环?

时间:2016-08-18 17:37:26

标签: database ms-access database-design

Can I avoid a relation loop in my database design?可能重复,但我希望获得比特定设计更广泛的答案。

这种情况下的目标是存储生成的自动化测试数据。关系图的一部分如下所示。

enter image description here

  • 可以在每个构建上运行可变数量的测试,因此构建和会话之间存在直接的一对多关系。
  • 每个构建由几百个部分组成,每个部分号可以在几百个构建中使用,因此通过LT_HeaderParts关联的Builds和DT_Parts之间的多对多关系。
  • 如果在测试期间发现装配错误,则可以切换一个或多个零件并重新测试该装置。我没有在每次重新测试中复制数百个部分记录,而是实现了PartsChangeLog来记录在给定会话之后所做的任何更改。
  • PartsChangeLog使用DT_Parts作为字典,通过存储整数而不是varchar(20)part_number来节省内存。

LT_HeaderParts和PartsChangeLog似乎都有使用DT_Parts的有效,非冗余原因,但是此设置会创建一个引用循环,并且存在从build_id到session_id创建错误的多对多桥的危险,这会产生错误关系。

这是一个好的结构吗?为什么或为什么不呢?

2 个答案:

答案 0 :(得分:1)

您拥有的是与会话相关联的两组部件:构建部件(session -> build ->> part)和更改部件(session ->> partschangelog -> part)。正如JJ32关联的问题的答案所解释的那样,在这些情况下,一致性是主要关注点。在这种情况下,我怀疑更改的部分集应该是构建部分的子集,但是您的模式不会强制执行此操作。

实施它的一种方法是通过受控冗余。如果在build_id中包含PartsChangeLog作为非素数属性(并相应地修改对Sessions的外键引用),则可以创建引用LT_HeaderParts的两个复合外键约束(适用于build_id, part_addedbuild_id, part_removed)。

这消除了通过多对多桥关联不一致session_idbuild_id的可能性;虽然如果没有任何部件改变,就不会有这样的桥梁。这是可以理解的,我们的目标不是取代session_idbuild_id之间的直接映射,只是为了确保一致性。其余的由查询开发人员决定。

答案 1 :(得分:1)

尝试回答实际的标题问题"什么时候可以在我的数据库中建立关系循环?"。

答案的一部分是它取决于架构/图表本身的预期用途。它是否旨在作为概念模型,旨在说明业务概念?那么基本上你可以突出你喜欢的任何关系。我的意思是,如果您认为关系对目标商业受众感兴趣,您可以以关系的形式突出显示任何内容。或者它是否作为逻辑数据库模式?

在这种情况下,它主要取决于精确的语义和#34;关系。如果两个关系说的是语义不同的东西,那么你可以打赌......这两个都与被建模的业务相关,你应该同时保留这两个。

这种循环的最简单的例子是物料清单结构。这种结构有一个单一的部件和#34;实体,具有多对多关系"遏制"。这个"收容"关系被实例化为"遏制"与"部分有关系的实体"实体。这两种关系中的每一种都有不同的语义(一种说法"包含部分必须是已知部分"另一种说"包含部分必须是已知部分")因此它们应该绝对要保持两者。