我正在使用sql server中的大型分层数据集 - 使用标准的“EntityID,ParentID”方法进行建模。整棵树中大约有25,000个节点。
我经常需要访问树的子树,然后访问挂起子树节点的相关数据。几年前,我基于表值函数构建了一个数据访问层,在给定子树的根节点的情况下,使用递归查询来获取任意子树。
我正在考虑使用Entity Framework,但我看不出如何查询分层数据 这个。 AFAIK在Linq中没有递归查询,我无法在我的实体数据模型中公开TVF。
是继续使用存储过程的唯一解决方案吗?还有其他人解决了这个问题吗?
澄清:树中有25,000个节点,我指的是层次数据集的大小,而不是与对象或实体框架有关。
答案 0 :(得分:6)
最好使用名为“嵌套集”的模式,它允许您在一个查询中获取任意子树。如果节点不经常被操作,这尤其有用:Managing hierarchical data in MySQL。
在完美的世界中,实体框架将提供使用此数据模式保存和查询数据的可能性。
答案 1 :(得分:0)
实体框架一切皆有可能,但你必须破解并削减它的方式。我目前正在使用的数据库有太多“持有者表”,因为例如Points与团队和用户共享。用户和团队都可以拥有博客。
当你说25 000个节点时,你的意思是导航属性吗?如果是这样,我认为将数据访问到位可能会很棘手。使用实体框架进行导航,搜索等并不困难,但我倾向于在纸上建模,然后根据我在使用实体框架时的导航方式创建数据库。听起来你没有这个选择。
答案 2 :(得分:0)
感谢您提出这些建议。
我开始意识到答案是重新构建数据库中的数据 - 或者像Georg建议的那样沿着嵌套集合的行,或者是我刚刚遇到的传递闭包表。
这样,我希望得到两个主要好处:
a)更快地查询aginst任意子树
b)一个不再需要递归查询的数据模型 - 所以可能会让它在实体框架的易于访问范围内!总是令人惊讶的是,对于一个难题而言,正确答案的答案通常不是回答它,而是做其他事情!