65.9K
CodeProject 正在变化。 阅读更多。
Home

Oracle 的 Berkeley XML 数据库简介

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.57/5 (10投票s)

2007 年 3 月 20 日

12分钟阅读

viewsIcon

54870

downloadIcon

329

介绍 Oracle 的 Berkeley XML 数据库和命令行 shell 的文章。

Screenshot - BerkeleyXMLDB/bdb1.jpg

引言

本文是系列文章的一部分,重点介绍使用 Oracle Berkeley XML 数据库 BDB XML。BDB XML 可在开源许可证下下载,用于内部和个人开发。BDB XML 是一款小型解决方案,适用于需要可靠持久性层的客户端应用程序。本系列的第一个部分将包括环境设置说明和一些基本概念,并使用命令行 shell。第二部分将包括一个用 C# 编写的 .NET Framework 2.0 的演示应用程序,该应用程序将仅使用 BDB XML 库。这些文章旨在让您熟悉 Oracle Berkeley XML DB,并提供一个基本演示,说明如何将其集成到简单的应用程序中。这些文章绝不能代表 Oracle Berkeley XML DB 可用的全部功能和选项,但旨在帮助您入门。文章不会详细介绍 XPath、XQuery、FLOWR 等,也不会提供有关创建应用程序的最佳设计实践或模式的示例,将在页面底部提供进一步学习的资源。

Oracle Berkeley DB XML 是一款开源的嵌入式数据库,用于存储和检索具有索引功能的 XML 文档。该产品构建在开源 Berkeley 数据库之上。数据库与您的应用程序同进程运行,并提供下载包中的 Java 和 C++ API,但可以通过 C# 包装器(由 Parthenon Computing 提供)进行扩展,该包装器可与所有 CLR 兼容语言一起使用。XML 文档本身可以存储为整个文档,也可以通过将 XML 结构分解到节点级别来存储。BDB XML 提供 XPath、XQuery 和 FLOWR 的检索功能。本文提供了 XPath 示例:“XPath 是一种查询语言(具有一些编程语言特性),旨在查询 XML 数据集合。它在语义上与 SQL 相似。”(Wikipedia,http://en.wikipedia.org/wiki/XPath)。

为什么不直接使用 XML 文档或其他类型的文本存储?

  1. 因为 BDB XML 具有索引功能,这是一个很大的优点。
  2. 因为 BDB XML 提供事务处理功能。
  3. 因为 BDB XML 是基于标准构建的,这使得它比开发自定义框架更具可扩展性。
  4. 因为 BDB XML 可以用作嵌入式数据库并被应用程序包装。
  5. 因为 BDB XML 支持使用 FLOWR(本文不讨论)进行脚本编写,这与典型的关系数据库非常相似。

BDB XML 可能如何使用?

  1. BDB XML 可用于需要可靠嵌入式存储的客户端应用程序。
  2. BDB XML 可用作客户端-服务器应用程序的持久性层(需要构建一个接口来处理请求)。
  3. BDB XML 可用作事务发送到共享关系数据库之前的中间存储层,从而减少数据库服务器的负载。
  4. BDB XML 可在 Web 服务器上用于检索以 XML 格式存储的数据,以供 AJAX 网页使用(文档检索速度极快)。
  5. 因为 BDB XML 存储 XML 文档,而 .NET 语言允许将对象序列化为 XML 格式,所以 BDB XML 可用于持久化对象,以便以后检索和反序列化。(您可以看到这将走向何方!)。

使用代码

开始第一部分需要准备什么。如前所述,这是两部分系列文章的第一部分。对于这一部分,您需要以下准备。Berkeley XML 数据库,本文使用 2.1.8 版本(我建议使用此版本,尽管有更新的版本,因为本文假定使用的是此版本)。此下载链接指向一个 msi 安装程序,可从下面的 URL 免费下载。下载文件很大,但如果您正在编写一个带有嵌入式持久性层的应用程序,您只需要引用几个库 http://download.oracle.com/berkeley-db/dbxml-2.1.8.msi

