【发布时间】:2013-06-22 13:37:39
【问题描述】:
我在 SQL Server 数据库中使用了一组分层数据。数据以 guid 作为主键存储,parentGuid 作为指向对象直接父对象的外键存储。我最常通过 WebApi 项目中的实体框架访问数据。为了使情况更复杂一点,我还需要基于此层次结构管理权限,以便应用于父级的权限适用于其所有后代。我的问题是这样的:
我已经搜索了所有内容,但无法确定哪种方法最适合处理这种情况。我知道我有以下选择。
- 我可以创建
Recursive CTEs,通用表表达式,(又名RCTE)来处理分层数据。这似乎是正常访问最简单的方法,但我担心在用于确定子对象的权限级别时它可能会很慢。 - 我可以在表中创建一个
hierarchyId数据类型字段,并使用SQL Server 提供的函数,如GetAncestor()、IsDescendantOf()等。这似乎会使查询变得相当容易,但似乎需要一个相当复杂的插入/更新触发器,通过插入和移动来保持 hierarchyId 字段正确 - 我可以创建一个
closure table,它将所有关系存储在表中。我想象它是这样的:父列和子列,每个父->子关系都将被表示。 (即 1->2 2->3 将在数据库中表示为 1-2、1-3、2-3)。缺点是这需要插入、更新和删除触发器,尽管它们相当简单,而且这种方法会生成大量记录。
我已经尝试过搜索,但在这三种方法之间找不到任何建议。
PS 我也愿意为这个问题提供任何替代解决方案
【问题讨论】:
-
请用您正在使用的 SQL Server 版本标记您的问题。您的查询倾向于从孩子到父母,还是相反?一个 RCTE 沿着单个孩子的父链接走上树应该不会太糟糕。对所有孩子来说,走另一条路会变得很慢。
-
我现在无法检查版本,但稍后会。我认为它要么是 2008 年,要么是更新的。我可能会更频繁地得到父母的孩子而不是得到孩子的父母
-
我无法添加另一个标签,但它是 SQL Server 2008 r2。
标签: sql-server common-table-expression recursive-query hierarchyid transitive-closure-table