10

我正在使用 sql server 中的大型分层数据集 - 使用标准的“EntityID,ParentID”类型的方法建模。整个树中大约有 25,000 个节点。

我经常需要访问树的子树,然后访问挂在子树节点上的相关数据。几年前,我基于表值函数构建了一个数据访问层,在给定子树的根节点的情况下,使用递归查询来获取任意子树。

我正在考虑使用实体框架,但我看不到如何查询这样的分层数据。AFAIK 在 Linq 中没有递归查询,我无法在我的实体数据模型中公开 TVF。

是继续使用存储过程的唯一解决方案吗?有没有其他人解决了这个问题?

澄清:树中的 25,000 个节点是指分层数据集的大小,与对象或实体框架无关。

4

3 回答 3

6

最好使用一种称为“嵌套集”的模式,它允许您在一个查询中获取任意子树。如果节点不经常被操作,这将特别有用:在 MySQL 中管理分层数据

在一个完美的世界中,实体框架将提供使用这种数据模式保存和查询数据的可能性。

于 2009-05-12T12:23:41.457 回答
0

使用 Entity Framework 一切皆有可能,但你必须破解并削减你的方式。我目前正在处理的数据库有太多的“持有人表”,因为例如 Points 是与团队和用户共享的。用户和团队都可以拥有博客。

当您说 25 000 个节点时,您是指导航属性吗?如果是这样,我认为获取数据访问权限可能会很棘手。使用实体框架进行导航、搜索等并不难,但我倾向于在纸上建模,然后根据我在使用实体框架时的导航方式创建数据库。听起来你没有那个选项。

于 2009-05-01T22:26:40.373 回答
0

感谢这些建议。

我开始意识到,答案是重构数据库中的数据——要么按照 Georg 建议的嵌套集合的方式,要么可能是我刚刚遇到的传递闭包表。

这样,我希望获得两个主要好处:

a) 更快地查询任意子树

b) 一个不再需要递归查询的数据模型——所以也许可以将它放在实体框架容易到达的地方!

一个难题的正确答案往往不是回答它,而是做其他事情,这总是令人惊讶!

于 2009-05-14T15:36:02.317 回答