2016-09-13 6 views
1

У меня есть веб-приложение (приложение ASP .NET), размещенное на веб-сервере (IIS) и клиентском настольном приложении (служба Windows). Веб-приложение имеет древовидную структуру в таблицах базы данных. Так, например, есть таблица [Дерево] с столбцами (NodeId, NodeName, ParentNodeId). Таким образом, у вас есть рекурсивная древовидная структура. На стороне клиента есть структура папок, соответствующая структуре дерева сервера. Так, например, если вы следующие записи в таблице Tree на стороне сервераКак синхронизировать две древовидные структуры?

NodeId NodeName ParentNodeId 
------ -------- ------------ 
1  Folder1 NULL 
2  Folder2 1 
3  Folder3 1 

Тогда у вас есть структура папок на стороне клиента, как

Folder1 > Folder2 
Folder1 > Folder3 

Теперь, когда структура дерева обновляется на сервере мне нужно обновить структуру папок на клиенте. Для этого у меня есть веб-сервис, который клиент вызывает с фиксированным интервалом и извлекает всю структуру дерева, а затем соответственно обновляет структуру папок. Однако отправка всей древовидной структуры на каждый вызов кажется мне неэффективной.

Есть ли какой-либо другой подход, эффективный, который может быть использован для решения этой проблемы? Как используя другую структуру данных для хранения иерархии

Edit 1: На стороне сервера может быть любое изменение, как, например, дл перемещение/копирование всего подмножества узлов на новый родительский узел или удаление всего подмножества узлов

+0

Вы можете отправить информацию о том, что изменилось с данного времени; отправка diff, а не весь набор данных, применима независимо от структуры этих данных. – Servy

+0

Другой вариант - запомнить последовательность операций модификации (добавленный узел, удаление узла, обновленный узел), которые были применены к дереву и корму, которые предназначены для клиентов, чтобы они могли реплицировать их с их конца. – serhiyb

ответ

0

Ваша структура выглядит как стандартное отношение родитель-потомок, поэтому на первый взгляд я не вижу проблемы с ней.

Вы можете использовать подход в режиме реального времени с помощью класса SqlDependency вместо используемого вами метода фиксированного интервала.

Чтобы избежать срыва всей структуры узла, вы можете поместить в таблицу флаг, указав, была ли новая строка обновлена ​​или помещены некоторые столбцы временной метки в вашей таблице. Вам нужно будет включить любые фильтры в ваш sql и убедиться, что все столбцы, которые вы фильтруете, индексируются.

Смежные вопросы