Oracle 的 Berkeley XML 数据库简介






3.57/5 (10投票s)
2007 年 3 月 20 日
12分钟阅读

54870

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

引言
本文是系列文章的一部分,重点介绍使用 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 文档或其他类型的文本存储?
- 因为 BDB XML 具有索引功能,这是一个很大的优点。
- 因为 BDB XML 提供事务处理功能。
- 因为 BDB XML 是基于标准构建的,这使得它比开发自定义框架更具可扩展性。
- 因为 BDB XML 可以用作嵌入式数据库并被应用程序包装。
- 因为 BDB XML 支持使用 FLOWR(本文不讨论)进行脚本编写,这与典型的关系数据库非常相似。
BDB XML 可能如何使用?
- BDB XML 可用于需要可靠嵌入式存储的客户端应用程序。
- BDB XML 可用作客户端-服务器应用程序的持久性层(需要构建一个接口来处理请求)。
- BDB XML 可用作事务发送到共享关系数据库之前的中间存储层,从而减少数据库服务器的负载。
- BDB XML 可在 Web 服务器上用于检索以 XML 格式存储的数据,以供 AJAX 网页使用(文档检索速度极快)。
- 因为 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
入门步骤
- 在我们的示例中,我们创建一个名为 C:\BDBXML 的目录来存储我们的数据库
- 创建目录后,我们将使用 Berkeley XML DB shell。安装程序已经设置了环境变量,因此一旦您打开命令提示符并切换到刚刚创建的 C:\BDBXML 目录;您只需在提示符下键入“dbxml”。您始终可以通过键入“help”或“help + (要获取帮助的命令)”来获取 shell 中的帮助。您将看到一个如下所示的屏幕
- BDB XML 使用所谓的“容器”作为最高级别的存储;创建容器后,您可以向其中添加文档。您可以将容器视为数据库表(尽管存在差异)。我们将通过在命令提示符下键入以下命令来创建一个 Customer 容器。(
createContainer Customers.dbxml n validate
)。您应该看到以下内容 - 我们已创建了一个具有节点级别存储的容器,因此使用了“
n
”标志,并启用了模式验证,因此使用了“validate
”标志。创建后,您将在 BDBXML 目录中看到一个名为 Customers.dbxml 的文件。 - BDB XML 允许像关系数据库一样创建索引。索引可用于提高性能,这超出了本文的范围。我们将创建一个索引,作为
CustomerId
字段上的唯一主键索引(这将是我们添加到此容器的 XML 文档中Customers
的唯一标识符)。您需要在开始添加文档之前创建索引。在提示符下键入以下命令(addIndex "" CustomerId unique-node-element-equality-decimal)
。您将看到以下内容 - 我们在容器的默认命名空间
"" = default
中指定了一个新索引,具有以下属性,它将应用于CustomerId
节点,约束为节点级别,使用 XML 元素将十进制类型进行比较,以查看每个条目是否唯一,因此使用了“unique-node-element-equality-decimal flag
”。 - 现在是时候添加一些数据了。就像数据库表一样,我们希望将数据约束在规范或模式中。在示例中,我们希望
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>
- 我是使用 Visual Studio 2005 的 XSD 文档可视化设计器创建此模式的,它非常节省时间。
- 好了,现在是添加第一个客户的时候了。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>
- 由于我们在创建容器
"createContainer Customers.dbxml n validate"
时指定了"validate"
标志,因此已启用模式验证,文档在添加时将被验证,只要您在所有Customer
XML 文档中包含正确的模式位置。我们在提示符下键入(putDocument customer001 Customers.xml f)
。注意:putDocument
命令后面的customer001
唯一标识了 BDB XML 的文档;每次添加另一个文档(记录)时,都必须指定一个唯一的文档名称,例如customer002
、customer003
…为了省去麻烦,您应该采用一个唯一标识文档的命名约定,例如ContainerName + Unique Key
of record (customer001)。请注意putCommand
的文档位置后面的“f”标志,它告诉 DB 我们正在添加一个 f= 文件(如果省略,您将收到一个异常)。同样,Customers.xml 文件应位于您的根目录 C:\BDBXML\Customers.xml。键入命令后,您应该看到以下内容 - 我们添加了第一条记录!!让我们看看唯一约束是如何生效的。我将尝试再次添加该文档,这次我将
customer002
指定为文件标识符,但我不会更改 Customers.xml 文件中的CustomerId
。 - BDB XML 阻止我们输入两个具有相同
CustomerId
的客户。我们现在将更改客户信息并添加一些新客户,我刚刚打开了 Customers.xml 文件并更改了数据,然后保存它,最后发出了putDocument
命令。请参见下文 - 请注意,我必须为每个文档提供一个新的 ID
customer002
、customer003
、customer004
。如果我不这样做,我将收到一个错误,说明我违反了唯一约束。 - 现在让我们查询我们的条目。查询 BDB XML 中数据的方法之一是使用 XPath 表达式。我在文章末尾包含了一个资源链接,以便您可以熟悉 XPath(如果您还没有的话)。我们想查看我们添加的所有客户。为此,我们发出以下命令“query”并使用单引号括起来的 XPath 表达式
(query 'collection("Customers.dbxml")/Customers/*')
。请注意容器名称周围的双引号和查询表达式周围的单引号。您应该看到以下内容 - "
collection(db 容器名称)
" 指定我们可能返回多个记录。您会注意到返回了 4 个对象,要查看对象的数据,请发出(print)
命令。请参见下文。 - 现在我们可以看到我们添加的文档的内容了。现在让我们修改一些数据。我们将更新
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 表达式完全相同。请参见下文 - 我们已经更新了
CustomerId=1
的Customer
,并将CustomerFName
更改为 Eric。 - 现在我们将删除一个
Customer
。删除操作与更新操作略有不同;我们实际上是删除与客户关联的文档,为了做到这一点,我们必须调用removeDocument
命令,因为我们实际上是在移除与我们的客户关联的文档。此命令需要文档名称作为参数。这就是为什么将文档命名为易于回忆的格式(例如(container name + key) customer001
)是明智的。您始终可以通过发出查询 XPath 表达式然后发出printNames
命令来检索文档,该命令将列出查询返回结果的文档名称。要删除CUstomerId=2
的客户,我们执行以下操作。我们的第一个命令是(query 'collection("Customers.dbxml")/Customers/Customer[/Customers/Customer/CustomerId=2]')
,然后我们发出(printNames)
,这会返回文档名称"customer002"
。然后我们发出命令(removeDocument customer002)
。请参见下文
让我们查询所有客户以查看修改结果。我们将发出命令(query 'collection("Customers.dbxml")/*')
来检索所有节点。您会注意到只返回了 3 个对象而不是 4 个,因为我们删除了客户 2。然后我们发出(print)
命令来显示结果。如果我们查看文档,会发现我们已将CustomerId=1
的客户更新为名字 Eric,并且我们还删除了我们的第一个客户,因此结果不显示该客户。请参见下文 - 这标志着我们对 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,您将需要查阅这些链接。
- Oracle BDB XML Windows 安装程序
- Oracle BDB XML 文档
http://www.oracle.com/technology/documentation/berkeley-db/xml/index.html
注意:Introducing Berkeley DB 是一个不错的起点,可以了解命令行语法以及有关索引和容器的基本信息。
C++ 和 Java 文档很容易理解,即使您不熟悉这些语言。通过这些文档,您可以更深入地了解 BDB XML。
- W3C XML Schema 教程
- W3C XPath 教程:从这里开始您的 XPath 探索。
- W3C XQuery 教程:这真正增强了您的 BDB XML 功能
- FLOWR 概述