xml|数据|数据库
(Xindice当前的版本是1.1b4,已经做了较大改动,本文是1.0版的说明文档译文,仅供参考。部分改动在文中略做说明。
————译者:ksu99)
什么是Xindice
Xindice核心服务器完全是一个设计来存储XML数据的数据库服务器。用术语来说,Xindice服务器正是所谓的Native XML Database(NXD)。也可以说成是无缝XML数据库,这样的描述可能会容易理解一些。
这意味着使用这个服务器,你可以最大可能的使用XML工具和技术。进出服务器的所有数据都是XML。使用的查询语言是XPath,编程API支持DOM和SAX。所有这些对于一个曾经在他们的应用中使用过XML的开发者来说,应该非常熟悉。当与XML数据和Xindice打交道时,没有不同数据模式之间的映射。你只需要简单的以XML设计数据,以XML存储。
所有赋予你的可以总结为一个词:灵活性。XML提供一种极端的灵活机制,来对应用数据建模,并在很多情况下允许你建造那些在多数传统系统中难以建造甚至不可能建造的模型构造。这就是半结构化模型,在某些应用程序中是基本构件。通过使用一个像Xindice这样的本源XML数据库(NXD)存储半结构化数据,你可以专注于构建应用而不需要担心复杂的XML结构如何映射到底层数据存储,或者试图用一套严格的模式强制约束灵活的数据模型。
终究,Xindice是一个工具。它对某些工作来说,是合适的而对其它的就完全错误。它最擅长的只是存储XML数据。实际上,这就是全部。如果你有大量的XML数据,那么Xindice也许刚好是你需要的工具。然而,如果你的数据不是XML或者你需要精确控制数据的结构,那你最好还是去使用其他的数据库解决方案。
(译者注:1.1版中,服务器端的安装现在是在Java servlet引擎(Tomcat)内部署一个WAR档案。而数据库部署在一个servlet引擎内,并允许网络访问。这和1.0版不同,因为1.0版有自己的服务器框架。这样做是因为原来的服务器框架重复了servlet引擎的很多功能,而分开后使部署选项更加灵活。)
当前状态
Native XML数据库技术是一个非常新的领域,而Xindice更多的是一个仍在开发中的项目。服务器当前支持对格式良好的(well formed)XML文档的存储。这意味着对可以放进文档集合的文档没有任何模式来约束。这使Xindice成为一个半结构化数据库,并在如何存储数据方面提供极大的灵活性,但是也意味着放弃一些通用数据库功能,比如数据类型。[1] 在当前状态下,Xindice已经是一个管理XML数据的强大工具。但是需要做的还很多。
本文试图描述这些当前起作用并可以被使用的特性。请检查README文档,它包含许多关于工程当前状态的信息。
注意:Xindice服务器和这个文档都在改进中。欢迎和鼓励任何意见。
特性摘要
文档集合(Document Collections):文档被存储在可以被作为整体来查询的集合中。你可以创建只包含相同类型文档的集合,也可以创建一个集合来存储所有的文档。数据库不介意。
XPath查询引擎:要查询文档集合,你可以使用W3C定义的XPath。这提供了相当的灵活性机制,通过定位和限制返回结果树来查询文档。
XML索引:为了提高大量文档上查询的性能,可以定义关于元素和属性值的索引。这可以极大的加速查询响应时间。
XML:DB XUpdate实现:当存储XML到数据库时,或许需要能够在不检索整个文档的情况下改变数据。XUpdate是当你需要做服务器端的数据更新时使用的机制。这是一种基于XML的语言,确定XML修改并允许这些修改像应用到单个文档一样应用于整个文档集合。
Java XML:DB API实现:对于Java程序员Xindice提供了一个XML:DB API实现。这个API将给XML数据库应用带来可移植性,就像JDBC相对于关系数据库一样。大部分为Xindice开发的应用将使用XML:DB API。(译者注:在1.1版中,有一个嵌入式版本的XML:DB API,可以在不使用网络的情况下访问数据库构件Xindice应用程序。这个与启用网络的XML:DB API实现完全兼容。)
XMLObjects:XMLObject提供一个服务器扩展机制,来为服务器增加额外的功能。它们可以用来在数据库引擎内执行复杂的操作,以减少网络带宽,或者增加当前服务器上没有的功能。(译者注:1.1版中XMLObjects已经被删除。)
命令行管理工具:为了帮助系统管理员,Xindice提供了一全套命令行驱动的管理工具。所有可以通过XML:DB API做的事情,也可以从命令行搞定。(译者注:xindiceadmin工具已经被删除。以前只可以通过xindiceadmin访问的命令现在都通过xindice命令完成。这使服务器操作更简单一些。命令行工具加入一个选项,允许XPath查询使用命名空间(namespaces)规范。)
CORBA Network API:对于那些乐于使用Java语言的开发者,Xindice提供了一个CORBA API,可以用来构建应用程序。所有通过XML:DB API可用的功能,都可以通过CORBA API实现。事实上,XML:DB API是建造在CORBA API之上的。尽管多数Java开发者将永远不需要知道CORBA API的存在。(译者注:1.1版中,网络访问API是基于XML-RPC而不是CORBA。所有与CORBA相关的代码已经从系统中删除。系统现在完全支持UTF-8编码。)
模块体系结构:Xindice服务器以非常模块化的方式构成。这使其易于增减构件以裁剪服务器,使其成为一个特殊工作平台,或者将它嵌入到另一个应用程序中去。
数据库结构
Xindice服务器是设计来存储XML文档集合的。集合可以按照层次结构来安排,与典型的UNIX或Windows文件系统相似。
在Xindice中,数据存储基于一个亦可当文档集合使用的数据库实例。此数据库实例可以包含任意数目的子集合。在Xindice的缺省安装情况下,此数据库实例称为“db”,而所有的集合路径以 /db 开始。如果想要重命名这个数据库实例也是可以的,虽然没有必要这样做。
引用集合(Collections)的方式与层次式文件系统的引用相同。
1.1. 集合路径实例
如果你在“db”下创建了一个名为my-collection的集合,其下还有一个名为my-child-collection的集合,则访问my-child-collection集合的路径将会是:
/db/my-collection/my-child-collection
在集合之内可以存储若干类型的对象。你可以存储XML文档、XMLObject和其他集合。这些对象也分别可以通过路径引用。
1.2. 集合路径指定一个文档
扩展前面的例子,在my-child-collection中增加一个名为my-document的文档,这个文档可以通过下面路径引用:
/db/my-collection/my-child-collection/my-document
然而这个路径只可以得到一个。因为你有可能在一个集合中有多于一个的同名对象[2] ,当计算一个路径时就有个优先级次序问题。优先性依次是集合、XMLObject、文档。这就是说,如果有一个文档和一个集合同名,你将没法检索到文档。[3]
你还可以通过指定主机和服务器端口号,来在远程计算机上访问集合。
1.3. 集合路径指定一个远程文档
如果前面的例子在一个远程计算机上,则路径会是这样子:
myhost.domain.com:4080/db/my-collection/my-child-collection/my-document
这也可以用以下的Xindice URI形式:
xindice://myhost.domain.com:4080/db/my-collection/my-child-collection/my-document
[1] XML模式支持将在Xindice稍后的版本中加入。模式总是可选的,但是它可以用来强制一个集合存储特定的文档类型,并允许数据类型支持
[2] 举例来说,一个子集合和一个文档
[3] 这个约束将在Xindice后面的版本得到调整