Как использовать инфраструктуру сущности с иерархическими данными?
Я работаю с большим набором иерархических данных в sql-сервере, смоделированным с использованием стандартного подхода EntityID, ParentID. Во всем дереве насчитывается около 25 000 узлов.
Мне часто нужно получить доступ к поддеревьям дерева, а затем получить доступ к связанным данным, зависающим от узлов поддерева. Несколько лет назад я построил слой доступа к данным на основе табличных функций, используя рекурсивные запросы для получения произвольного поддерева, учитывая корень node поддерева.
Я думаю об использовании Entity Framework, но я не вижу, как запрашивать иерархические данные, например
это. AFAIK в Linq нет рекурсивного запроса, и я не могу выставить TVF в моей модели данных сущности.
Является единственным решением для сохранения хранимых процедур? Кто-нибудь еще решил это?
Уточнение: на 25 000 узлов в дереве я имею в виду размер иерархического набора данных, а не что-то связанное с объектами или инфраструктурой Entity Framework.
Ответы
Ответ 1
Он может наилучшим образом использовать шаблон под названием "Вложенный набор", который позволяет получить произвольное поддерево в одном запросе. Это особенно полезно, если узлы не обрабатываются очень часто: Управление иерархическими данными в MySQL.
В идеальном мире инфраструктура сущности предоставит возможности сохранять и запрашивать данные с использованием этого шаблона данных.
Ответ 2
Все возможно с Entity Framework, но вы должны взломать и снести к нему свой путь. В базе данных, с которой я работаю в настоящее время, слишком много "таблиц держателей", поскольку точки, например, совместно используются обеими командами и пользователями. У пользователей и команд также есть блог.
Когда вы говорите 25 000 узлов, вы имеете в виду навигационные свойства? Если это так, я думаю, что было бы сложно получить доступ к данным на месте. Это не сложно ориентироваться, искать и т.д. С инфраструктурой сущностей, но я склонен моделировать на бумаге, а затем создавать базу данных на основе того, как я хочу перемещаться при использовании структуры сущностей. Похоже, что у вас нет этой опции.
Ответ 3
Спасибо за эти предложения.
Я начинаю понимать, что ответ заключается в том, чтобы реконструировать данные в базе данных - либо по строкам вложенных множеств, сколько предлагает Георг, или, может быть, транзитная таблица закрытия, с которой я только что столкнулся.
Таким образом, я надеюсь получить два основных преимущества:
a) более быстрый запрос на произвольные поддеревья
b) модель данных, которая больше не требует рекурсивного запроса - поэтому, возможно, она легко доберется до Entity Framework!
Всегда удивительно, как часто правильный ответ на сложную проблему - не отвечать на него, а делать что-то другое!