两个层次结构的单向同步

时间:2011-08-19 22:52:26

标签: data-structures f# merge object-graph

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

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

  1. objA - 原型
  2. objB - 要修改的对象
  3. keyA - objA
  4. 的密钥生成函数
  5. keyB - objB
  6. 的密钥生成函数
  7. addB - 创建objB的函数(返回新objB的ID)
  8. setB - 更新objB
  9. 的功能
  10. remB - 删除objB
  11. 的功能
  12. parB - objB的父级ID - 传递给addB上下文
  13. 所以我们有这个:

    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并且它可以向下遍历图形?我最初的想法是将所有参数合并到一个类中,该类将具有子属性(相同类型的ResizeArray)。但是由于各种属性具有不同的类型,我无法找到使其工作的方法,缺少将类型抛出窗口并制作大部分或全部类型参数obj

    所以这是我的问题:

    1. 有没有一种完善的方法可以做到这一点(我找不到任何东西)
    2. 我可以使用哪种数据结构来封装使其工作所需的数据?
    3. 我已尽力彻底解释这一点,但如果有什么不清楚,请询问,我会尽力提供更好的信息。

2 个答案:

答案 0 :(得分:1)

我确信这过于简单化,但这是我的想法。

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

你可以使用一个有区别的联合来处理你的入队中的不同子类型。

答案 1 :(得分:0)

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