数据存储中无序和有序集合的实现系统和方法

文档序号:6550492阅读:331来源:国知局

专利名称::数据存储中无序和有序集合的实现系统和方法
技术领域
:本发明涉及计算机系统中的数据存储和数据库系统中支持用户定义类型(UDT)的系统,其中,UDT是用于关系型数据库引擎和文件系统的可扩充性机制,以通过注册实现特定约定的已管理类型来扩充数据存储的标量类型系统。更为具体地,本发明涉及通过既是标量又可查询的UDT来实现数据库系统中多重集和有序集合。
背景技术
:用户定义类型如本领域的技术人员所已知并理解的,MICROSOFTSQLSERVER是一种提供广泛的管理和开发工具、提取—变换—加载(ETL)工具、商业智能和分析服务以及其它能力的综合数据库管理平台。另外,MICROSOFTWINDOWS.NET框架公用语言运行时刻(CLR)近来被集成到SQLSERVER数据库中。CLR是MICROSOFT.NET框架的中心,并为所有的.NET代码提供了执行环境。在CLR中运行的代码被称为“受管代码(managedcode)”。CLR提供了程序执行所需的各种功能和服务,包括即时(JIT)编译、分配和管理存储器、实施类型安全、异常处理、线程管理和安全性。CLR当前在第一次调用.NET例程时由SQLSERVER加载。在SQLSERVER的先前的版本中,数据库程序员在服务器侧书写代码时被局限于使用事务SQL(Transact-SQL)。事务SQL是国际标准化组织(ISO)和美国国家标准化组织(ANSI)定义的结构化查询语言(“SQL”)的扩展。使用事务SQL,数据库开发者能够创建、修改和删除数据库和表,以及插入、检索、修改和删除储存在数据库中的数据。事务SQL特别地为直接结构数据访问和操作而设计。尽管事务SQL在结构数据访问和管理时胜出,它不像VISUALBASIC.NET和C#那样是经过充分考验的编程语言。例如,事务SQL不支持数组、集合、对每一个的循环、位移或类。当将CLR集成到SQLSERVER数据库中时,数据库开发者能够执行单独使用事务SQL不可能或很难实现的任务。VISUALBASIC.NET和C#都是对数组、结构化异常处理和集合的完全支持的现代编程语言。开发者可充分利用CLR的集成来书写具有更复杂逻辑并且更适用于使用VISUALBASIC.NET和C#等语言的计算任务的代码。这些编程语言提供了面向对象的能力,如封装、继承和多态性。相关的代码可被容易地组织成类和名字空间。受管代码比事务SQL更适用于数字捣弄(crunching)和复杂的执行逻辑,并且其特征是对许多复杂任务的广泛支持,包括字符串处理和正则表达式。由于具有.NET框架基类库(BCL)中找到的功能,数据库开发者能够访问上千个预构建的类和例程,它们可从任何储存的过程、触发器或用户定义的功能来容易地访问。受管代码的另一好处是类型安全。在执行受管代码之前,CLR验证该代码是安全的。这一过程被称为“验证”。在验证期间,CLR执行若干核查来确保该代码运行是安全的。例如,核查代码以确保不会读取尚未被写入的存储器。CLR也防止了缓冲区溢出。当书写受管代码时,部署单元被称为组件。组件被包装为动态链接库(DLL)。受管DLL组件可以被加载并包容到SQLSERVER。CREATEASSEMBLY语句用于在服务器中注册组件。以下为一示例CREATEASSEMBLYYukonCLRFROM′C\MyDBApp\YukonCLR.dll′在此示例中,FROM子句指定了要加载的组件的路径名。SQLSERVER传统上支持“内嵌的”标量类型,如整型、浮点数、日期、时间和字符串。这些内嵌的类型也伴随着一组内嵌的操作,如+、-、*、/以及在这些类型上的内嵌函数。这些类型、操作和函数在它们由产品包装并且用户不能定义其自己的类型的意义上是“内嵌的”。诸如SQLSERVER等数据库系统希望允许用户能够扩充数据库系统的类型系统,使得用户能够创建能像数据库系统中的标量类型那样起作用,但是包含更复杂结构的新类型,如创建包括X和Y坐标的“Point(点)”类型,等等。在这一点上,SQL标准和某些数据库管理系统(DBMS)产品使用了术语“用户定义类型”来描述若干形式的类型可扩充性。例如,SQL-99标准描述了一种“独特类型(distincttype)”,它是可由用户定义成具有内部表示的类型,该内部表示是现有SQL内嵌数据类型的值。独特类型可任选地与现有的标量类型共享比较和算术操作符、类型转换以及累计(列)函数(如,max(求最大值)、min(求最小值)、average(求平均值))。独特类型可允许在其值上定义约束。另外,独特类型可通过经由用户定义的函数定义独特类型专用的新函数来展示现有标量类型的行为之外的那些行为。对于类型核查,独特类型和现有标量类型被认为是不同的类型。独特类型的一个优点是容易定义。如果新类型的内部表示具有可用现有的内嵌类型描述的单个数据成员,并且该内嵌类型已实现了新类型所需的大多数行为,则独特类型是有吸引力的备选。用户不必要担心实现管理类型的盘上存储、构造函数、比较操作符(用户排序和索引)、算术操作符和类型变换(计算(casting))操作符所需的行为。用户仅需要选择需要在独特类型上展示底层内嵌类型的什么功能,并可任选地在新类型上添加对值的约束和额外的函数。独特类型的另一优点是对内嵌类型可用的所有查询处理,如直方图计算,可以被容易地用于独特类型的列。然而,独特类型的缺点是它们不能被容易地用于创建更复杂的类型。SQ1-99标准也描述了一种“结构化类型”,它是可由用户定义并且具有内部表示的类型,该内部表示是数据成员的集合,其每一个可以是一种不同的SQL内嵌或用户定义的类型。这类似于C和C++中的结构体(struct)概念。SQL-99描述了一种定义结构化类型的风格,用户通过它只需按照其内部结构来定义类型。系统在其数据成员、构造函数和函数上自动生成存取器和增变器(mutator)函数,以管理类型实例的盘上表示。SQL中定义的结构化类型的具体优点是(a)容易定义类型的基本行为,以及(b)可灵活地定义更复杂的类型。然而,结构类型的一个重要的缺点是类型专用方法的定义的复杂性,这些方法通常通过以诸如C或C++等通用编程语言书写的外部函数来定义。为完整地定义结构化类型,该类型的定义者需要在SQL和某一其它编程语言之间跨接一条线。尽管SQL99的独特类型和结构化类型特征在使用户能够扩充SQL数据库的现有标量类型系统的方面向用户提供了某些优点,然而,需要一种改进的系统和方法,以使用户能够通过如标量类型那样起作用但包含更复杂的结构和行为的用户定义类型来扩充数据库系统的标量类型系统。2004年2月10日提交的名为“数据库系统中提供用户定义类型的系统和方法”的美国专利申请号10/775,282(委托摘要号MSFT-3029/207007.01)(后文称为UDT专利申请)中揭示的发明针对一种允许用户通过创建如标量类型那样起作用但包含更复杂的结构和行为的用户定义类型来扩充数据库系统的标量类型系统的系统和方法。依照该发明,用户以高级编程语言书写程序代码,该语言实现定义用户定义类型的结构的类,以及可在用户定义类型的实例上调用的方法。如该申请(以及本发明)中所使用的,当涉及用户定义类型时,术语“结构”包含可实现该类型的字段或属性的集合。UDT专利申请中的每一字段的类型可以是标量SQL类型或任何先前定义的用户定义类型。然后编译定义用户定义类型的类,并向数据库系统注册该类。特别地,定义用户定义类型的CLR类可被编译成然后通过CREATEASSEMBLY数据定义语句向数据库系统注册的组件。在注册了组件之后,用户可使用CREATETYPE数据定义语句注册组件内定义用户定义类型的类。对于UDT专利申请的发明,数据库系统实施了一种特定的约定,类必须实现以使用户定义类型能够如SQL类型系统中的标量那样起作用。该申请(以及本发明)中所使用的术语“约定”指的是一种技术,它用于在面向对象编程环境的运行时间核查要被执行的代码满足某些前置条件或要求,以确保它将会正确地执行。依照该发明,对照其来比较定义用户定义类型的类的约定包括若干要求。首先,类必须指定多个不同格式中的一个,用于将用户定义类型的实例持久保存在数据库存储中。其次,类必须能够对用户定义类型返回空值。第三,类必须提供用于将用户定义类型转换成另一类型,如字符串类型,并将另一类型转换成用户定义类型的方法。一旦满足了这些要求,数据库系统能够创建用户定义类型的实例。在该申请的一个实施例中,用户定义类型可被例示为表中的列值、变量、例程的参数、或例程的返回值。数据库系统储存关于定义用户定义类型的类的元数据,以在随后用于创建该类型的实例。在该发明的另一实施例中,用户定义类型约定的验证是使用描述定义该类型的类的元数据来执行的。用于持久保存用户定义类型的实例的多个不同格式包括第一格式,其中用户定义类型的实例依照数据库系统的本机格式来自动串行化;以及第二格式,其中,用户定义类型的实例以用户创作的类定义的方式来串行化。另外,当UDT专利申请的发明在集成了MICROSOFT.NETCLR的MICROSOFTSQLSERVER中实施时,有第三格式可用,其中,用户定义类型的实例依照由MICROSOFT.NET框架提供的方法来串行化。对于UDT专利申请的发明,以数据库系统的查询语言的表达式可包括对用户定义类型的实例的一个或多个引用,使得表达式的求值需要调用用户定义类型的实例上的方法。当数据库系统接收这一查询语言表达式时,它将该表达式转换成程序代码指令的序列,使得当该指令被执行时,在用户定义类型的实例上调用需要的方法。数据库系统然后返回方法调用的结果,作为查询语言表达式的求值结果。在一个实施例中,在实例上调用方法之前,用户定义类型的实例被解串行化。该发明的另一特征是通过调用增变器方法改变用户定义类型的实例的值的能力。具体地,定义用户定义类型的类的作者包括一增变器方法,作为该类的一部分。当在用户定义类型的实例上调用时,该增变器方法使用户定义类型的值能够被改变。该过程可包括解串行化用户定义类型的实例、调用增变器方法来改变解串行化的实例数据的值、然后串行化经修改的用户定义类型的实例以持久保存该变化。该发明的另一特征是定义用户定义类型的类还可包含一指定用户定义类型的实例的串行化的二进制表示将被二进制排序的属性。这允许在该类型的实例上作出二进制比较,并也使得能够在该类型的实例上执行索引。具体地,对于二进制排序的用户定义类型的实例,当由数据库系统接收需要该类型的两个实例的某一比较的查询语言表达式(如,>、<或=),则可使用这两个实例的串行化二进制表示来对该表达式求值,而无序解串行化任一实例。另外,对于二进制排序的用户定义类型,可创建一数据库存储中的表,它具有被定义为用户定义类型的列。然后可在该列上创建一索引。可在引用该用户定义类型的查询语言表达式上创建索引。在这一情况下,首先在表达式上生成计算的列,然后在计算的列上创建索引。集合数据密集型应用使用对象模型来捕捉真实世界的部分(也称为“对象数据建模”)。实体(如,基于项的硬件/软件接口系统中的“项”)和关系是两种常见的数据建模构造。例如,如果Author(作者)和Document(文档)是两种类型的实体,则在Authors和Documents之间可以有若干关系,如“由作者写的所有文档”以及“由作者审阅的所有文档”等等。实体包含一组属性,它们可以是标量值和/或集合值(或集值)。例如,Author实体可包含作者名字和生日的标量值属性,以及作者的一组地址和一组电话号码的集合值属性。这些集合值属性与标量值属性一样,嵌入在实体中—即,它们被认为是实体的一部分,并且不仅仅是从实体到另一实体的已定义关系。这些集合的每一个(称为“嵌入集合”)通常包含少量的成员(或“元素”),并且在某些情况下,这些集合的成员可具有相对的重要性顺序(如,当用户具有主要地址、次要地址等等)。如此处所使用的,无序集合被称为“多重集”,而有序集合被称为“列表”,后者是前者的扩充,它进一步考虑了集合内成员的相对顺序。可扩充的关系型数据存储尽管在现有的数据库产品中实现了集合,然而这些产品通常使用诸如主关键字—外关键字概念等基于值的关系对集合建模,并且因此不能作为关系型可查询对象来处理。此外,对集合的查询—例如,“返回生活在X城市的所有联系人”—一般需要遍历该集合的所有路径,因为所述集合不是关系型可查询对象。可扩充关系型数据存储(ERDS)是允许实体被建模为用户定义类型(UDT)的关系型数据存储,如在2004年2月10日提交的名为“数据库系统中提供用户定义类型的系统和方法”的美国专利申请号10/755,282(委托摘要号MSFT-3029/307007.01)中所述的,它描述了UDT的实现。在ERDS中,将这些集合建模为用户定义类型(UDT)的一部分将更自然和方便,其中,集合UDT在适当时可以作为标量和关系两者来处理。因此,本领域中需要的是用于将集合建模为ERDS中的UDT的一部分的方法,以及可以作为标量来处理或作为关系来查询的集合。
发明内容本发明的若干实施例针对用于扩充扩展的关系型数据存储(ERDS)的UDT框架,以包括对无序集合(多重集)和有序集合(列表)的支持的系统和方法。更具体地,本发明的若干实施例使用UDT基础结构、CLR类属(generic)和新的UNNEST操作符对同时为标量和关系的集合创建并使用特殊类型的抽象。作为标量,该集合类型可由理解标量的数据存储引擎(包括但不限于客户机栈)的所有部分来处理,而作为关系,该集合类型与任何其它类型的关系一样可以被查询。本发明的各实施例针对一种数据存储,它包括既是标量又是关系的集合类型。对于这些实施例中的某一些,方法包括(a)为固有地用数据存储引擎的标量类型系统注册为标量的集合类型创建一UDT抽象;以及(b)如有需要,解嵌套(unnest)集合以作为关系型可查询对象来查询所述集合。本发明的若干实施例针对关系型数据存储中增强的实体集合,对于应用于所述集合的标量操作,该集合作为标量来处理,而对于应用于所述集合的查询操作,作为关系来查询所述集合。对于这些实施例中的某一些,关系型存储是一种可扩充的关系型数据存储,其中,所述集合既是从公用语言运行时刻(CLR)的类属用户定义类型中导出的,又是SQL标量类型(在SQL标量类型系统中)。这些实施例的某一些要求向关系型数据存储注册对应于该集合的集合类型和用户定义类型两者。另外,某些实施例在所述集合上特别地使用了一解嵌套操作,以将所述集合转换成包括第一列的关系型可查询对象,其中,所述第一列中的每一行对应于所述集合的单个成员(即,用于多重集)。其它实施例还包括第二列,所述第二列中的每一行对应于所述集合的单个成员,每一行具有对应于所述有序集合中的每一所述成员的顺序的值(用于列表)。对于所选择的实施例,多重集和列表都使用了相同的二列关系型可查询对象(其中,对于顺序不重要的多重集,第二列可被简单地忽略)。当结合附图阅读时,可以更好地理解上面的概述以及以下较佳实施例的详细描述。为说明本发明的目的,附图中示出了本发明的示例性构造;然而,本发明不限于所揭示的具体方法和手段。附图中图1所示是其中可结合本发明的各方面的计算机系统的框图;图2所示是以受管代码例示的用户定义类型的实例的串行化和解串行化的框图;图3所示是使可扩充关系型数据存储(ERDS)能够提供二元(标量和关系)集合类型的通用方法的流程图;图4所示是处理应用于实体中的集合的查询的通用方法的流程图;图5所示是具有多重集作为嵌入字段的结构化UDT的实体的框图,当被查询使,它被解嵌套成一可查询对象;以及图6所示是对列表而非多重集解嵌套的图5的可查询对象的部分框图。具体实施例方式使用了细节来描述本发明的主题以满足规定的要求。然而,该描述本身并不意在局限本发明的范围。相反,发明人构想要求保护的主题也可以结合其它现有或未来技术用其它方法实施,以包括类似于本文档中所揭示的不同步骤或元素。此外,尽管此处使用了术语“步骤”意味着所采用的方法的不同方面,然而该术语不应当被解释为暗示此处所揭示的各个步骤之中或之间的任何特定顺序,除非明确地描述了各个步骤的顺序。在以下描述的实施例中,本发明的上述特征被描述为在MICROSOFTSQLSERVER数据库系统中实现。如上所述。SQLSERVER结合了MICROSOFT.NET公用语言运行时刻(CLR)以使能够书写并执行受管代码,以在SQLSERVER数据库的数据存储上操作。尽管以下描述的实施例是在这一环境中操作的,然而可以理解,本发明决不限于在SQLSERVER产品中的实现。相反,本发明可以在支持面向对象的编程代码的执行以在数据存储上操作的任一数据库系统中实现,如面向对象的数据库系统和具有对象关系型扩展的关系型数据库系统。因此,可以理解,本发明不限于以下所描述的特定的实施例,但是旨在覆盖落入所附权利要求书中定义的本发明的精神和范围中的所有修改。计算机环境本发明的众多实施例可在计算机上执行。图1及以下讨论提供了对适于在其中实现本发明的计算环境的简要概括描述。尽管并非所需,但本发明将在诸如由如客户机工作站或服务器等计算机执行的程序模块等计算机可执行指令的一般上下文环境中描述。一般而言,程序模块包括例程、程序、对象、组件、数据结构等等,执行特定的任务或实现特定的抽象数据类型。此外,本领域的技术人员可以理解,本发明可以用其它计算机系统配置来实践,包括手持式设备、多处理器系统、基于微处理器或可编程消费者电子设备、网络PC、小型机、大型机等等。本发明也可以在分布式计算环境中实践,其中,任务由通过通信网络连接的远程处理设备来执行。在分布式计算环境中,程序模块可以位于本地和远程存储器存储设备中。如图1所示,示例性通用计算系统包括常规个人计算机20或其类似物,包括处理单元21、系统存储器22以及将包括系统存储器的各类系统组件耦合至处理单元21的系统总线23。系统总线23可以是若干种总线结构类型的任一种,包括存储器总线或存储器控制器、外围总线以及使用各类总线体系结构的任一种的局部总线。系统存储器包括只读存储器(ROM)24和随机存取存储器(RAM)25。基本输入/输出系统(BIOS)26,包含如在启动时协助在计算机20内的元件之间传输信息的基本例程,可储存在ROM24中。个人计算机20也可包括用于对硬盘(未示出)进行读写的硬盘驱动器27、用于对可移动磁盘29进行读写的磁盘驱动器28以及用于对可移动光盘31,如CD-ROM或其它光介质进行读写的光盘驱动器30。硬盘驱动器27、磁盘驱动器28以及光盘驱动器30分别通过硬盘驱动器接口32、磁盘驱动器接口33和光盘驱动器接口34连接至系统总线23。驱动器及其相关的计算机可读介质为个人计算机20提供了计算机可执行指令、数据结构、程序模块和其它数据的非易失存储。尽管这里描述的示例性环境采用了硬盘、可移动磁盘29以及可移动光盘31,然而本领域的技术人员应当理解,也可以在示例性操作环境中使用可储存可由计算机访问的数据的其它类型的计算机可读介质,如盒式磁带、闪存卡、数字视频盘、Bernoulli盒式磁盘、随机存取存储器(RAM)、只读存储器(ROM)等等。若干程序模块可储存在硬盘、磁盘29、光盘31、ROM24或RAM25中,包括操作系统35、一个或多个应用程序36、其它程序模块37以及程序数据38。用户可以通过诸如键盘40和定位设备42等输入设备向个人计算机20输入命令和信息。其它输入设备(未示出)可包括麦克风、操纵杆、游戏垫、圆盘式卫星天线、扫描仪等等。这些和其它输入设备通常通过耦合至系统总线23的串行端口接口46连接到处理单元21,但也可以通过其它接口连接,如并行端口、游戏端口或通用串行总线(USB)。监视器47或其它类型的显示设备也通过接口,如视频适配器48连接到系统总线23。除监视器47之外,个人计算机通常包括其它外围输出设备(未示出),如扬声器和打印机。图1的示例性系统也包括主机适配器55、小型计算机系统接口(SCSI)总线56和连接到SCSI总线56的外部存储设备62。个人计算机20可以在使用到一个或多个远程计算机,如远程计算机49的逻辑连接的网络化环境中操作。远程计算机49可以是另一个人计算机、服务器、路由器、网络PC、对等设备或其它公用网络节点,并通常包括许多或所有上述与计算机20相关的元件,尽管在图1中仅示出了存储器存储设备50。图1描述的逻辑连接包括局域网(LAN)51和广域网(WAN)52。这类网络环境常见于办公室、企业范围计算机网络、内联网以及因特网。当在LAN网络环境中使用时,计算机20通过网络接口或适配器53连接至局域网51。当在WAN网络环境中使用时,个人计算机20通常包括调制解调器54或其它装置,用于通过广域网52,如因特网建立通信。调制解调器54可以是内置或外置的,通过串行端口接口46连接至系统总线23。在网络化环境中,描述的与计算机20相关的程序模块或其部分可储存在远程存储器存储设备中。可以理解,示出的网络连接是示例性的,也可以使用在计算机之间建立通信链路的其它装置。尽管构想本发明的众多实施例尤其适用于计算机化的系统,然而本文档中没有任何内容旨在将本发明限于这类实施例。相反,如此处所使用的术语“计算机系统”旨在包含能够储存和处理信息和/或能够使用储存的信息来控制设备本身的行为或执行的任一和所有设备,不论这类设备本质上是电子的、机械的、逻辑的还是虚拟的。UDT和受管代码图2所示是用户定义类型(UDT)的一个实例的串行化和解串行化的框图。如图所示,UDT的一个实例通过对在存储器中表示该实例的对象的串行化来持久保存在盘上。当应用程序生成一包括引用UDT实例的方法的谓词或表达式的查询时,该实例的持久保存的形式被解串行化(也称为“水合(hydration)”的过程),并且CLR为整个对象分配存储器,以接收其储存的值。CLR然后在该对象上调用实现应用程序或用户期望的行为的适当方法。如先前所讨论的,UDT是在向SQLSERVER注册的组件中实现的受管类型。UDT可在可使用本机类型的大多数情况下使用,包括表定义变量和参数。UDT中定义的符合UDT约定的方法、属性和字段可从T-SQL中调用。本质上,UDT被假定为具有行为的简单标量。这一假定在简单编程模型和UDT所支持的串行化布局中得到反映。这一结构可用于UDT抽象以创建“结构化类型”,它们不是简单的标量,但可以是具有复杂结构和行为的类型。集合—多重集本发明的各个实施例针对既是标量又是关系的数据存储抽象(或类型)—即,作为标量,该类型可流过理解标量的所有数据存储引擎(包括客户机栈)的所有部分,而作为关系,该类型是可查询的。这些实施例的某一些使用UDT基础结构、CLR类属和新的UNNEST操作符来共同启用此二元类型。图3所示是使可扩充关系型数据结构(ERDS)能够提供二元集合类型的通用方法的流程图。为实现这一类型的集合,在步骤302,使用CLR的类属特征来定义类属类型,如Collection<T>。这一类型作为“系统UDT”(即,在一个地方定义,并在所有数据库中自动可用的UDT)来创建,并且是SQL标量类型系统的第一类部分。由此,该类型可在支持标量类型的所有环境中使用,如列定义、变量、函数自变量和储存的过程参数。这些类型也在标量表达式求值环境中得以支持。在步骤304,可使用类属类型来创建一种具体集合类型,作为类属集合类型的导出类型—即,一种类型,其中所述成员不再是类属的,但是相反被定义为标量类型或其它复杂类型。在此示例中,具体类型用于地址,其中,各个成员是标量字符串类型。在一个替换实施例中,各个成员可以是包括第一字符串(用于街道地址)、第二字符串(用于城市)、字符对(用于州)和五位整数(用于邮政编码)的复杂类型。如果集合被声明为包含特定类型的元素,则该UDT的任一子类型的值可被储存在该集合中(被称为“可替代性”)。集合类型及其元素类型之间的关系在类型创建时刻被记录在元数据中,并且通过可查询类别视图可用,后者进而使应用程序能够组成查询以确定特定集合类型的可替代范围。在步骤306,一旦实体本身被例示,可将新的具体集合类型用作实体中的属性。在这一点上,有序集合固有地作为标量属性来处理,除非向其应用查询,在这一情况下,数据存储引擎识别该集合类型的特殊特征,并将该集合作为关系来处理。为导航集合,通常要求查询通过集合遍历路径,以回答诸如“返回生活在X城市的所有联系人”等问题。然而,对于本发明的若干实施例,查询引擎认识到这—特殊的集合系统类型—如“Collection<T>”—除与UDT相关联的标量语义之外还有关系语义,并且在需要时新的关系型操作符“UNNEST”应当用于将该标量变换成关系型可查询对象。该操作符在支持表值函数的所有环境中都得以支持,并且包含UNNEST操作符的视图定义是可索引的。图4所示是用于处理应用于实体中的集合的查询的通用方法的流程图。在步骤402,对于集合作出查询,如果集合是除集合之外的任何东西,则对数据存储引擎生成一SQL错误,但是相反,在步骤404,数据存储引擎认识到该集合是一种特殊的数据类型,并且在步骤406,解嵌套该集合以创建可查询的对象—用于多重集,在本示例中是单列表—并且在步骤408,将查询重定向到该可查询对象。例如,图5所示是“Person(个人)”实体500的框图,它是具有地址的多重集等作为嵌入字段510的结构化UDT,当被查询时,它被解嵌套成一可查询对象(单列表)410′。Person的受管类型定义如下[SqlUDT(Format.Structured)]publicclassPerson{…Collection<Address>Addresses;…}为创建这一类型,首先向存储注册嵌入的集合类型,如下createtypeSetOfAddressesfromCollection<Address>go下一步,注册format.structuredUDT,如下createtypePersonexternalname[asm][Person]go之后,为返回地址集作为标量,可使用以下命令selectpcol.Addressesfromt类似地,为在UDT和嵌入的集合上调用方法,可使用以下命令selectpcol.Name,pcol.Addresses.Countfromt为查询该集合,诸如寻找其地址在华盛顿州的所有人,可使用以下命令selectpcolfromtcrossapplyunnest(pcol.Addresses)awherea.State=′WA′为更新Person,诸如将其所有地址的州变为华盛顿州,可使用以下命令updatetsetpcol.(updateAddressessetState=′WA′)wherepcol.id=23同样,为在集合上调用增变器方法,可使用以下命令updatetsetpcol.Addresses.Clear()wherepcol.id=23对于本发明的特定实施例,实现框架使用了采用流化表值函数基础结构的UDT、CLR类属和UNNEST操作。系统UDT是使用用户定义类型(UDT)基础结构实现的系统类型。系统UDT与终端用户创作的UDT在以下方面有所不同(a)系统UDT在所有数据库中可用,并且对所有用户都是可访问的;(b)系统UDT不能由终端用户创建或丢弃;(c)系统UDT可跨数据库使用,如同系统中有单个这样的类型一样(即,一个数据库中的系统类型的实例可以从另一数据库中使用)(“类型身份”);(d)系统UDT可在“系统”组件中实现(如,System.Data.dll),并且这一系统组件可以是从数据库之外的某处(如,盘)加载的基本CLR基础结构的一部分;以及(e)系统UDT是SYS方案的一部分,因此用户不可能用与系统UDT相同的名字来创建其自己的UDT。类属是参数化的类型定义,它可用于集合类库(如,MultiSet<T>),使得一旦对每一“具体例示”(如,MultiSet<Address>或MultiSet<PhoneNumber>)具有一类型安全的实现,并且在此之后,可能全局地定义“类属多重集”—换言之,MultiSet<T>是例如在UDTextensions.dll中定义一次的类属系统UDT。UNNEST操作符采用了类型MultiSet<T>的UDT(或其SQL类型是另一具体多重集类型),并将其变换成单列表,所述列的每一行对应于所述集合的成员,由此启用了传输过程中(on-the-fly)的查询和所述集合的成员的导航。对于本发明的某些实施例,在绑定过程中,为UNNEST操作产生的列创建一特殊的名字空间,并且UNNEST操作本身变成流化表值函数。这一优化允许集合从标量变换到关系,以不需要干预数据的复制。这一方法也提供了结果上的流化模型,使得它们可在没有冗余具体化的情况下被消耗。(流化表值函数在2004年4月9日提交的名为“用于基于分段的串行化的系统和方法”的美国专利申请号10/821,687(委托摘要号MSFT-2955/307064.01)中有描述。)集合—列表列表是被扩充以捕捉集合成员的顺序的集合。类似于多重集,该类型的值可在允许UDT值的所有环境中使用,包括变量、参数、返回值和列定义。列表也与将固有为标量的集合值变换成关系的UNNEST函数一起运作;然而,由UNNEST产生的关系方案将具有至少两个列,一个包含成员(每行一个成员),另一列(或伪随机列或虚拟列)包括指示所述成员在所述列表中的相对顺序的值,如,给定元素的顺序。图6所示是图5的可查询对象510″的部分框图,它是在查询被定向到列表而非多重集时创建的。同样,如多重集一样,可扩充TSQLDML以支持类型List的值上的数组访问操作。对于该类型的正交矩阵约定的其它方面(包括转换矩阵和跨数据库环境中的使用),被假定为与Format.StructuredUDT(如下文所使用的)相同。另外,“列表”也可以指“数组”,后一术语在SQL99标准中使用。以下示例示出了包含地址和电话号码两个列表值属性的替换UDTPerson类[SqlUdt(Format.Structured)]classPerson{StringName;DateTimeBirthdate;SqlList<Address>Addresses;SqlList<Phone>Phones;}上面的类型SqlList<Address>和SqlList<Phone>使用新的数据定义语言(DDL)语句向SQL服务器定义createtypeListOfAddressfromLIST<Address>createtypeListOfPhonefromLIST<Phone>以下语句然后创建具有表Person的列的表createtablePersons(pcolPerson)一旦完成,以下语句可用于创建具有两个地址和三个电话的Person实例,如下declare@pPerson,@a1Address,@a2Addressdeclare@p1Phone,@p2Phone,@p3Phoneset@p=convert(Person,″JohnSmith,11/11/1977″)set@a1=convert(Address,″6138205thDRNE,Redmond,WA,98053″)set@a2=convert(Address,″1576599thAveNE,Seattle,WA98001″)set@p1=convert(Phone,″Office,2066863452″)set@p2=convert(Phone,″Home,4257086456″)set@p3=convert(Phone,″Cell,4252773242″)set@p.Addresses[1]=@a1set@p.Addresses[2]=@a2set@p.Phones[1]=@p2set@p.Phones[2]=@p1set@p.Phones[3]=@p3insertintoPersonsvalues(@p)之后,可查询Person表中其主要地址在西雅图的人的所有的次要地址和蜂窝电话,如下selectpcol.name,pcol.addresses[2],pcol.Phones[3]fromPersonswherepcol.addresses[1].city=″Seattle″再一次,UNNEST是采用列表作为自变量,并产生一组行的结构,对列表的每一元素有一行。UNNEST产生两个列,一个列用于成员元素,另一列用于列表中每一成员的相对顺序(如,对应的元素优先级的顺序值)。总结此处描述的各种系统、方法和技术可以用硬件或软件,或在适当处用两者的组合来实现。由此,本发明的方法和装置,或其某些方面或部分,可采用包含在诸如软盘、CD-ROM、硬盘驱动器或任一其它及其可读存储介质等有形介质中程序代码(即,指令)的形式,其中,当程序代码被加载到诸如计算机等机器并由其执行时,该机器变为用于实施本发明的装置。在可编程计算机上的程序代码执行的情况下,计算机一般包括处理器、处理器可读的存储介质(包括易失和非易失存储器和/或存储元件)、至少一个输入设备以及至少一个输出设备。一个或多个程序较佳地以高级过程语言或面向对象的编程语言来实现,以与计算机系统通信。然而,如有需要,程序可以用汇编语言或机器语言来实现。在任何情况下,语言可以是已编译或已解释语言,并与硬件实现相组合。本发明的方法和装置也能以程序代码的形式来实现,该程序代码通过某一传输介质来发送,如通过电线或电缆、通过光纤或通过任一其它形式的传输,其中,当程序代码由诸如EPROM、门阵列、可编程逻辑器件(PLD)、客户机计算机、录像机等的机器接收并装载到其中由其执行时,该机器变为用于实施本发明的装置。当在通用处理器上实现时,程序代码与处理器相结合,以提供用于执行本发明的索引功能的单独的装置。尽管结合各个附图的较佳实施例描述了本发明,然而可以理解,可以使用其它类似的实施例,或对所描述的实施例作出修改和添加,以执行本发明的相同的功能,而不脱离本发明。例如,尽管在仿真个人计算机的功能的数字设备的环境中描述了本发明的示例性实施例,然而本领域的技术人员将认识到,本发明不限于这类数字设备,如本申请中所描述的,本发明可应用于任意数量的现有或新兴计算设备或环境,如游戏控制台、手持式计算机、便携式计算机等等,无论它们是有线还是无线的,并且本发明可应用于通过通信网络连接,并在网络上交互的任意数量的这类计算设备。此外,应当强调,本发明考虑了各种计算机平台,包括手持设备操作系统和其它应用专用硬件/软件接口系统,尤其是当无线网络化设备的数量持续增长时。因此,本发明不应当限于任何单个实施例,而是相反,应当依照所附权利要求书的广度和范围来解释。权利要求1.一种用于实现增强的集合,作为关系型数据存储中的实体的属性的方法,其特征在于,所述方法包括对于应用于所述集合的标量操作,将所述集合作为标量来处理;以及对于应用于所述集合的查询操作,将所述集合作为关系来查询。2.如权利要求1所述的方法,其特征在于,所述关系型存储是可扩充关系型数据存储,并且所述集合既是从公用语言运行时刻(CLR)的类属用户定义类型(UDT)导出的,又是顺序查询语言(SQL)标量类型。3.如权利要求2所述的方法,其特征在于,所述类属用户定义类型是系统的用户定义类型。4.如权利要求3所述的方法,其特征在于,还包括向所述关系型数据存储注册所述集合类型;以及向所述关系型数据存储注册对应于所述集合的用户定义类型。5.如权利要求4所述的方法,其特征在于,作为关系查询所述集合的所述元素包括将所述集合解嵌套成一包括第一列的关系型可查询对象,其中,所述第一列中的每一行对应于所述集合的单个成员;以及查询所述关系型可查询对象。6.如权利要求5所述的方法,其特征在于,所述关系型可查询对象包括第二列,所述第二列的每一行对应于所述集合的单个成员,每一行具有对应于所述有序集合中的每一所述成员的顺序的值。7.如权利要求3所述的方法,其特征在于,它由硬件控制设备来实现,所述硬件控制设备包括用于实现所述方法的每一元素的装置。8.一种包括计算机可读指令的计算机可读介质,所述指令用于实现一增强的集合,作为关系型数据存储中的实体属性,其特征在于,所述计算机可读指令包括指令,用于当向所述集合应用标量操作时,将所述集合作为标量来处理;以及当向所述集合应用查询操作时,将所述集合作为关系来查询。9.如权利要求8所述的计算机可读介质,其特征在于,还包括指令,其中,所述关系型存储是可扩充关系型数据存储,并且其中,所述集合既是从公用语言运行时刻(CLR)的类属用户定义类型(UDT)导出的,又是顺序查询语言(SQL标量类型。10.如权利要求9所述的计算机可读介质,其特征在于,还包括指令,其中,所述类属用户定义类型是系统用户定义类型。11.如权利要求10所述的计算机可读介质,其特征在于,还包括指令,用于向所述关系型数据存储注册所述集合类型;以及向所述关系型数据存储注册对应于所述集合的用户定义类型。12.如权利要求11所述的计算机可读介质,其特征在于,还包括指令,其中,作为关系查询所述集合的所述元素包括将所述集合解嵌套成一包括第一列的关系型可查询对象,其中,所述第一列中的每一行对应于所述集合的单个成员;以及查询所述关系型可查询对象。13.如权利要求12所述的计算机可读介质,其特征在于,还包括指令,其中,所述关系型可查询对象包括第二列,所述第二列中的每一行对应于所述集合的单个成员,每一行具有对应于所述有序集合中每一所述成员的顺序的值。14.如权利要求10所述的计算机可读介质,其特征在于,所述计算机可读介质是通过通信介质发送的电磁载波信号。15.一种用于实现一增强的集合,作为关系型数据存储中的实体属性的系统,其特征在于,所述系统包括至少一个子系统,用于当向所述集合应用标量操作时,将所述集合作为标量来处理;以及当向所述集合应用查询操作时,将所述集合作为关系来查询。16.如权利要求15所述的系统,其特征在于,还包括至少一个子系统,其中所述关系型存储是可扩充关系型数据存储,并且其中,所述集合既是从公用语言运行时刻(CLR)的类属用户定义类型(UDT)导出的,又是顺序查询语言(SQL)标量类型。17.如权利要求16所述的系统,其特征在于,还包括至少一个子系统,其中,所述类属用户定义类型是系统用户定义类型。18.如权利要求17所述的系统,其特征在于,还包括至少一个子系统,用于向所述关系型数据存储注册所述集合类型;以及向所述关系型数据存储注册对应于所述集合的用户定义类型。19.如权利要求18所述的系统,其特征在于,还包括至少一个子系统,用于将所述集合解嵌套成一包括第一列的关系型可查询对象,其中,所述第一列的每一行对应于所述集合的单个成员;以及查询所述关系型可查询对象。20.如权利要求19所述的系统,其特征在于,还包括至少一个子系统,其中,所述关系型可查询对象包括第二列,所述第二列中的每一行对应于所述集合的单个成员,每一行具有对应于所述有序集合中的每一所述成员的顺序。全文摘要本发明的若干实施例针对用于扩充扩展的关系型数据存储(ERDS)的UDT框架,以包括对无序集合(多重集)和有序集合(列表)的支持的系统和方法。更具体地,本发明的若干实施例使用UDT基础结构、CLR类属和新的UNNEST操作符来为既是标量又是关系的集合创建并使用特殊类型的抽象。作为标量,该集合类型可由理解标量的数据存储引擎(包括但不限于客户机栈)的所有部分来处理,而作为关系,该集合类型与任何其它类型的关系一样都是可查询的。文档编号G06F17/30GK1694098SQ20051007002公开日2005年11月9日申请日期2005年4月29日优先权日2004年4月30日发明者B·拉塔克瑞施纳,B·塞兹金,D·Y·艾尔图多夫,J·A·布莱克雷,O·N·泽利格,R·凡卡特实,俞玮,B·H·M·德内特,C·J·库宁汉姆,D·V·楚林,S·斯特凡尼,D·托米克申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1