wojkxlq 发表于 2015-7-2 13:46:58

SQL SERVER 2008 Hierarchyid数据类型

  以往我们在关系数据库中建立树状结构的时候,通常使用ID+ParentID来实现两条纪录间的父子关系。但这种方式只能标示其相对位置。解决这类问题在SqlServer2005出现之前通常是采用游标来操作,但熟悉数据库内部机制的人都知道使用游标带来的性能问题和其他问题是比较严重的。
  到了SqlServer2005下,可以选择用CTE来做递归查询,这种方式查询比较简练,但由于数据库内部是采用递归查询的方式,其效率依旧不高;为了能够实现既简练又高效的查询,通常的做法是增加冗余字段,比如增加一个"Path"字段,查询时用模糊查询来进行左匹配。对Path建索引后,这种查询的效率还是相当高的,因此这种方式也是一种常规的设计方式;

  SQL SERVER 2008引入了新的hierarchyid数据类型,可以用它来做本地存储并且在树层次结构中管理其位置.只用这个函数能简洁地表示层次结构中的位置.该函数提供的一些内置的函数方法可以操作和遍历层次结构,使得存储和查询分层数据更为容易,而不需要像那样通过CTE递归来获得.
  Hierarchyid类型其实是一个CLR自定义数据类型依次打开:数据库->系统数据库->master->可编程性->类型->系统数据类型->CLR数据类型->hierarchyid,可以看到该数据类型.
  于hierarchyid有关的一些函数主要有:

[*]GetAncestor :取得某一个级别的祖先
[*]GetDescendant :取得某一个级别的子代
[*]GetLevel :取得级别
[*]GetRoot :取得根
[*]IsDescendantOf :判断某个节点是否为某个节点的子代
[*]Parse :将字符串转换为hierarchyid。该字符串的格式通常都是/1/这样的
[*]Read :Read 从传入的BinaryReader 读取SqlHierarchyId 的二进制表示形式,并将SqlHierarchyId 对象设置为该值。不能使用Transact-SQL 调用Read。请改为使用CAST 或CONVERT。
[*]GetReparentedValue :可以用来移动节点(或者子树)
[*]ToString :将hierarchyid转换为字符串,与parse正好相反
[*]Write : 将SqlHierarchyId 的二进制表示形式写出到传入的BinaryWriter 中。无法通过使用Transact-SQL 来调用Write。请改为使用CAST 或CONVERT。

  hierarchyid 数据类型的值表示树层次结构中的位置。hierarchyid 的值具有以下属性:

[*]
  非常紧凑  在具有 n 个节点的树中,表示一个节点所需的平均位数取决于平均端数(节点的平均子级数)。端数较小时 (0-7),大小约为 6*logAn 位,其中 A 是平均端数。对于平均端数为 6 级、包含 100,000 个人的组织层次结构,一个节点大约占 38 位。存储时,此值向上舍入为 40 位,即 5 字节。
[*]
  按深度优先顺序进行比较  给定两个 hierarchyid 值 a 和 b,a
页: [1]
查看完整版本: SQL SERVER 2008 Hierarchyid数据类型