我在SQL Server数据库中使用了一组分层数据.数据以guid作为主键存储,而parentGuid作为指向直接父对象的外键存储.我最常通过WebApi项目中的Entity Framework访问数据.为了使情况更复杂,我还需要基于此层次结构管理权限,以便应用于父级的权限适用于其所有后代.我的问题是:
我已经搜遍了所有,无法决定哪种方法最适合处理这种情况.我知道我有以下选择.
Recursive CTEsCommon Table Expression(也就是RCTE)来处理分层数据.这似乎是正常访问最简单的方法,但我担心在用于确定子对象的权限级别时可能会很慢.hierarchyId表中,并使用SQL Server所提供的功能,如数据类型字段GetAncestor(),IsDescendantOf()和等,这似乎将让查询很容易,但似乎需要一个相当复杂的插入/更新触发器,以保持HIERARCHYID域是正确的通过插入和移动closure table,它将存储表中的所有关系.我想象如下:父列和子列,每个父 - >子关系将被表示.(即1-> 2 2-> 3将在数据库中表示为1-2,1-3,2-3).缺点是这需要插入,更新和删除触发器,即使它们非常简单,并且此方法会生成大量记录.我已经尝试过全面搜索,但在这三种方法之间找不到任何建议.
PS我也对这个问题的任何替代解决方案持开放态度
sql-server recursive-query common-table-expression hierarchyid transitive-closure-table
我在Visual Studio 2012中有一个WebApi项目.我是从模板创建的,然后通过使用NuGet添加到HelpPage中.以下是我的例子.
HierarchyController.cs
public class HierarchyController : ApiController
{
[ActionName("DefaultAction")]
public List<Hierarchy> Get([FromUri]List<Guid> guid)
{...}
[HttpGet]
public List<Hierarchy> Children([FromUri]List<Guid> guid)
{...}
[HttpGet]
public List<Hierarchy> Descendants([FromUri]List<Guid> guid)
{...}
[ActionName("DefaultAction")]
public HttpResponseMessage Post([FromBody]List<Hierarchy> hierarchies)
{...}
[ActionName("DefaultAction")]
public HttpResponseMessage Delete([FromUri]List<Guid> guid)
{...}
}
Run Code Online (Sandbox Code Playgroud)
WebApiConfig.cs
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{guid}"
);
config.Routes.MapHttpRoute(
name: "GuidApi",
routeTemplate: "api/{controller}/{guid}",
defaults: new { action = "DefaultAction", guid = RouteParameter.Optional }
);
}
}
Run Code Online (Sandbox Code Playgroud)
来自.../help的结果
等级制度
API …