我想在SQL Server 2008中使用新的HierarchyID类型来处理小型wiki应用程序中的页面关系.但是,它需要有多个根节点,因为每个帐户的每个主要文章/页面都是根节点.
从我所看到的HierarchyID类型只允许每列1个根节点是正确的吗?有没有办法启用多个根节点?
给定一个带有hierarchyid类型列的表,如何编写查询以返回特定节点的祖先的所有行?
有一个IsDescendantOf()功能,非常适合孩子们,但没有相应的IsAncestorOf()功能来返回祖先(并且缺少一个GetAncestors()功能似乎是一个疏忽.)
我在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
我需要使用HierarchyIDfor 找到所有类别的后代SQL Server.
我知道如何找到直接的孩子,但我想找到孩子的孩子等等.
有没有办法使用HierarchyID?
我正在阅读SQL server 2008圣经,它说物化路径模式明显快于hierarchyid.这是真的吗?如何使hierarchyid具有相同或更好的性能.
hierarchyid sql-server-2008 materialized-path-pattern c#-4.0
我们正在为我们的应用程序使用基于实体框架模型的WCF数据服务.
在这里我们需要添加一个类型列的表HierarchyId.当我将该表添加到EDMX文件时,该HierarchId列不会出现在类文件中.
我该怎么做才能利用HierarchyID?我读到实体框架不支持HierarchyID,那么我该如何实现呢?
我是SQL Server 2008的新手,刚刚介绍了HierarchyId.
我正在学习SQL Server 2008 - HIERARCHYID - 第一部分.所以基本上我是逐行跟踪文章,在SSMS中练习时,我发现对于每个ChildId,生成一些十六进制值,如0x,0x58,0x5AC0等.
我的问题是
我没有找到任何具体的例子,但我有兴趣使用hierarchyid数据类型来表示具有更新等的整个目录结构.这是为hierarchyid引用的常见用例,但我找不到构建这样一个示例的任何文章.
我只想表示一个完整的目录结构,例如:
/dir1
/file1
/dir2
/dir2/dir3
/dir2/dir3/file2
Run Code Online (Sandbox Code Playgroud)
**我不是想与磁盘上的文件系统同步.它纯粹通过数据库表示.**
我有一个像这样的父ID列表,100, 110, 120, 130它是动态的,可以改变.我希望在一组中获得指定父项的所有后代.为了获得单亲的孩子,我使用了这样的查询:
WITH parent AS (
SELECT PersonHierarchyID FROM PersonHierarchy
WHERE PersonID = 100
)
SELECT * FROM PersonHierarchy
WHERE PersonHierarchyID.IsDescendantOf((SELECT * FROM parent)) = 1
Run Code Online (Sandbox Code Playgroud)
不知道如何为多个父母这样做.我的第一次尝试是写几个工会的东西,但我确信应该有更聪明的方法来做到这一点.
SELECT * FROM PersonHierarchy
WHERE PersonHierarchyID.IsDescendantOf(
(SELECT PersonHierarchyID FROM PersonHierarchy WHERE PersonID = 100)
) = 1
UNION ALL
SELECT * FROM PersonHierarchy
WHERE PersonHierarchyID.IsDescendantOf(
(SELECT PersonHierarchyID FROM PersonHierarchy WHERE PersonID = 110)
) = 1
UNION ALL ...
Run Code Online (Sandbox Code Playgroud)
PS我也发现这样的查询来选择可能有用的ID列表:
SELECT * FROM (VALUES (100), (110), (120), (130)) AS …Run Code Online (Sandbox Code Playgroud)