Sql server 多对多关系的历史记录表
我需要跟踪几个实体的版本历史,以便能够看到其历史中任何给定点的所有属性的状态,包括它们的多对多关系。它还必须支持变更集。鉴于下表:Sql server 多对多关系的历史记录表,sql-server,database,entity-framework,database-design,many-to-many,Sql Server,Database,Entity Framework,Database Design,Many To Many,我需要跟踪几个实体的版本历史,以便能够看到其历史中任何给定点的所有属性的状态,包括它们的多对多关系。它还必须支持变更集。鉴于下表: EntityA ------- Id Name Revision ChangeId EntityB ------- Id Name Revision ChangeId EntityAToEntityBMapping ----------------------- EntityAId EntityBId ChangeId ChangeTracking -----
EntityA
-------
Id
Name
Revision
ChangeId
EntityB
-------
Id
Name
Revision
ChangeId
EntityAToEntityBMapping
-----------------------
EntityAId
EntityBId
ChangeId
ChangeTracking
--------------
ChangeId
Date
User
Description
对于EntityA和EntityB表,我会有一个列完全相同的历史记录表。数据总是通过对象模型进行修改,因此在提交任何更改之前,我将创建一个新的ChangeTracking条目,并将其Id添加到任何插入或更新的实体中,并增加修订。然后,我在EntityA和EntityB表上有一个Insert/Update触发器,并将以前的数据复制到历史表中。在任何给定点,您都可以在其历史记录表中找到实体的所有历史记录
这个问题来自多对多映射表。我可以对映射表和历史表做同样的操作,但我需要能够说“在修订版3中,这个EntityA的列有这些值,并且这些值与EntityB的关系”。EntityA历史记录表可以通过ChangeId与映射历史记录表连接,但是当仅更改EntityA的名称时会发生什么情况?在这一点上,关系史将丢失,因为它是一个新的修订版
我可以想到三种需要支持的场景:
谢谢这与您头脑中的想法有些不同,而且更简单,如果它支持您的所有需求场景,这可能不是问题。我希望我没有错过任何一个 案例#1只有实体A发生变化,关系没有变化。
- EntityA的副本插入EntityAHistory(带有实际日期)
- EntityAToEntityBMapping的副本插入到EntityAtoEntityBMappingHistory中(带有实际日期)
- EntityA已更改并获得新版本
- EntityAToEntityBMapping的副本插入到EntityAtoEntityBMappingHistory中(带有实际日期)
- EntityAToEntityBMapping已更改并获得新修订
- EntityA的副本插入EntityAHistory(带有实际日期)
- EntityAToEntityBMapping的副本插入到EntityAtoEntityBMappingHistory中(带有实际日期)
- EntityA已更改并获得新版本
- EntityAToEntityBMapping已更改并获得新修订
您将希望在联接中不仅包括Id,还包括修订字段。例如,您想查看实体某个版本的历史记录a:
select *
from EntityAHistory A, EntityBHistory B, EntityAToEntityBMappingHistory M
where A.Id = EntityAToEntityBMappingHistory.EntityAId
and B.Id = EntityAToEntityBMappingHistory.EntityBId
and A.Revision = EntityAToEntityBMappingHistory.EntityARevision
and B.Revision = EntityAToEntityBMappingHistory.EntityBRevision
and A.Revision = :CertainRevisionOfEntityA
模型:
EntityA
-------
Id
Name
Revision
EntityB
-------
Id
Name
Revision
EntityAToEntityBMapping
-----------------------
EntityAId
EntityBId
EntityAHistory
-------
Id
Name
Revision
Date
EntityBHistory
-------
Id
Name
Revision
Date
EntityAToEntityBMappingHistory
-----------------------
EntityAId
EntityARevision
EntityBId
EntityBRevision
Date
谢谢你的快速回复!对于案例2,在第二个要点中,您的意思是“EntityA已更改并获得新修订”?EntityAToEntityBMappingHistory没有自己的修订版。在这种情况下,更新后EntityA也将移动到EntityAHistory right,以便与映射共享修订?