Можно ли синхронизировать два дерева с представлением вложенных множеств?

У меня есть дерево объектов, хранящихся в базе данных, с использованием представления вложенных наборов. Каждый узел дерева имеет свой объект (только один). Дерево может быть изменено пользователями в онлайн-приложении. Также есть набор приложений (пк, андроид, ios), которые могут работать в автономном режиме и так же модифицировать свои данные. Новые листья или ветки могут быть добавлены на двух или более устройствах.

Далее все данные синхронизируются (REST API, XML) между сервером и автономными приложениями, когда приложения получают доступ в интернет. После успешной синхронизации состояние на стороне сервера и клиента должно быть одинаковым.

Нет проблем с синхронизацией данных с плоской структурой данных (на основе метки времени модификации), но я не знаю, возможно ли это с деревом. Синхронизация должна быть полностью автоматической. Я не хочу, чтобы пользователи вмешивались в процесс синхронизации.


person e.r.g.o    schedule 17.11.2014    source источник


Ответы (1)


Поскольку представление вложенных наборов основано на разметке узлов, а изменение иерархии (вставка, перемещение, удаление) в среднем включает обновление разметки на половине узлов дерева (правая половина дерева от меняющегося узла), вы не можете просто отправить узел (запись) данных самостоятельно. Если вы примените его, это повредит разметку главного дерева.

Я предлагаю вам поставить свои изменения в очередь на автономном устройстве, например:

queue.append({'method': 'insert', 'parentId': 123, 'name': 'foo'})
queue.append({'method': 'delete', 'nodeId': 456})
queue.append({'method': 'move', 'nodeId': 789, 'newParentId': 234})

А затем попробуйте повторно применить очередь на стороне сервера. Как вы говорите, у вас нет проблем с синхронизацией плоских данных, у вас уже должна быть какая-то политика разрешения конфликтов. Поэтому, когда пользователь A удаляет node:123, а позже пользователь B пытается добавить дочерний узел к node:123, вам нужно будет каким-то образом разрешить конфликт.

person saaj    schedule 27.11.2014