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

Database 什么时候可以在我的数据库中创建关系循环?,database,ms-access,database-design,Database,Ms Access,Database Design,可能是重复的,但我想得到一个比具体设计更广泛的答案 本例中的目标是存储生成的自动测试数据。关系图的一部分如下所示 每个构建上可能会运行不同数量的测试,因此构建和会话之间存在直接的一对多关系 每个构建由几百个部件组成,每个部件号可用于几百个构建,因此构建和DT_部件之间存在多对多关系,通过LT_HeaderParts关联 如果在测试过程中发现装配错误,则可能会关闭一个或多个零件,并重新测试装置。我实现了PartsChangeLog来记录给定会话后所做的任何更改,而不是在每次重新测试时复制数百条

可能是重复的,但我想得到一个比具体设计更广泛的答案

本例中的目标是存储生成的自动测试数据。关系图的一部分如下所示

  • 每个构建上可能会运行不同数量的测试,因此构建和会话之间存在直接的一对多关系
  • 每个构建由几百个部件组成,每个部件号可用于几百个构建,因此构建和DT_部件之间存在多对多关系,通过LT_HeaderParts关联
  • 如果在测试过程中发现装配错误,则可能会关闭一个或多个零件,并重新测试装置。我实现了PartsChangeLog来记录给定会话后所做的任何更改,而不是在每次重新测试时复制数百条零件记录
  • PartsChangeLog使用DT_部件作为字典,通过存储整数而不是varchar(20)部件_编号来节省内存
LT_HeaderParts和PartsChangeLog似乎都有使用DT_零件的有效、非冗余的理由,但这种设置会创建一个引用循环,并造成从构建id到会话id的虚假多对多桥接的危险,从而产生错误的关系


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

您拥有与会话相关的两组部件:构建部件(
会话->构建->>部件
)和更改部件(
会话->>部件管理日志->部件
)。正如JJ32对这个问题的回答所解释的那样,在这些情况下,一致性是主要关注点。在这种情况下,我怀疑更改的部分集应该是构建部分的子集,但您的模式没有强制执行这一点

强制执行的一种方法是通过受控冗余。如果将
build\u id
作为非基本属性包含在
PartsChangeLog
中(并相应地修改对
会话的外键引用),则可以创建两个引用
LT\u HeaderParts
的复合外键约束(对于
build\u id,添加了部分
build\u id,删除了部分


这消除了通过多对多桥接器将不一致的
会话id
构建id
关联起来的可能性;如果不更换零件,就不会有这样的桥梁。这是可以理解的,我们的目标不是取代
session\u id
build\u id
之间的直接映射,只是为了确保一致性。其余部分由查询开发人员决定。

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

强制执行的一种方法是通过受控冗余。如果将
build\u id
作为非基本属性包含在
PartsChangeLog
中(并相应地修改对
会话的外键引用),则可以创建两个引用
LT\u HeaderParts
的复合外键约束(对于
build\u id,添加了部分
build\u id,删除了部分


这消除了通过多对多桥接器将不一致的
会话id
构建id
关联起来的可能性;如果不更换零件,就不会有这样的桥梁。这是可以理解的,我们的目标不是取代
session\u id
build\u id
之间的直接映射,只是为了确保一致性。其余部分由查询开发人员决定。

试图回答实际的标题问题“什么时候可以在我的数据库中进行关系循环?”

答案的一部分是,它取决于模式/图表本身的预期用途。它是否打算作为一个概念模型,用于说明业务概念?然后基本上你可以突出任何你喜欢的关系。我的意思是,如果你认为某一关系对预期的商业受众感兴趣,那么你可以突出该关系的任何形式。或者它是一个逻辑数据库模式

在这种情况下,它主要取决于关系的精确“语义”。如果两个关系在语义上是不同的,那么你可以打赌你的。。。这两者都将与正在建模的业务相关,并且您应该保留这两者


这种循环的最简单示例是BOM表结构。这种结构有一个单一的“部分”实体,具有多对多的“包容”关系。这个“包含”关系被实例化为一个“包含”实体,与“部分”实体有两个关系。这两个关系中的每一个都有不同的语义(一个说“包含的部分必须是已知的部分”,另一个说“包含的部分必须是已知的部分”),因此它们必须同时保留。

试图回答实际的标题问题“什么时候可以在我的数据库中创建关系循环?”

答案的一部分是,它取决于模式/图表本身的预期用途。它是否打算作为一个概念模型,用于说明业务概念?然后基本上你可以突出任何你喜欢的关系。我的意思是,如果你认为某一关系对预期的商业受众感兴趣,那么你可以突出该关系的任何形式。或者它是一个逻辑数据库模式

在这种情况下,它主要取决于关系的精确“语义”。如果两个关系在语义上是不同的,那么你可以打赌你的。。。两者都将被释放