跟踪对象标识符更改的数据结构

时间:2014-06-17 22:18:20

标签: sql sql-server merge tracking propagation

我需要实现一个系统来跟踪对唯一数字对象标识符的更改。系统将在其中运行的环境非常严格,因此所有方便的企业级RDBMS方法都无法解决问题。这意味着启用内置更改跟踪,或内置审计或写入输出到日志文件或使用表格上的触发器等不会成为解决方案的一部分。这些更改需要存储在“仅插入”事务表中,该事务表将在应用程序级别进行编写和管理。

我需要跟踪更改的对象可以通过两种方式运行:

  • 单个对象可以分为两个新对象
  • 两个对象可以合并在一起形成一个对象

对于给定的对象集合,对象ID是唯一的长整数。当对象被分割(分割)时,分配给主题对象的ID将被淘汰并被两个新对象替换。因此,当对象27被分割时,它被对象57和58替换,其中57和58是从该特定序列获得的下一个可用数字。

类似地,当两个对象合并为一个时,主题对象id将被淘汰并替换为序列中的下一个可用数字。因此,当对象85和对象227合并在一起时,它们被对象357替换,对象357是序列中下一个可用的未使用的数字。在合并操作中,我们可以保持仅与两个父项中的一个相关联的属性,因此用户将选择在合并时将保留哪些属性,在这种情况下为85或227.此选择需要存储以供稍后使用 使用

事务表需要存储对象拆分和合并的完整历史记录。对象可以进行拆分和合并的数量没有限制 是...的主题。

我正在寻找有关SQL数据结构的建议,如果可能的话,可以使用单个表来有效地存储事务。

一旦定义了事务表结构,我就需要能够使用SQL查询它,以便我可以检索分裂中涉及的任何特定ID的完整ID谱系 或合并交易。在这种情况下,事情并不是那么严格,因此我们可以根据需要设置一个或多个关于事务数据的视图,或者根据需要编写新表等。递归SQL可用于查询和显示ID谱系。

一旦定义了事务记录,下一个要求就是将更改后的ID异步传播到一个或多个相关表。

拆分示例

父表ID 27分为ID 57和ID 58.在相关表中,记录 将删除ID为27并替换为分别带有ID 57和58的两个(与ID 27相同)的新记录。

合并示例

父表ID 327和ID 959合并到ID 1023.在相关表中,将删除携带ID 327和ID 959的记录,并替换为标记为1023的新记录。新记录中定义的属性值将是基于与原始合并事务一起存储的选择。

非常感谢您的建议。提前谢谢。

1 个答案:

答案 0 :(得分:0)

我建议采用最简单的方法:

part1_id part2_id composed_id is_split

其中is_split对于拆分为true,对于合并为false。在合并的情况下,part1_id的属性被保留(这消除了歧义)。如果是拆分,part1_id < part2_id必须保留。

这对于简单有效地存储数据应该足够了,检索有点复杂,因为你必须遵循任意长链并在所有三个字段中查看id

但是,由于id可以参与任意长链,所以你无能为力。也许像

这样的表
in1_id in2_id out1_id out2_id

可以更好地检索。对于合并,两个in都被使用,只有一个out(你明白了,对吧?)。只需添加所有需要的约束,以对抗此表示的冗余。