我有一组在 SQL Server 数据库中使用的分层数据。数据以 guid 作为主键存储,parentGuid 作为指向对象直接父对象的外键存储。我最常通过 WebApi 项目中的实体框架访问数据。为了使情况更复杂一点,我还需要基于此层次结构管理权限,以便应用于父级的权限适用于其所有后代。我的问题是这样的:
我已经搜遍了,无法决定哪种方法最适合处理这种情况。我知道我有以下选择。
- 我可以创建
Recursive CTEs
通用表表达式(又名 RCTE)来处理分层数据。这似乎是正常访问最简单的方法,但我担心在用于确定子对象的权限级别时它可能会很慢。 - 我可以在表中创建一个
hierarchyId
数据类型字段并使用 SQL Server 提供的函数,GetAncestor()
如IsDescendantOf()
通过插入和移动 - 我可以创建一个
closure table
,它将所有关系存储在表中。我想象它是这样的:父列和子列,每个父->子关系都将被表示。(即 1->2 2->3 将在数据库中表示为 1-2、1-3、2-3)。缺点是这需要插入、更新和删除触发器,尽管它们相当简单,而且这种方法会生成大量记录。
我已经尝试过搜索,在这三种方法之间找不到任何建议。
PS我也对这个问题的任何替代解决方案持开放态度