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,如需转载请自行联系原作者
目录
相关文章
|
SQL 存储 NoSQL
SQL vs. NoSQL:如何根据大数据需求选择合适数据库
【4月更文挑战第8天】本文对比分析了SQL与NoSQL数据库在大数据项目中的应用。SQL数据库适合结构化数据、强一致性和复杂事务处理,如金融系统,而NoSQL则适用于半结构化和非结构化数据、高并发及大数据场景,如社交网络。选择时应考虑业务需求、技术栈、团队经验和成本效益,以找到最佳解决方案。随着技术发展,NewSQL和Multi-model数据库也提供了更多选择。
1072 0
|
SQL 存储 NoSQL
SQL、NoSQL还是NewSQL
【7月更文挑战第5天】SQL、NoSQL还是NewSQL
706 1
|
SQL NoSQL API
用 SQL 还是 NoSQL?Apipost 的回答是:两个都要!
构建API如同经营公司,需根据任务选择合适工具。数据库世界中,SQL(关系型)和NoSQL(非关系型)各有所长。SQL如高档餐厅的预约系统,结构化、规则明确,适合管理清晰格式的数据;NoSQL像美食车留言墙,灵活自由,适应多样化数据格式。 Apipost同时支持SQL与NoSQL,助你应对复杂应用场景。例如开发健身App,用SQL管理用户注册、付款等结构化数据,用NoSQL存储健身日记、自拍等灵活内容。选对工具,事半功倍,让API开发更智能高效!
|
SQL 存储 数据可视化
SQL 数据库大揭秘:连接数字世界的魔法桥梁
在数字化时代,数据如繁星般璀璨,而 SQL 数据库则像强大的引力场,有序汇聚、整理和分析这些数据。SQL 数据库是一个巨大的数字宝库,装满各行各业的“宝藏”。本文将带你探索 SQL 数据库在电商、金融、医疗和教育等领域的应用。例如,在电商中,它能精准推荐商品;在金融中,它是安全卫士,防范欺诈;在医疗中,它是健康管家,管理病历;在教育中,则是智慧导师,个性化教学。此外,还将介绍如何利用板栗看板等工具实现数据可视化,提升决策效率。
|
SQL 存储 设计模式
SQL与NoSQL的比较?
【7月更文挑战第30天】SQL与NoSQL的比较?
296 13
|
SQL NoSQL 数据库
开发效率与灵活性:SQL vs NoSQL
【8月更文第24天】随着大数据和实时应用的兴起,数据库技术也在不断发展以适应新的需求。传统的SQL(结构化查询语言)数据库因其成熟的数据管理机制而被广泛使用,而NoSQL(Not Only SQL)数据库则以其灵活性和扩展性赢得了众多开发者的青睐。本文将从开发者的视角出发,探讨这两种数据库类型的优缺点,并通过具体的代码示例来说明它们在实际开发中的应用。
501 1
|
SQL 存储 NoSQL
SQL和NoSQL数据库的全面比较
不可否认,已有越来越多开发人员愿意使用NoSQL数据库,并且在不断地壮大着其相应的社区。但是,相对于成熟的SQL社区,该领域的专家和顾问可能需要更多的时间,去解决那些未曾被记录的NoSQL问题。
660 0
|
SQL 存储 NoSQL
SQL与NoSQL数据库的选择:技术与场景驱动下的决策
【6月更文挑战第16天】**SQL vs NoSQL数据库:技术与应用场景比较。SQL数据库以其关系模型、ACID特性、灵活查询及事务处理见长,适合结构化数据和强一致性场景。NoSQL则以数据模型灵活性、高可扩展性、高性能及低成本著称,适合大数据、高并发和快速迭代的需求。选择应基于业务需求、数据特性、系统架构和成本。**
|
SQL 数据库 开发者