10

Я работаю с большим набором иерархических данных в sql-сервере, смоделированным с использованием стандартного подхода EntityID, ParentID. Во всем дереве насчитывается около 25 000 узлов.Как использовать структуру сущности с иерархическими данными?

Мне часто нужно получить доступ к поддеревьям дерева, а затем получить доступ к связанным данным, зависающим от узлов поддерева. Несколько лет назад я построил слой доступа к данным на основе табличных функций, используя рекурсивные запросы для извлечения произвольного поддерева, учитывая корневой узел поддерева.

Я думаю об использовании Entity Framework, но я не вижу, как запрашивать иерархические данные, такие как . AFAIK в Linq нет рекурсивного запроса, и я не могу выставить TVF в моей модели данных сущности.

Является единственным решением для сохранения хранимых процедур? Кто-нибудь еще решил это?

Уточнение: на 25 000 узлов в дереве. Я имею в виду размер иерархического набора данных, а не что-то связанное с объектами или инфраструктурой Entity Framework.

ответ

6

Он может наилучшим образом использовать шаблон под названием «Вложенный набор», который позволяет получить произвольное поддерево в рамках одного запроса. Это особенно полезно, если узлы не обрабатываются очень часто: Managing hierarchical data in MySQL.

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

+0

Ссылка есть, к сожалению, сейчас нет – Oskar

+0

@Oskar: Страница теперь доступна на сайте автора, я обновил ссылку. –

0

Все возможно с помощью Entity Framework, но вы должны взломать и снести свой путь к нему. В базе данных, с которой я работаю в настоящее время, слишком много «таблиц держателей», поскольку точки, например, совместно используются обеими командами и пользователями. У пользователей и команд также есть блог.

Когда вы говорите 25 000 узлов, вы имеете в виду навигационные свойства? Если это так, я думаю, что было бы сложно получить доступ к данным на месте. Нетрудно ориентироваться, искать и т. Д. С инфраструктурой сущностей, но я склонен моделировать на бумаге, а затем создавать базу данных на основе того, как я хочу ориентироваться при использовании структуры сущностей. Похоже, у вас нет такого варианта.

+0

Спасибо. В моем сценарии иерархия (дерево) моделируется только одной таблицей, в которой каждая строка содержит данные об узле и его идентификаторе родительского узла. – jamesfm

0

Спасибо за эти предложения.

Я начинаю понимать, что ответ заключается в том, чтобы переделать данные в базе данных - либо вдоль линий вложенных множеств, как предлагает Георг, или, может быть, транзитивной таблицы закрытия, с которой я только что столкнулся.

Таким образом, я надеюсь получить два основных преимущество:

а) быстрее запрашивание Светланы произвольных поддерев

б) модель данных, которая больше не требует рекурсивной обработки запросов - поэтому, возможно, в результате чего его в легко охват платформы Entity!

Удивительно, как часто правильный ответ на сложную проблему заключается не в том, чтобы отвечать на него, а вместо этого делать что-то другое!