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 的新记录。新记录中定义的属性值将基于选择与原始合并事务一起存储。

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

4

1 回答 1

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

对于检索可能会更好一些。对于合并,两个ins 都被使用并且只有一个out(你明白了,对吧?)。只需添加所有需要的约束,以消除这种表示的冗余。

于 2014-06-17T22:52:40.720 回答