如果更改行,如何保留历史关系数据?在此示例中,允许用户随时编辑Property表中的行。测试可以包含任意数量的属性。如果他们在“属性”表中编辑“名称”字段,或在“属性”表中删除一行,则“测试行”可能不会在测试时保留条件。您是否会通过添加属性名称列并删除TestProperty映射表来更改Test表的设计?属性名称列必须类似于分隔的字符串列表。问题通常是如何处理的?
3张表:
Test:
TestId AUTONUMBER,
Name CHAR,
TestDate DATE
Property:
PropertyId AUTONUMBER,
Name CHAR
TestProperty: (maps properties to tests)
TestId
PropertyId
答案 0 :(得分:3)
我认为问题没有得到充分回答。
如果他们编辑属性表中的“名称”字段...您是否会通过添加属性名称列并删除TestProperty映射表来更改Test表的设计?
绝对不是。这将无意中增加大量重复。
如果您的要求是在测试时保持数据值(在Property中)的完整性,则正确的(数据库)方法是实现History表。这应该是源表的精确副本,加上一个项目:TIMESTAMP或DATETIME列添加到PK。
PropertyHistory
PropertyId AUTONUMBER,
Name CHAR
CONSTRAINT PRIMARY KEY CLUSTERED UC_PK (PropertyId)
PropertyHistory
PropertyId INT,
AuditedDtm DATETIME,
Name CHAR
CONSTRAINT PRIMARY KEY CLUSTERED UC_PK (PropertyId, AuditedDtm)
为了使其有意义且可用,Test表还需要一个时间戳,以确定要引用的ProperyHistory版本:
TestProperty
TestId
PropertyId
TestDtm DATETIME
属性名称列必须类似于分隔的字符串列表。
这将破坏基本设计规则以及数据库规范化规则,并阻止您对其执行普通的关系操作。切勿在一列中存储多个数据值。
...或在属性表中删除一行
删除再次有所不同。如果它是“数据库”,那么它具有完整性。因此,如果父行在某个其他表中有子行,则无法删除父行(如果不有子项,则可以将其删除)。这通常实现为“软删除”,添加了IsObsolete
等指标。这在各种SELECTS中引用,以排除使用行(添加新子项),但仍可用作现有子项的父项。
答案 1 :(得分:1)
如果您想保留财产关系,即使该财产不存在。使其不必删除属性,但添加一个标志,表示该属性当前是否处于活动状态。如果更改了属性的名称,请使用新名称创建一个新属性,并将旧属性设置为非活动状态。
如果你这样做,你必须创建一些垃圾收集方式非活动属性。
我永远不会在一个字段中创建一个列,该字段模仿与逗号表示的列表的一对多关系。 否则,你会破坏关系数据库的目的。
答案 2 :(得分:1)
似乎您使用Test
作为特定测试实例的模板以及测试本身。也许每当用户根据Test
中的规范执行测试时,在TestRun
中创建一行?这将保留特定的Property
,如果Property
中的条目稍后更改,则后续的TestRun
将反映新的更改。