Как сделать "diff" для двух деревьев, сохраненных в MySQL? - PullRequest
0 голосов
/ 20 июня 2011

Мне нужно сохранить трехуровневую древовидную структуру в MySQL.Перед каждым изменением дерева я куда-то копирую исходное дерево. После модификации мне нужно знать результат "diff" моей модификации.

Например, исходное дерево:

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

После моей модификации новое дерево:

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

Мне нужно знать:

  • Еще один лист под GroupA-> NodeA
  • В группе GroupA есть еще одна ветвь

И т. Д.

Итак, как лучше всего сохранить это дерево, чтобы я мог получить "diff" результат между модификациями?

Вот мое решение:

  1. Так как это дерево является трехуровневым деревом, я храню дерево, используя 3 таблицы.Когда мне нужно получить целое дерево, просто объедините каждую таблицу.
  2. Перед любой модификацией я дам дамп 3 основных таблиц в 3 временных таблицы.
  3. После любой модификации я могу получитьдва дерева из 3 основных таблиц и 3 временных таблиц, а затем «diff» их без какой-либо операции SQL.

Я пытался регистрировать изменения, но простой журнал операций не может обрабатывать ситуации, подобные этой:

  • Добавить лист A
  • Удалить лист A
  • Добавить лист A

Будет 3 журнала, но на самом деле есть только одна модификация

Итак, есть ли лучшее решение?Может кто-нибудь дать мне подсказку?

1 Ответ

0 голосов
/ 20 июня 2011

Бьюсь об заклад, вы должны выровнять свои древовидные данные, а потом сделать проще?например:

добавить поле кода в вашу таблицу

├── 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 - первый идентификатор узла

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...