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

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

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

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

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

有帮助吗?

解决方案

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

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

其他提示

实体框架一切皆有可能,但你必须破解并削减它的方式。我目前正在使用的数据库有太多的“持有者表”。因为Point例如与团队和用户共享。用户和团队都可以拥有博客。

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

感谢您提出这些建议。

我开始意识到答案是重新构建数据库中的数据 - 或者像Georg建议的那样沿着嵌套集合的行,或者是我刚刚遇到的传递闭包表。

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

a)更快地查询aginst任意子树

b)一个不再需要递归查询的数据模型 - 所以也许可以让它容易实现实体框架!

总是令人惊讶的是,对于一个难题而言,正确答案的答案通常不是回答它,而是做其他事情!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top