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

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

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

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

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

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

Ответы [ 3 ]

6 голосов
/ 12 мая 2009

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

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

0 голосов
/ 14 мая 2009

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

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

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

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

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

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

0 голосов
/ 02 мая 2009

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

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

...