Как я могу использовать структуру сущностей с иерархическими данными?

StackOverflow https://stackoverflow.com/questions/812046

Вопрос

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

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

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

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

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

Это было полезно?

Решение

Возможно, лучше всего использовать шаблон под названием «Вложенный набор», который позволяет получить произвольное поддерево в одном запросе. Это особенно полезно, если узлами не очень часто манипулируют: Иерархические данные в MySQL "> Управление иерархическими данными в MySQL .

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

Другие советы

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top