入门步骤

  1. 在我们的示例中,我们创建一个名为 C:\BDBXML 的目录来存储我们的数据库
  2. 创建目录后,我们将使用 Berkeley XML DB shell。安装程序已经设置了环境变量,因此一旦您打开命令提示符并切换到刚刚创建的 C:\BDBXML 目录;您只需在提示符下键入“dbxml”。您始终可以通过键入“help”或“help + (要获取帮助的命令)”来获取 shell 中的帮助。您将看到一个如下所示的屏幕

  3. BDB XML 使用所谓的“容器”作为最高级别的存储;创建容器后,您可以向其中添加文档。您可以将容器视为数据库表(尽管存在差异)。我们将通过在命令提示符下键入以下命令来创建一个 Customer 容器。(createContainer Customers.dbxml n validate)。您应该看到以下内容

  4. 我们已创建了一个具有节点级别存储的容器,因此使用了“n”标志,并启用了模式验证,因此使用了“validate”标志。创建后,您将在 BDBXML 目录中看到一个名为 Customers.dbxml 的文件。
  5. BDB XML 允许像关系数据库一样创建索引。索引可用于提高性能,这超出了本文的范围。我们将创建一个索引,作为 CustomerId 字段上的唯一主键索引(这将是我们添加到此容器的 XML 文档中 Customers 的唯一标识符)。您需要在开始添加文档之前创建索引。在提示符下键入以下命令 (addIndex "" CustomerId unique-node-element-equality-decimal)。您将看到以下内容

  6. 我们在容器的默认命名空间 "" = default 中指定了一个新索引,具有以下属性,它将应用于 CustomerId 节点,约束为节点级别,使用 XML 元素将十进制类型进行比较,以查看每个条目是否唯一,因此使用了“unique-node-element-equality-decimal flag”。
  7. 现在是时候添加一些数据了。就像数据库表一样,我们希望将数据约束在规范或模式中。在示例中,我们希望 Customer 具有一个 CustomerId(整数,非空)、一个 CustomerFName(字符串,非空)和一个 CustomerLName(字符串,非空)。我们可以使用 XML Schema 来实现这一点(有关此主题的资源链接,请参阅文章末尾)。下面我为 Customer 定义了一个模式,我们所有的 Customer 条目都将根据此模式进行验证。文件文本如下。
    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema id="Customers" elementFormDefault="qualified" 
            xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="Customers">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Customer" type="Customer" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:complexType name="Customer">
        <xs:sequence>
          <xs:element name="CustomerId" type="xs:int" 
                maxOccurs="1" minOccurs="1" nillable="false">
          </xs:element>
          <xs:element name="CustomerFName" 
        type="xs:string" maxOccurs="1" minOccurs="1" nillable="false"/>
          <xs:element name="CustomerLName" 
        type="xs:string" maxOccurs="1" minOccurs="1" illable="false">
          </xs:element>
        </xs:sequence>
      </xs:complexType>
    </xs:schema>
    
  8. 我是使用 Visual Studio 2005 的 XSD 文档可视化设计器创建此模式的,它非常节省时间。
  9. 好了,现在是添加第一个客户的时候了。BDB XML 将数据存储在称为“文档”的逻辑容器中;可以将其视为数据库记录或多条记录。为了使我们的示例保持简单,我们将每个 Customer 放在自己的 XML 文档中。下面的文档代表我们的第一个客户,请注意我在顶部的声明中包含了 Customers.xsd 文件(当找不到模式时,“找不到是因为我们没有包含它”,将使用 Customers.xsd)因此 xsi:noNamespaceSchemaLocation="Customers.xsd"Customers.xsd 应该在您的根目录中,在本例中为 C:\BDBXML\Customers.xsd。文件文本如下。
    <?xml version="1.0" encoding="utf-8"?>
        <Customers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:noNamespaceSchemaLocation="Customers.xsd">
        <Customer>
                <CustomerId>1</CustomerId>
            <CustomerFName>Jimmy</CustomerFName>
            <CustomerLName>Page</CustomerLName>
        </Customer>
    </Customers>
    
  10. 由于我们在创建容器 "createContainer Customers.dbxml n validate" 时指定了 "validate" 标志,因此已启用模式验证,文档在添加时将被验证,只要您在所有 Customer XML 文档中包含正确的模式位置。我们在提示符下键入 (putDocument customer001 Customers.xml f)。注意:putDocument 命令后面的 customer001 唯一标识了 BDB XML 的文档;每次添加另一个文档(记录)时,都必须指定一个唯一的文档名称,例如 customer002customer003…为了省去麻烦,您应该采用一个唯一标识文档的命名约定,例如 ContainerName + Unique Key of record (customer001)。请注意 putCommand 的文档位置后面的“f”标志,它告诉 DB 我们正在添加一个 f= 文件(如果省略,您将收到一个异常)。同样,Customers.xml 文件应位于您的根目录 C:\BDBXML\Customers.xml。键入命令后,您应该看到以下内容

    image

  11. 我们添加了第一条记录!!让我们看看唯一约束是如何生效的。我将尝试再次添加该文档,这次我将 customer002 指定为文件标识符,但我不会更改 Customers.xml 文件中的 CustomerId

    image

  12. BDB XML 阻止我们输入两个具有相同 CustomerId 的客户。我们现在将更改客户信息并添加一些新客户,我刚刚打开了 Customers.xml 文件并更改了数据,然后保存它,最后发出了 putDocument 命令。请参见下文

    image

  13. 请注意,我必须为每个文档提供一个新的 ID customer002customer003customer004。如果我不这样做,我将收到一个错误,说明我违反了唯一约束。
  14. 现在让我们查询我们的条目。查询 BDB XML 中数据的方法之一是使用 XPath 表达式。我在文章末尾包含了一个资源链接,以便您可以熟悉 XPath(如果您还没有的话)。我们想查看我们添加的所有客户。为此,我们发出以下命令“query”并使用单引号括起来的 XPath 表达式 (query 'collection("Customers.dbxml")/Customers/*')。请注意容器名称周围的双引号和查询表达式周围的单引号。您应该看到以下内容

    image

  15. "collection(db 容器名称)" 指定我们可能返回多个记录。您会注意到返回了 4 个对象,要查看对象的数据,请发出 (print) 命令。请参见下文。

    image

  16. 现在我们可以看到我们添加的文档的内容了。现在让我们修改一些数据。我们将更新 CustomerId 为 1 的客户,并将 CustomerFName 更改为 Eric。您所有典型的数据修改都可以通过 XPath 表达式来实现。BDXML 要求您在进行修改之前实际加载要处理的节点。通过加载,我们选择要处理的节点。我认为最好在我的“query”命令中使用与我的 "updateNodes" 命令中完全相同的 XPath 表达式来选择或加载节点,以实际进行修改。因此,我们的命令将是 (query 'collection("Customers.dbxml")/Customers/Customer/CustomerFName[/Customers/Customer/CustomerId=1]') 来加载,而 (updateNodes 'collection("Customers.dbxml")/Customers/Customer/CustomerFName[/Customers/Customer/CustomerId=1]' 'Eric') 来进行更新。请注意,两个命令中的 XPath 表达式完全相同。请参见下文

    image

  17. 我们已经更新了 CustomerId=1Customer,并将 CustomerFName 更改为 Eric。
  18. 现在我们将删除一个 Customer。删除操作与更新操作略有不同;我们实际上是删除与客户关联的文档,为了做到这一点,我们必须调用 removeDocument 命令,因为我们实际上是在移除与我们的客户关联的文档。此命令需要文档名称作为参数。这就是为什么将文档命名为易于回忆的格式(例如 (container name + key) customer001)是明智的。您始终可以通过发出查询 XPath 表达式然后发出 printNames 命令来检索文档,该命令将列出查询返回结果的文档名称。要删除 CUstomerId=2 的客户,我们执行以下操作。我们的第一个命令是 (query 'collection("Customers.dbxml")/Customers/Customer[/Customers/Customer/CustomerId=2]'),然后我们发出 (printNames),这会返回文档名称 "customer002"。然后我们发出命令 (removeDocument customer002)。请参见下文

    image

    让我们查询所有客户以查看修改结果。我们将发出命令 (query 'collection("Customers.dbxml")/*') 来检索所有节点。您会注意到只返回了 3 个对象而不是 4 个,因为我们删除了客户 2。然后我们发出 (print) 命令来显示结果。如果我们查看文档,会发现我们已将 CustomerId=1 的客户更新为名字 Eric,并且我们还删除了我们的第一个客户,因此结果不显示该客户。请参见下文

    image

  19. 这标志着我们对 BDB XML 和命令行实用程序的介绍结束了。需要注意的一些事情是,XML 数据库的工作方式与传统的关系数据库不同。BDB XML 支持 XQuery、FLOWR 和许多其他功能,用于编写数据库脚本和复杂的文档转换。BDB XML 的 C++ API 和在其之上的 C# API 提供了比命令行 shell 更丰富的功能环境,所以不要因为 shell 的晦涩而退缩。在绝大多数情况下,您不会为应用程序使用 shell,但了解这个级别的运作方式是很有益的。

关注点

资源

在 dbxml shell 中,您始终可以键入“help”或“help + command(例如,help updateNodes) 来获取说明。以下是一些我找到的非常重要的资源。如果您认真打算使用 BDB XML,您将需要查阅这些链接。

© . All rights reserved.