Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 多对多关系的历史记录表_Sql Server_Database_Entity Framework_Database Design_Many To Many - Fatal编程技术网

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的名称时会发生什么情况?在这一点上,关系史将丢失,因为它是一个新的修订版

我可以想到三种需要支持的场景:

  • 只更改了EntityA,关系中没有更改
  • 只有EntityA和EntityB之间的关系才会更改
  • 两个实体A都已更改,其关系也已修改
  • 对于所有这些,需要保持一致性,并且我应该始终能够获得EntityA给定修订版的所有属性和所有关系

    你知道我如何处理多对多表的历史记录吗?在寻找了很多之后,我还没有找到一个令人满意的解决这个问题的方法。顺便说一句,我正在使用实体框架和SQLServer,以防其相关


    谢谢

    这与您头脑中的想法有些不同,而且更简单,如果它支持您的所有需求场景,这可能不是问题。我希望我没有错过任何一个

    案例#1只有实体A发生变化,关系没有变化。

    • EntityA的副本插入EntityAHistory(带有实际日期)
    • EntityAToEntityBMapping的副本插入到EntityAtoEntityBMappingHistory中(带有实际日期)
    • EntityA已更改并获得新版本
    案例#2只有实体A和实体B之间的关系发生变化。

    • EntityAToEntityBMapping的副本插入到EntityAtoEntityBMappingHistory中(带有实际日期)
    • EntityAToEntityBMapping已更改并获得新修订
    案例#3两个实体A都已更改,其关系也已修改。

    • EntityA的副本插入EntityAHistory(带有实际日期)
    • EntityAToEntityBMapping的副本插入到EntityAtoEntityBMappingHistory中(带有实际日期)
    • EntityA已更改并获得新版本
    • EntityAToEntityBMapping已更改并获得新修订
    (实际上,案例1和案例2可以组合使用,只是将EntityAToEntityBMapping复制到EntityAtoEntityBMappingHistory中两次是多余的)

    当您加入EntityAHistory、EntityBHistory、EntityAToEntityBMappingHistory中的任何一个时
    您将希望在联接中不仅包括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,以便与映射共享修订?