XQuery:连通SQL与NoSQL的良好桥梁

简介:

在企业应用软件设计中,原来往往只需要与一个SQL数据打交道,现在却往往要连接多个数据源,这些数据源可能是SQL数据库、NoSQL数据、XML文件、网站数据等。这么多复杂的数据,有没有办法让它们构成一个数据中心,以相对统一的方式进行管理和数据处理呢?XQuery是合适的前端。

  具体做法如下:

  ①在企业服务器上设定数据库连接池,并指定连接名称。

  ②选择合适的xquery引擎,并绑定企业服务器。

  ③扩展xquery的函数用于操作数据库,比如连接关系数据库,扩展以下函数,原型如下:

declare function sql:select($a as xs:string, $b as xs:string) as node() external;
declare function sql:update($a as xs:string, $b as xs:string) as xs:boolean external;
   ④使用xquery查询各单元的数据,合并处理后返回结果。

  ⑤使用xquery维护各数据单元。

  

  这样做有以下的优点:

  ①与Sql一样,对外提供统一查询和维护方式。

  ②可以以一种统一的方式构建数据中心管理工具。

  ③按数据特性,选择合适高效的存储单元。

  以后的模式是否应该这样:

  一些厂商提供各种具有一定特性的(比如Sql、Cache、Xml、Json、 File)的高性能数据单元。

  一些厂商提供高性能的数据中心管理工具,主要的查询和维护语言是xquery,也可延伸sql。

  数据库厂商不需要面面俱到,只需要提供的存储单元足够高效就可以。

  ④提高SQL数据库的分布性

  ⑤提高内容的分布性。

  ⑥更有效规划内容的存储方式。

  当然,这样的做法也存在一些缺点:

  ①xquery的性能还需要提高。

  ②增加了数据存储规划复杂性。

  下面是具体使用的例子:

  查询某类别下产品货号,类别以xml的方式保存在dbxml库,货号放在Sql Server中。

declare function sql:select($a as xs:string, $b as xs:string) as xs:string external;
declare function sql:update($a as xs:string, $b as xs:string) as xs:boolean external;

let $sTxt := xqilla:parse-xml($str)
let $ID := $sTxt/search/@ID

