Database 什么';这是编辑“a”的好算法;附表";效率最高?

Database 什么';这是编辑“a”的好算法;附表";效率最高?,database,algorithm,diff,Database,Algorithm,Diff,这是一个小的调度应用程序。我需要一种算法来有效地比较两个“调度”,找出差异,并只更新已更改的数据行,以及另一个表中的条目(该表作为外键)。这是一个大问题,所以我会马上说,我正在寻找一般建议或具体解决方案 编辑:正如建议的那样,我已经大大缩短了问题 在一个表中,我将资源与使用它们的时间跨度相关联 我还有第二个表(表B),它使用表a中的ID作为外键 表A中与表B对应的条目将有一个时间跨度包含表B中的时间跨度。并非表A中的所有条目都有一个表B中的条目 我为用户提供了一个界面来编辑表A中的资源计划。他们

这是一个小的调度应用程序。我需要一种算法来有效地比较两个“调度”,找出差异,并只更新已更改的数据行,以及另一个表中的条目(该表作为外键)。这是一个大问题,所以我会马上说,我正在寻找一般建议具体解决方案

编辑:正如建议的那样,我已经大大缩短了问题

在一个表中,我将资源与使用它们的时间跨度相关联

我还有第二个表(表B),它使用表a中的ID作为外键

表A中与表B对应的条目将有一个时间跨度包含表B中的时间跨度。并非表A中的所有条目都有一个表B中的条目

我为用户提供了一个界面来编辑表A中的资源计划。他们基本上为表A提供了一组新的数据,我需要将其视为与数据库中版本的差异

如果他们从表A中完全删除了表B所指向的对象,那么我也想从表B中删除该条目

因此,考虑到以下3组:

  • 表A中的原始对象(来自数据库)
  • 表B中的原始对象(来自数据库)
  • 表A中编辑的对象集(来自用户,因此没有唯一ID)
我需要一个能够:

  • 如果不需要对表A和表B中的行进行任何更改,请保持这些行不变
  • 根据需要向表A添加行
  • 根据需要删除表A和表B中的行
  • 根据需要修改表A和表B中的行
只需将对象排序到一个可以应用适当的数据库操作的排列中,就足够解决问题了

同样,请回答为特别地一般地,如您所愿,我正在寻求建议,但如果有人有一个完整的算法,这会让我很开心。:)

编辑:作为对拉斯维克的回应,我提供了一些额外的细节:

表B的项目始终完全包含在表A的项目中,而不仅仅是重叠

重要的是,表B的项目是量化的,因此它们应该完全在内部或外部。如果没有发生这种情况,那么我将不得不单独处理一个数据完整性错误

例如(使用速记):

表A ID资源开始和结束 01资源A 10/6上午7:00 10/6上午11:00 02资源A 10/6下午1:00 10/6下午3:00 表B ID表\u A\u ID开始结束 01 02 10/6 1:00PM 10/6 2:00PM 因此,我想要以下行为:

  • 如果我从表A中删除ID 02,或将其缩短为2:00PM-3:00PM,我应该从表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,一个用于10:00AM-11:00AM的新条目(ID 03)
您的帖子几乎属于“太长;未读”类别-缩短它可能会给您更多反馈


无论如何,关于主题:您可以尝试查看一个名为

的东西。据我所知,您的用户只能直接影响表a。假设您是用C#编程的,您可以使用一个简单的ADO.Net数据集来管理对表a的修改。TableAdapter知道保留未触及的行并处理新的,适当地修改和删除行

此外,您应该定义级联删除,以便自动删除表B中的相应对象


唯一不以这种方式处理的情况是,如果表a中的时间跨度缩短了s.t。它不再包含表B中的相应记录。您可以在更新存储过程中检查这种情况,或者在表A上定义一个更新触发器。

在我看来,任何算法都可能涉及到传递NewA、匹配ResourceID、StartTime和EndTime,并跟踪OldA中的哪些元素被命中。然后有两组不匹配的数据,UnmatchedNewA和UnmatchedOldA

我能想到的最简单的方法是从以下几点开始: 将所有未匹配的NEWA写入数据库,在可能的情况下,将B的元素从未匹配的DOLDA传输到新的A密钥(刚刚生成),在不匹配的情况下删除。然后清除所有不匹配的Dolda

如果有很多变化,这肯定不是一个有效的方法。不过,在数据量不太庞大的情况下,我更喜欢简单而不是聪明的优化


在没有更多背景的情况下,不可能知道最后的建议是否有意义,但很可能你不是这样想的:


您是否可以使用事件监听器或类似的工具来更新数据模型,而不是在需要更改的地方来回传递整个集合?通过这种方式,被修改的对象将能够动态确定需要哪些DB操作。

我建议您将问题分解为两个独立的问题: 第一个应该是这样的:“当将调度原子表示为具有开始时间和结束时间的资源时,如何对资源调度进行推理?”这里,ADept使用区间代数的建议似乎是合适的。请看和。 第二个问题是数据库问题:“给定一个调度间隔并指示两个间隔是否重叠或一个包含在另一个间隔中的算法,如何使用此信息来管理给定模式中的数据库?”我相信,一旦调度算法 Table A ID Resource Start End 01 Resource A 10/6 7:00AM 10/6 11:00AM 02 Resource A 10/6 1:00PM 10/6 3:00PM Table B ID Table_A_ID Start End 01 02 10/6 1:00PM 10/6 2:00PM
|---------------- A -------------------|
    |--- B ----|      |--- B ---|
    |---------------- A -------------------|
|--- B ----|                        |--- B ---|
* A removed A-timespan removes all the linked timespans from B
* An added A-timespan, what about this?
* A shortened A-timespan removes all the linked timespans from B that now falls outside A
* A lenghtened A-timespan, will this include all matching B-timespans now inside?
|-------------- A1 --------------|    |-------- A2 --------------|
  |---- B1 ----|  |----- B2 ---|       |---- B3 ----|  |-- B4 --|
|-------------- A1 ---------------------------------|  |--- A2 --|
  |---- B1 ----|  |----- B2 ---|       |---- B3 ----|  |-- B4 --|
1. Lengthen (update) A1
2. Shorten and move (update) A2
3. Re-link (update) B3 from A2 to A1 instead
|-------------- A1 -----------------------------|      |--- A2 --|
  |---- B1 ----|  |----- B2 ---|       |---- B3 ----|  |-- B4 --|
|------------------ A -----------------------|
  |------- B1 -------|  |------- B2 ------|
                           |---|                   <-- I want to remove this from A
|------------------ A1 ----|   |---- A2 -----|
  |------- B1 -------|  |B3|   |--- B2 ---|
|------------------ A1 ----|   |---- A2 -----|
  |------- B1 -------|