Имеется клиент-серверное приложение. Работаю над синхронизацией пользователей...
В клиентской части объекты представлены в виде древа и отображаются в TreeView, которые также представлены в базе в виде полей (id, id_type, id_parent, name)
Причём разные объекты находятся в разных древах, т.е. образуют различные цепочки деревьев в зависимости от типа
Хранятся объекты в .NET generic-словаре Dictionary(Of Integer, тип_объекта)
Аналогично храниться GUI-сущность в generic-словаре Dictionary(Of Integer, графический_тип)
Когда Клиент1 хочет добавить объект в некоторое древо с потомком id_parent, то для того чтобы внести Клиенту2 в нужные древа этот элемент, ему нужно перебрать рекурсией все деревья.
Вот ищу лёгкий путь такого взаимодействия... Обратился к CTE[msdn]
Использую CTE для нахождения родителя цепочки данного типа, если таковой использует Клиент2, то Клиент2 ищет ближнего родителя по Id и добавляет в древо данный объект
Т.е. использую запрос аналогичный
- Код: Выделить всё
WITH Generation (Id) AS
(
SELECT Id_Parent
FROM dbo.Person
WHERE Id = 6
UNION ALL
SELECT Person.Id_Parent
FROM Generation, Person
WHERE Generation.ID=Person.ID
)
SELECT TOP 1 Person.ID, Person.Name, Person.Id_Parent
FROM Generation, dbo.Person
WHERE Generation.ID = Person.ID
ORDER BY Person.ID;
GO
Так вот, всё мучает вопрос производительности и элегантности...
* Вроде как перебор клиентом всех цепочек объектов - очень накладно, т.к. по идее сервер это должен сделать быстрее. Только вот при некотором количестве юзеров и количестве объектов в БД - данная процедура по идее будет убивать сервер только этой задачей.
* Была идея переложить поиск главного родителя на Клиент1, но тогда выходит громоздкая архитектура взаимодействия звеньев или нужно строить дополнительное древо (а так используется косвенное древо, которое строиться при загрузки цепочки и хранит граф. объекты)
Уже сколько думаю - ничего хорошего и быстрого не выходит. Хотелось бы услышать мысли или опыт проектирования подобных систем.
Пока что подумываю о переделки структуры взаимодействия в ущерб архитектуре, т.е. переложить всё на Клиент1, тем самым убрав заботу других участников и возможно уменьшив требуемые затраты.