let $t := doc("dbxml:/product/productcategory.dbxml/data")//Category[@ID=$ID]
let $k := data($t/@ID|$t//Category/@ID)
let $s := concat("'",string-join($k,"','"),"'")

let $sql := <Sql>
            select  rtrim(ItemNo) as Code,Name,Spec  from ItemDetail  where CategoryID in ({$s})
                order by ItemNo
            FOR XML PATH ('Product'),ROOT ('Products')
        </Sql>

let $link := "link_erp1"
return  sql:select($link,$sql/text())
       使用xquery查询企业资源。

declare namespace fx = "http://local"; 
declare function sql:select($a as xs:string, $b as xs:string) as node() external;
declare function sql:update($a as xs:string, $b as xs:string) as xs:boolean external;

declare function fx:trim( $arg as xs:string? )  as xs:string
{
    replace(replace($arg,'\s+$',''),'^\s+','')
} ;

(:let $ResourceType :="Supplier":)
(:let $ResourceType :="Customer":)
(:let $ResourceType :="Goods":)

let $PageSize := 50 
let $PageIndex := 1

let $link := "link_erp1"
return 
(
    if($ResourceType="Supplier") then
    (
        let $query := <sql>
            DECLARE @PageSize int
            DECLARE @PageIndex int

            set @PageSize = {$PageSize};
            set @PageIndex = {$PageIndex};

            WITH Temp AS
            (
              SELECT ROW_NUMBER() OVER(ORDER BY SupplierNo ASC) AS RowNumber,*
              FROM Supplier1
            )

            SELECT  rtrim(SupplierID) as "@guid",
                     rtrim(SupplierNo) as SupplierNo,
                     rtrim(SupplierShort) as ShortName,
                     rtrim(SupplierName) as Name,
                     rtrim(SupplierAddress) as Address,
                     rtrim(CountryNo) as Country,
                     rtrim(ProvinceNo) as Province
                  FROM Temp
            WHERE (RowNumber BETWEEN @PageSize*(@PageIndex-1) + 1 AND @PageSize * @PageIndex ) 
            FOR XML PATH ('Supplier'),ROOT ('Suppliers')
        </sql>
        return sql:select($link,$query/text())
    )
    else if($ResourceType="Customer") then
    (
        let $query := <sql>
            DECLARE @PageSize int
            DECLARE @PageIndex int

            set @PageSize = {$PageSize};
            set @PageIndex = {$PageIndex};

            WITH Temp AS
            (
              SELECT ROW_NUMBER() OVER(ORDER BY CustomerNo ASC) AS RowNumber,*
              FROM Customer
            )

            SELECT     rtrim(CustomerID) as "@guid",
                    rtrim(CustomerNo) as CustomerNo,
                    rtrim(CustomerShort) as ShortName,
                    rtrim(CustomerName) as Name,
                    rtrim(CustomerAddress) as Address,
                    rtrim(Country) as Country
            FROM Temp
            WHERE (RowNumber BETWEEN @PageSize*(@PageIndex-1) + 1 AND @PageSize * @PageIndex ) 
            FOR XML PATH ('Customer'),ROOT ('Customers')
        </sql>
        return sql:select($link,$query/text())
    )else
    ()
)










本文转自 wws5201985 51CTO博客,原文链接:http://blog.51cto.com/wws5201985/740605,如需转载请自行联系原作者
目录
相关文章
|
6月前
|
SQL NoSQL 架构师
SQL还是NoSQL?架构师必备选型技能
SQL还是NoSQL?架构师必备选型技能
133 4
|
9月前
|
存储 SQL 监控
优质!从Sql到Nosql,redis+mysql从架构到优化全覆盖
Redis是一个远程内存数据库,它不仅性能强劲,而且还具有复制特性以及为解决问题而生的独一无二的数据模型。Redis 提供了5种不同类型的数据结构,各式各样的问题都可以很自然地映射到这些数据结构上:Redis的数据结构致力于帮助用户解决问题,而不会像其他数据库那样,要求用户扭曲问题来适应数据库。除此之外,通过复制、持久化( persistence )和客户端分片( client side sharding )等特性,用户可以很方便地将Redis扩展成一个能够包含数百GB数据、每秒处理上百万次请求的系统。
|
10月前
|
SQL NoSQL Oracle
常见的SQL和NOSQL对比
常见的SQL和NOSQL对比
76 0
|
SQL NoSQL 关系型数据库
软件测试|一篇文章教你SQL与NoSQL、数据库重要概念、SQL的基本语句
软件测试|一篇文章教你SQL与NoSQL、数据库重要概念、SQL的基本语句
106 0
|
存储 SQL 缓存
Redis(一)入门:NoSQL OR SQL,看完这篇你就懂了
非结构数据,根据定义是指数据结构不规则或不完整,没有任何预定义的数据模型,不方便用二维逻辑表来表现数据,例如网页日志、文本文档、图像、视频和音频文件等。
378 0
Redis(一)入门:NoSQL OR SQL,看完这篇你就懂了
|
SQL NoSQL druid
第十一篇:数据层解决方案 SQL NoSQL
第十一篇:数据层解决方案 SQL NoSQL
71 0
第十一篇:数据层解决方案 SQL NoSQL
|
存储 SQL JSON
2022 开发岗 SQL 和 NoSQL 数据库选择指南
本文将通过对比 MySQL 与 MongoDB 的一些性能和特点,来简单刨析结构化数据库与文档性数据库,从而给大家以后在生产环境中数据存储介质的选择提供一些参考。
208 0
2022 开发岗 SQL 和 NoSQL 数据库选择指南
|
SQL 存储 缓存
SQL、NoSQL 和 NewSQL,长江后浪推进浪!
SQL作为主要的数据存储方式已经超过40年,并且经历了至少两个指数扩张期:20世纪90年代Web应用程序崛起之后,以及在过去十年中由于移动设备爆炸引起的扩张。
110 0
|
SQL NoSQL 算法
NoSQL和SQL怎么选用?
NoSQL 有分很多种,其中key-value NoSQL (Redis, MemcacheD, etc) 的选用相对比较清楚些,大多是当后端Data storage的cache层来用。这篇主要想请教Column Family NoSQL (e.g. Cassandra, Hbase) 和SQL之间的选用。其中包含一些个人的理解,若有错误的地方烦请不吝指教!
NoSQL和SQL怎么选用?
|
存储 SQL 分布式计算
看云栖说云栖—— 开源、SQL or NoSQL
阿里云上的开源数据库、NoSQL数据库。
1012 0
看云栖说云栖—— 开源、SQL or NoSQL