Jinghao Liu (刘劲浩)'s BLOG

一个专门有关SQL Server的中文博客. 主要面向中国的SQL Server用户. 侧重于介绍的SQL Server 2005在XML方面的功能.也会尽力解答其他SQL相关问题.

  • 吉姆•格雷失踪了!

    吉姆·失踪了!” 

    当我看到同事转发来的email的题目时,我真有点不相信自己的眼睛.  读完了那篇Mercury News的报道, 经过了初期震惊后的理性告诉我: 这是因为我不愿意相信.

    大部分SQL Server team 的人都是那种只信科学不信神的 hard core geeks.  但我想很多人可能都象我一样,在心里暗中祈祷奇迹发生.  都是在RDBMS这个圈子里的人.  这里有太多吉姆的朋友,前同事, 和粉丝.  另外作为微软的一员,我们知道公司失去了唯一的图灵奖获得者L.

    吉姆是分布式计算技术(distributed computing )”先知级鼓吹者(区别于事后诸葛亮们).  这是一篇他在1985年写的文章: http://research.microsoft.com/~gray/papers/TandemTR85.4_AnApproachToDecentralizedComputerSystems.pdf.  懂计算机且置身于Web2.0时代的人读了这篇东西,会明白为什么他得计算机领域中的诺贝尔.

    我有幸和吉姆·雷有过一次近距离的接触. 2005年初,我们SQL 2005 XML项目组请他来review 我们做的XML features. 我们五,六个人为他演示和讲解了SQL 2005 XML Datatype, XML Index, XML Schema Collection, XQuery, FOR XML等功能. 他给我们提了一些有关应用方面的建议. 给我留下很深印象的是: 这位六十岁左右的老人敏捷的思路和对新东西无止境的好奇心. 我从小在研究大院长大. 来美国前也在研究单位工作过. 到微软后更是接触了太多聪明绝顶的中国人. 坦率的讲,我就从来没有碰见过他这样功成名就后的依然科学家的科学家. 我到是见识过很多开公司发财的前科学家,热衷于政治的前科学家,当了德育导师的前科学家,当然更多的是当了VP 或各种 % 长的前科学家. 让我真佩服钱钟书在围城里总结的:”外国科学进步,中国科学家进爵L.

    当我回家对太太提及吉姆出海失踪一事时, 她评论说有钱玩这种帆船,飞机有什么好? 约翰.丹佛和小肯尼迪就是玩飞机死的.  这又有一个玩船的.”.  太太说得一点没错.  但我还是挺羡慕吉姆的.  人都有一死.  如果能干着自己最享受的事走向终点,不亦乐呼!

    Have Fun, Jim!

    P.S: 有关这件事的中文报道见: http://www.thefirst.cn/82/2007-02-02/44683.htm

  • SQL2005对XSD的支持更丰富了数据建模的方法

    在SQL2005中,有一个新的顶级对象(top level object)被加入: XML架构集合(XML Schema Collection).  它提供给用户贮存XSD (XML Schema Definition)并用之验证特定XML格式的能力. 更重要的是,它提供了一种可更丰富描述数据模型的方法

    举例:
    create xml schema collection xsdPurchaseOrder as
    N'<schema targetNamespace="http://www.example.com/IPO" xmlns="http://www.w3.org/2001/XMLSchema"
     xmlns:ipo="http://www.example.com/IPO" elementFormDefault="qualified">

     <annotation>
       <documentation xml:lang="zh-Hans">
      为国际订货单据定义的各种地址格式
      Copyright 2000 Example.com. All rights reserved.
       </documentation>
     </annotation>

     <!-- 一般地址 -->
     <complexType name="Address">
       <sequence>
         <element name="name" type="string"/>
         <element name="street" type="string"/>
         <element name="city" type="string"/>
       </sequence>
     </complexType>

     <!-- 美国地址附加信息 -->
     <complexType name="USAddress">
       <complexContent>
         <extension base="ipo:Address">
           <sequence>
             <element name="state" type="ipo:USState"/>
             <element name="zip" type="positiveInteger"/>
           </sequence>
         </extension>
       </complexContent>
     </complexType>

     <!-- 中国地址附加信息 -->
     <complexType name="CNAddress">
       <complexContent>
         <extension base="ipo:Address">
           <sequence>
             <element name="省" type="ipo:CNProvince"/>
           <element name="邮编" type="positiveInteger"/>
        </sequence>
      </extension>
       </complexContent>
     </complexType>

     <!-- 定义美国州的数据类型 -->
     <simpleType name="USState">
       <restriction base="string">
         <enumeration value="AK"/>
         <enumeration value="AL"/>
         <enumeration value="AR"/>
         <!-- and so on ... -->
         <enumeration value="PA"/>
       </restriction>
     </simpleType>

     <!-- 定义中国省的数据类型 -->
     <simpleType name="CNProvince">
       <restriction base="string">
         <enumeration value="湖南"/>
         <enumeration value="湖北"/>
         <enumeration value="辽宁"/>
         <!-- and so on ... -->
         <enumeration value="江苏"/>
       </restriction>
     </simpleType>

     <!-- 根元素 -->
     <element name="purchaseOrder" type="ipo:PurchaseOrderType"/>

     <element name="comment" type="string"/>

     <complexType name="PurchaseOrderType">
      <sequence>
       <element name="shipTo" type="ipo:Address"/>
       <element name="billTo" type="ipo:Address"/>
       <element ref="ipo:comment" minOccurs="0"/>
       <!-- 为了简化我剩去了items的复杂定义 -->
       <element name="items" type="string"/>
      </sequence>
      <attribute name="orderDate" type="date"/>
     </complexType>
    </schema>'
    go

    针对上述格式,我们可将下面的订单存入数据库中带有此架构集合的XML列中. SQL Server将对要存入的XML进行验证(validate),确保数据的格式. 这实际上就提供了新的数据建模方法.

    create table tbl_Orders( id int, PurchaseOrder xml(xsdPurchaseOrder) )
    insert tbl_Orders value( 1,
    N'<purchaseOrder xmlns="http://www.example.com/IPO" orderDate="2005-10-30">
     <shipTo>
      <name>兴业公司</name>
       <street>兴业路十五号</street>
       <city>无锡</city>
       <省>江苏</省>
       <邮编>12345</邮编>
     </shipTo>
     <billTo>
      <name>ABC Corp</name>
      <street>1710 Madison Ave.</street>
      <city>Jamesville</city>
      <state>PA</state>
      <zip>98000</zip>
     </billTo>
     <comment>ABC Corp 购买一批组件并直接寄送兴业公司组装</comment>
     <items>541045系列组件</items>
    </purchaseOrder>' )
    go

    在上述例子中,我们定义了不同格式的地址并用xs:enumeration为<省>和<state>约束了数值范围.

  • XML提供新的数据建模方法

    W3C的专家们刚开始筹划XML(eXtensible Markup Language) 的标准时,他们的目的是发明一种比HTML更好得标识语言:Originally designed to meet the challenges of large-scale electronic publishing …”(http://www.w3.org/XML/)。没有想到最终结果却是为互联网上的数据传输提供了一个好办法。

     

    <Customer CustomerID="ALFKI" CompanyName="Alfreds Futterkiste" ContactName="Maria Anders" Phone="030-0074321">

      <Order OrderID="10643" OrderDate="1997-08-25T00:00:00">

        <OrderDetail UnitPrice="45.6000" Quantity="15">

          <Product Productname="Rössle Sauerkraut" UnitPrice="45.6000" />

        </OrderDetail>

        <OrderDetail UnitPrice="18.0000" Quantity="21">

          <Product Productname="Chartreuse verte" UnitPrice="18.0000" />

        </OrderDetail>

        <OrderDetail UnitPrice="12.0000" Quantity="2">

          <Product Productname="Spegesild" UnitPrice="12.0000" />

        </OrderDetail>

      </Order>

      <Order OrderID="10692" OrderDate="1997-10-03T00:00:00">

        <OrderDetail UnitPrice="43.9000" Quantity="20">

          <Product Productname="Vegie-spread" UnitPrice="43.9000" />

        </OrderDetail>

      </Order>

    </Customer>

     

    上面的XML非常自然的表现出客户、订单、订单细节、和产品之间的关系。这是因为在XML中,数据和元数据(Metadata)是结合在一起的。这个特点使XML具有自我解释的能力。这正是互联网数据传输所需耍的。

     

    SQL2000中,FORXML提供了非常简单快捷的方法将任何SELECT的结果变成任何的格式XMLOPENXML则可将任何的格式XML变成SELECT的结果。再加上SQLXMLAPISQL2000成为了第一个可直接面向互联网的关系性数据库。

     

    XML可以解决更多关系性数据库解决不了(or不好)的问题,特别是在数据模型(data modeling)方面:

    1. 半结构性semi-structure
    2. 分层hierarchical
    3. 保留顺序order preservation
    4. 非结构性un-structure

     

    通过下面的例子我们可以看到XML如何解决上述问题1,2,3.

     

    一个描述家族谱系的XML:

    <?xml version="1.0" encoding="utf-8"?>

    <成员 ="李一" 生日="yyyy-mm-dd" 冥日="yyyy-mm-dd">

     <成员 ="李二一" 生日="yyyy-mm-dd" 冥日="yyyy-mm-dd">

      <成员 ="李三一" 生日="yyyy-mm-dd" 冥日="yyyy-mm-dd">

      ...

      </成员>

       <成员 ="李三三" 生日="yyyy-mm-dd" 冥日="yyyy-mm-dd">

       ...

       </成员>

       <成员 ="李三四" 生日="yyyy-mm-dd" 冥日="yyyy-mm-dd">

        <成员 ="李四四" 生日="yyyy-mm-dd" 冥日="yyyy-mm-dd"/>

         <成员 ="李四六" 生日="yyyy-mm-dd" 冥日="yyyy-mm-dd">

          <成员 ="李五一" 生日="yyyy-mm-dd" 冥日="yyyy-mm-dd" ="李张氏">

           <成员 ="李六一" 生日="yyyy-mm-dd" 冥日="yyyy-mm-dd" ="李王氏">

            <成员 ="李七一" 生日="yyyy-mm-dd" 冥日="yyyy-mm-dd" ="李赵氏">

             <成员 ="李八一" 生日="yyyy-mm-dd" 冥日="yyyy-mm-dd" ="李张氏">

              <成员 ="李九一" 生日="yyyy-mm-dd" ="李胡氏" 职业="教师">

               <成员 ="李十一" 生日="yyyy-mm-dd" 职业="学生"/>

               </成员>

              </成员>

             </成员>

            </成员>

           </成员>

          </成员>

        <成员 ="李四七" 生日="yyyy-mm-dd" 冥日="yyyy-mm-dd"/>

        </成员>

       </成员>

     <成员 ="李二二" 生日="yyyy-mm-dd" 冥日="yyyy-mm-dd"/>

     <成员 ="李二三" 生日="yyyy-mm-dd" 冥日="yyyy-mm-dd">

      <成员 ="李三二" 生日="yyyy-mm-dd" 冥日="yyyy-mm-dd">

      ...

      </成员>

     </成员>

    </成员>

    从上面数据中,你可看出下述特点:

    1. 直观表现层次(hierarchical)。如要找出李五一所有直系子孙,只需执行查询 //成员[@="李五一"]
    2. 保留顺序(order preservation)。如要找出李第三个孩子的名字,只需执行查询 //成员[@="李二一"]/成员[3]/@
    3. 支持半结构性(semi-structure)数据。从李五一开始,增加了关于的新属性。从李九一开始,增加了关于职业的新属性。这些增加都不对已有数据产生影响。

    SQL2005通过对XML的内置(native support)和对XQuery的支持实现了上述功能.

  • [英文视频] 访谈吉姆·格雷: Sky Server 以及数据库技术的未来

    我想对数据库技术比较熟的朋友都应该听说过吉姆·格雷这个名字.  在我开始介绍有关SQL2005新的功能以前, 我想让大家看两段视频:

    http://channel9.msdn.com/ShowPost.aspx?PostID=49891

    http://channel9.msdn.com/Showpost.aspx?postid=50428

    在49891视频中吉姆谈了他们如何构建Sky Server (http://cas.sdss.org/dr4/en/): 一个把大部分宇宙空间数据存入SQL Server 并让你查询的网站.

    在50428视频中吉姆谈了他对未来数据库技术的一些看法.

     

  • 有关我TechEd讲座的补充资料(继续)

    我在讲座中用的demo.

    -- XML作为变量

    declare @x xml

    set @x = N'<根><元素 属性="1"/></根>'

    --select @x

    select @x.