2014-06-17 49 views
1

我需要实现一个系统来跟踪对唯一数字对象标识符的更改。系统运行的环境非常严格,所以所有便捷的企业级关系数据库管理系统(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 27)新记录的是分别携带ID 57和58。

合并实施例

父表ID 327和ID 959被合并成ID 1023。在相关表中承载ID 327和ID 959的记录将被删除,并用新的替代标记1023的属性值在新记录中定义的数据将基于与原始合并事务一起存储的选择。

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

回答

0

我建议最简单的方法:

part1_id part2_id composed_id is_split 

其中is_split是分裂真假进行合并。在合并的情况下,part1_id的属性得到保留(这消除了不明确性)。在分割的情况下,part1_id < part2_id必须成立。

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

但是,你可以对此做任何事情,因为id可以参与任意长链。也许像表

in1_id in2_id out1_id out2_id 

可能是一个更好的检索。对于合并,使用in s,并且只使用一个out(你明白了吧?)。只需添加所有必需的约束,以对抗这种表示的冗余。