这是一个小型调度应用程序。我需要一种算法来有效地比较两个“时间表”,找出差异,并仅更新已更改的数据行,以及另一个表中具有该表作为外键的条目。这是一个大问题,所以我马上说我正在寻找一般建议或具体解决方案。
编辑:正如建议的那样,我已经大大缩短了这个问题。
在一张表中,我将资源与使用它们的时间跨度相关联。
我还有第二个表(表 B),它使用表 A 中的 ID 作为外键。
对应于表 B 的表 A 中的条目将具有包含表 B 中的时间跨度的时间跨度。并非表 A 中的所有条目都将在表 B 中具有条目。
我为用户提供了一个界面来编辑表 A 中的资源计划。他们基本上为表 A 提供了一组新数据,我需要将其视为与数据库中版本的差异。
如果他们从表 B 指向的表 A 中完全删除了一个对象,我也想从表 B 中删除该条目。
因此,给定以下 3 组:
- 表 A 中的原始对象(来自数据库)
- 表 B 中的原始对象(来自数据库)
- 表 A 中已编辑的对象集(来自用户,因此没有唯一 ID)
我需要一个算法,它将:
- 如果不需要对这些对象进行更改,则保持表 A 和表 B 中的行不变。
- 根据需要向表 A 添加行。
- 根据需要从表 A 和表 B 中删除行。
- 根据需要修改表 A 和表 B 中的行。
只需将对象排序到我可以应用适当的数据库操作的排列中,就足以解决问题了。
再次,请根据您的喜好具体或一般地回答,我正在寻找建议,但如果有人有一个完整的算法,那会让我很开心。:)
编辑:作为对 lassvek 的回应,我提供了一些额外的细节:
表 B 的项目总是完全包含在表 A 项目中,而不仅仅是重叠。
重要的是,表 B 的项目是量化的,因此它们应该完全落在内部或完全外部。如果这没有发生,那么我将遇到必须单独处理的数据完整性错误。
例如(使用简写):
表 A ID资源开始结束 01 资源 A 10/6 7:00AM 10/6 11:00AM 02 资源 A 10/6 1:00PM 10/6 3:00PM 表 B ID Table_A_ID 开始 结束 01 02 10/6 下午 1:00 10/6 下午 2:00
所以我想要以下行为:
- 如果我从表 A 中删除 ID 02,或者将其缩短到下午 2:00 - 3:00,我应该从表 B 中删除 ID 01。
- 如果我将表 A ID 01 扩展到它在下午 1:00 结束的位置,这两个条目应该合并到一行中,表 B ID 01 现在应该指向表 A ID 01。
- 如果我从表 A ID 01 中删除 8:00AM-10:00AM,则该条目应分为两个条目:一个用于 7:00AM-8:00AM,一个新条目 (ID 03) 用于 10:00AM-11: 00AM。