如何对MySQL中保存的两棵树进行“diff”操作?

时间:2011-06-20 08:15:53

标签: mysql data-structures

我需要将一个3级树结构保存到MySQL中。在每次修改树之前,我会将原始树复制到某处。修改后,我需要知道修改后的“差异”结果。

例如,原始树是:

.
├── GroupA
│   ├── NodeA
│   │   └── LeafA
│   └── NodesB
└── GroupB

我修改后,新树是:

.
├── GroupA
│   ├── NodeB
│   ├── NodeA
│   │   ├── LeafA
│   │   └── LeafB
│   └── NodesB
└── GroupB

我需要知道:

  • GroupA-> NodeA
  • 下还有一片叶子
  • GroupA下还有一个分支

等等。

那么存储这棵树的最佳方法是什么,以便在修改之间得到“差异”结果?

这是我的解决方案:

  1. 由于这棵树是三层树,我使用3个表存储树。当我需要检索整个树时,只需加入每个表。
  2. 在进行任何修改之前,我会将3个主表转储到3个临时表中。
  3. 经过任何修改后,我可以从3个主表和3个临时表中检索两棵树,然后在不进行任何SQL操作的情况下“区分”它们。
  4. 我尝试记录修改,但是一个简单的操作日志无法处理这样的情况:

    • 添加leafA
    • 删除leafA
    • 添加leafA

    将有3个日志,但实际上只有一个修改

    那么,还有更好的解决方案吗?有人可以给我一个暗示吗?

1 个答案:

答案 0 :(得分:0)

我打赌你应该让树木数据平坦,然后让它更容易? 例如:

在表格中添加代码字段

├── GroupA(xxxa_1)
│   ├── NodeA(xxxa_1_1)
│   │   └── LeafA(xxxa_1_1_1)
│   └── NodesB(xxxa_1_1)


├── GroupA(xxxb_1)
│   ├── NodeB(xxxb_1_1)
│   ├── NodeA(xxxb_1_1)
│   │   ├── LeafA(xxxb_1_1_1)
│   │   └── LeafB(xxxb_1_1_1)
│   └── NodesB(xxxb_1_1)

xxxa和xxxb是第一个节点'id