【发布时间】:2014-08-08 01:55:30
【问题描述】:
我需要实现一个系统来跟踪唯一数字对象标识符的变化。系统将在其中运行的环境非常受限制,因此解决问题的所有方便的企业级 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 的新记录。新记录中定义的属性值将是基于与原始合并事务一起存储的选择。
非常感谢您的建议。提前致谢。
【问题讨论】:
标签: sql sql-server merge tracking propagation