两个层次的单向同步



我希望写一个算法来同步两个层次结构。这些结构可以是对象图、存储在关系数据库表中的数据等(甚至是两种不同的结构,只要它们具有可比较的键)。同步将是单向的,即一个结构将是原型,而另一个将被修改以匹配。

假设我们有一个sync函数。它需要接受以下内容:

  1. objA—原型
  2. objB—要修改的对象
  3. keyAobjA
  4. 密钥生成函数
  5. keyB——objB的密钥生成函数
  6. addB——创建objB的函数(返回新objB的id)
  7. setB——更新objB
  8. 的功能
  9. remB——删除objB
  10. 的功能
  11. parB——objB父节点的id——这被传递给addB用于上下文

所以我们有这个:

let sync (objA:'a) (objB:'b) (keyA:'a -> 'k) (keyB:'b -> 'k)
         (addB:'p * 'a -> 'p) (setB:'a * 'b -> unit) (remB:'b -> unit) 
         (parB:'p) = ...

现在我有麻烦了。'a'b是分层的,所以函数需要知道它应该遍历'a'b的哪些属性(一旦它比较了它们的键并决定它们到目前为止是匹配的,应该进一步遍历)。对于这些"子"属性,它需要传递给同步的所有相同的参数,但对于它们各自的类型。

这是一个明显的数据结构问题。我如何将这些信息链接在一起,以便根对象可以传递给sync,并且它可以向下遍历图?我最初的想法是将所有的参数合并到一个类中,这个类将有一个children属性(相同类型的ResizeArray)。但是,由于不同的属性具有不同的类型,我无法找到使其工作的方法,除非将类型抛出窗外并使大多数或所有类型参数都为obj

我的问题是:

  1. 是否已经有一个行之有效的方法来做到这一点(我还没有找到任何东西)
  2. 我可以使用什么数据结构来封装使此工作所需的数据?

我已经尽我最大的努力解释清楚了,但如果有任何不清楚的地方,请提出来,我将尽力提供更好的信息。

我知道这是过度简化,但这是我的想法。

如果这是DAG,你可以对objA进行宽度优先遍历。当您从objA队列一个节点时,包括objB和您需要的任何其他信息(元组)。然后当你去排队时,你修复objB。

您可以使用判别联合来处理排队中的不同子类型。

从两个数据结构生成衍射图,并将转换映射到转换后的问题。

最新更新