Как я могу использовать структуру сущностей с иерархическими данными?
-
03-07-2019 - |
Вопрос
Я работаю с большим иерархическим набором данных на сервере sql - смоделирован с использованием стандартного " EntityID, ParentID " такой подход. Во всем дереве около 25 000 узлов.
Мне часто нужно получить доступ к поддеревам дерева, а затем получить доступ к связанным данным, которые свисают с узлов поддерева. Я построил слой доступа к данным несколько лет назад на основе табличных функций, используя рекурсивные запросы для извлечения произвольного поддерева с учетом корневого узла поддерева.
Я думаю об использовании Entity Framework, но не могу понять, как запрашивать иерархические данные, такие как этот. AFAIK, в Linq нет рекурсивных запросов, и я не могу представить TVF в моей модели данных сущностей.
Является ли единственным решением продолжать использовать хранимые процедуры? Кто-нибудь еще решил это?
Пояснение: под 25 000 узлов в дереве я имею в виду размер иерархического набора данных, а не что-либо связанное с объектами или Entity Framework.
Решение
Возможно, лучше всего использовать шаблон под названием «Вложенный набор», который позволяет получить произвольное поддерево в одном запросе. Это особенно полезно, если узлами не очень часто манипулируют: Иерархические данные в MySQL "> Управление иерархическими данными в MySQL .
В идеальном мире структура сущностей предоставит возможности для сохранения и запроса данных с использованием этого шаблона данных.
Другие советы
Все возможно с Entity Framework, но вы должны взломать и пробиться к нему. База данных, с которой я сейчас работаю, содержит слишком много «таблиц держателей». поскольку, например, очки делятся как с командами, так и с пользователями. Блог может быть как у пользователей, так и у команд.
Когда вы говорите 25 000 узлов, вы имеете в виду навигационные свойства? Если так, то я думаю, что было бы сложно получить доступ к данным на месте. Навигация, поиск и т. Д. С помощью структуры сущностей несложен, но я склонен моделировать на бумаге, а затем создавать базу данных на основе того, как я хочу ориентироваться при использовании структуры сущностей. Похоже, у вас нет такой возможности.
Спасибо за эти предложения.
Я начинаю понимать, что ответ состоит в том, чтобы перемоделировать данные в базе данных - либо по линиям вложенных наборов, как предлагает Георг, либо, возможно, по таблице переходного замыкания, с которой я только что столкнулся.
Таким образом, я надеюсь получить два ключевых преимущества:
а) более быстрый запрос произвольных поддеревьев
b) модель данных, которая больше не требует рекурсивных запросов - так что, возможно, она будет легко доступна Entity Framework!
Всегда удивительно, как часто правильный ответ на сложную проблему - не ответить на нее, а вместо этого сделать что-то еще!