层次关系表格,不用递归,快速检索。HierarchyId

最近这几天写了个T4自动实现EF code first和Ado的存储过程。使用过程中发现了一个Sql的类型为HierarchyId。看到时真是百思不得齐姐。算了查一下MSDN吧。从微软官网找到了HierarchyId类型。悲催了。这个字段没有对应C# CLR类型。使用EF6时报错,提示我应该是用Byte[]类型,执行一遍程序。还是有错误,算了谷歌吧。谷歌了一下,发现有解决方案了,什么HierarchyId而且不是SQLTypes的HierarchyId,哦 EF没有找到,最后Nuget获取到了 EntityFrameWork.HierarchyId。OK完美运行,查询出来了。

HierarchyId到底是什么呢?

HierarchyId是SQL Server 2008的一个重要新增特性。主要解决的问题是拥有层次关系的表格。例如文档结构图。我们一般会用一个Document表保存文档数据,而每个文档则又可能会有相应的上级文件夹。以前要得到某个文件的所有上级,或者某个文件所有下级,通常所采取的方法都是递归。SQL Server 2005开始支持的CTE从一定程序上方便了该工作的实现。

例子就用微软的AdventureWorks2012里面的Production.Document:

创建表语句如下:

CREATE TABLE [Production].[Document](
    [DocumentNode] [hierarchyid] NOT NULL,
    [DocumentLevel]  AS ([DocumentNode].[GetLevel]()),
    [Title] [nvarchar](50) NOT NULL,
    [Owner] [int] NOT NULL,
    [FolderFlag] [bit] NOT NULL,
    [FileName] [nvarchar](400) NOT NULL,
    [FileExtension] [nvarchar](8) NOT NULL,
    [Revision] [nchar](5) NOT NULL,
    [ChangeNumber] [int] NOT NULL,
    [Status] [tinyint] NOT NULL,
    [DocumentSummary] [nvarchar](max) NULL,
    [Document] [varbinary](max) NULL,
    [rowguid] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
    [ModifiedDate] [datetime] NOT NULL,
CONSTRAINT [PK_Document_DocumentNode] PRIMARY KEY CLUSTERED
(
    [DocumentNode] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
UNIQUE NONCLUSTERED
(
    [rowguid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

其中 GetLevel 为 hierarchyid 数据类型的方法;初次之外还有

具体大家可以参考msdn官方文档

那么插入某个节点的数据怎么办呢?

官方也给了办法 就是先查询父节点下最大子节点

然后创建一个新的子节点

declare @HyId hierarchyid=父节点;
declare @NewHyId hierarchyid;

select @[email protected](MAX(DocumentNode),null) from Document
Where DocumentNode_Id.GetAncestor(1)[email protected]    --创建一个新的节点

select @NewHyId.ToString()

然后将新的节点添加到数据库中。希望微软以后能添加数据类型到CLR和能自动生成新的hierarchyid根据传入的父hierarchyid

当然微软官方有索引优化建议,希望大家去看一下

查询时可以使用SQL类型到C#

层次关系表格,不用递归,快速检索。HierarchyId

时间: 2024-11-06 03:37:10

层次关系表格,不用递归,快速检索。HierarchyId的相关文章

Elastic Search如何快速检索

Elastic Search如何快速检索 http://www.infoq.com/cn/articles/database-timestamp-02 Elasticsearch是通过Lucene的倒排索引技术实现比关系型数据库更快的过滤.特别是它对多条件的过滤支持非常好,比如年龄在18和30之间,性别为女性这样的组合查询.倒排索引很多地方都有介绍,但是其比关系型数据库的b-tree索引快在哪里?到底为什么快呢? 笼统的来说,b-tree索引是为写入优化的索引结构.当我们不需要支持快速的更新的时

JavaScript---网络编程(7)-Dom模型(节点间的层次关系,节点的增、删、改)

利用节点间的层次关系获取节点: 上一节讲了3中获取的方式: * ※※一.绝对获取,获取元素的3种方式:-Element * 1.getElementById(): 通过标签中的id属性值获来取该标签对象 * 2.getElementsByName(): 通过标签中的name属性值来获取该标签对象集合 * 3.getElementsByTagName(): 通过标签名来获取该标签对象集合 现在来看看相对获取的方式: ※※二.相对获取(利用节点之间的层次关系),获取节点:-Node 1.父节点:pa

php不用递归完成无限分类,从表设计入手完整演示过程

无限分类是什么就不废话了,可以用递归实现,但是递归从数据库取东西用递归效率偏低,如果从表设计入手,就很容易做到网站导航的实现,下面是某论坛导航,如下图 网上无限分类大多不全面,今天我会从设计表开始, 首先我们先做视图界面, <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>白超华-博客园</title> &

通过节点层次关系获取节点

<!--通过节点的层次关系获取节点对象. 关系:1.父节点:parentNode:对应一个节点对象.2.子节点:childNodes:对应一个节点集合.3.兄弟节点: 上一个兄弟节点:parviousSibling下一个兄弟节点:nextSibling--> <script type="text/javascript"> function getNodeByLevel(){ //获取页面中的表格节点var tabNode = document.getElemen

[Qt教程] 数据库(六)SQL关系表格模型QSqlRelationalTableMode

导语QSqlRelationalTableModel继承自QSqlTableModel,并且对其进行了扩展,提供了对外键的支持.一个外键就是一个表中的一个属性和其他表中的主键属性之间的一对一的映射.例如,student表中的course属性对应的是course表中的id属性,那么就称属性course是一个外键.因为这里的course属性的值是一些数字,这样的显示很不友好,使用关系表格模型,就可以将它显示为course表中的name属性的值. 环境:Windows Xp + Qt 4.8.4+Qt

5、层次关系访问节点和创建节点

层次关系访问节点和创建节点 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta htt

JDK中ClassLoader的分类以及ClassLoader间的层次关系

几个常见的ClassLoader: bootstrap  class  loader: 最早启动的class  loader,一般使用C语言,汇编语言,或是c++写的,用操作系统本地语言写的.这个class  loader你动不了,也没有名字,打印出来是空值. 1,负责先把其他的class loader   load进来,然后其他class  loader再load其他class 2,load  jre最核心的类,最核心的rt.jar拿出来把里边的class load进来. extension

Java输入、输入、IO流 类层次关系梳理

Java输入.输入.IO流 类层次关系梳理 本文主要关注在Java编程中涉及到的IO相关的类库.方法.以及对各个层次(抽线.接口继承)的流之间的关系进行梳理 相关学习资料 http://baike.baidu.com/view/1007958.htm?noadapt=1 http://blog.csdn.net/hguisu/article/details/7418161 https://www.ibm.com/developerworks/cn/java/j-lo-javaio/ http:/

(实用篇)PHP不用递归遍历目录下所有文件的代码

<?php /** * PHP 非递归实现查询该目录下所有文件 * @param unknown $dir * @return multitype:|multitype:string */ function scanfiles($dir) { if (! is_dir ( $dir )) return array (); // 兼容各操作系统 $dir = rtrim ( str_replace ( '\\', '/', $dir ), '/' ) . '/'; // 栈,默认值为传入的目录 $