Database 什么时候可以在我的数据库中创建关系循环?
可能是重复的,但我想得到一个比具体设计更广泛的答案 本例中的目标是存储生成的自动测试数据。关系图的一部分如下所示Database 什么时候可以在我的数据库中创建关系循环?,database,ms-access,database-design,Database,Ms Access,Database Design,可能是重复的,但我想得到一个比具体设计更广泛的答案 本例中的目标是存储生成的自动测试数据。关系图的一部分如下所示 每个构建上可能会运行不同数量的测试,因此构建和会话之间存在直接的一对多关系 每个构建由几百个部件组成,每个部件号可用于几百个构建,因此构建和DT_部件之间存在多对多关系,通过LT_HeaderParts关联 如果在测试过程中发现装配错误,则可能会关闭一个或多个零件,并重新测试装置。我实现了PartsChangeLog来记录给定会话后所做的任何更改,而不是在每次重新测试时复制数百条
- 每个构建上可能会运行不同数量的测试,因此构建和会话之间存在直接的一对多关系
- 每个构建由几百个部件组成,每个部件号可用于几百个构建,因此构建和DT_部件之间存在多对多关系,通过LT_HeaderParts关联
- 如果在测试过程中发现装配错误,则可能会关闭一个或多个零件,并重新测试装置。我实现了PartsChangeLog来记录给定会话后所做的任何更改,而不是在每次重新测试时复制数百条零件记录
- PartsChangeLog使用DT_部件作为字典,通过存储整数而不是varchar(20)部件_编号来节省内存
这是一个好的结构吗?为什么或者为什么不?您拥有与会话相关的两组部件:构建部件(
会话->构建->>部件
)和更改部件(会话->>部件管理日志->部件
)。正如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表结构。这种结构有一个单一的“部分”实体,具有多对多的“包容”关系。这个“包含”关系被实例化为一个“包含”实体,与“部分”实体有两个关系。这两个关系中的每一个都有不同的语义(一个说“包含的部分必须是已知的部分”,另一个说“包含的部分必须是已知的部分”),因此它们必须同时保留。试图回答实际的标题问题“什么时候可以在我的数据库中创建关系循环?”
答案的一部分是,它取决于模式/图表本身的预期用途。它是否打算作为一个概念模型,用于说明业务概念?然后基本上你可以突出任何你喜欢的关系。我的意思是,如果你认为某一关系对预期的商业受众感兴趣,那么你可以突出该关系的任何形式。或者它是一个逻辑数据库模式
在这种情况下,它主要取决于关系的精确“语义”。如果两个关系在语义上是不同的,那么你可以打赌你的。。。两者都将被释放