关于SQL、XML与NoSQL数据库

时间:2021-06-04 08:57:23

说到数据库,还得从文件的记录说起。谭浩强在他的畅销书《BASIC语言》中就描述过从顺序文件或随机文件读取等长的(固定格式的)记录。实际上,文件的记录不必等长,即包含的字段可以不同,并且即使记录不等长的文件也能支持非顺序查找,如二分查找、或改进的按照平均记录长度估计记录位置的查找算法。下面的交易文件就是带不等长记录的文件的示例。

INVOICES 2001-7-15 20:00
Total 643 $15870.25
Hash 10983465087380918366508371136410
.
Invoice #1234500001 2001-07-15 9:20
Customer #X006-5432 Johnny Appleseed
PhoneX 123-456-7890 johnny@appleseed.com
Address Appleseed Inc., 109 Apple Ave., New York City, NY 10456
Items 2 $61.28
Item #CX015A(HP-Deskjet-1010) $36.30 discount=-$5(new-customer)
HP DeskJet 1010 Printer
Item #DF040Z(RCA-MP3-P3230) $19.98
RCA 4GB MP3 Player with Flipout USB and Display
Shipping $10.00 UPS-normal
.
Invoice #1234500002 2001-07-15 9:45
... ...
.
Invoice #1234500003 2001-07-15 9:53
... ...
.
... ...

这样的数据文件格式对于用户很有价值。

1. 它是自然的直观的交割用的记录,比从数据库中查出的结果更为实在。例如,营业员每天向店主送交一份上述格式的交易文件,同时在账簿上留下手写的核对过的总额与签名。
2. 文件包含店主最为关心的、与账目直接相关的记录,而忽略了其他数据库操作,如用户更改个人信息的操作等。
3. 文本格式的文件更适于长期保存(例如刻录在光盘上备查,注意光盘只读、体积小、且能增量刻录的特点)。数据库厂商的数据文件格式(如Microsoft的mdb文件)说不定过几年就因版本过时而无法用软件读取了。此外,标准的文本格式数据也不会受更换技术(如数据库或其他软件产品)的影响。
4. 灵活紧凑的文本格式更容易直接阅读。
5. 店主在使用交易数据作商业决策时,实际上不必关心当天的(尚未上报的)交易记录。因此,上述的报告文件格式已能满足店主本身的数据需求,即店主自己使用的数据库可以直接以上述报告文件为源数据。

应当说明,这样的记录文件也必须有严格的数据格式定义,就像XML的DTD或Schema定义一样,以确保有效性。(从标准XML文档产生上述格式的文本文件的XSLT转换可能可以用来定义schema。)同时也应看到,XML并不能满足所有自动验证的要求,如例中核对总数与总额。另外,用户也可以选择其他的记录文件格式,如XML或Excel。前者有成熟的schema工具,后者则强调灵活的文档布局与可读性。

前面已经提到,在记录文件中根据顺序编号快速检索出某一Invoice记录并不困难,但按照其他方式查询(如根据顾客姓名)就需要另建索引文件。实际上,不难想像将Unix的标准grep(在文件中搜寻)命令扩展,以支持格式化的查找。并且,该命令可以利用手动或自动建立的索引提高查询效率。下面的示例用到类似XPath的语法。

xgrep Invoice[Customer='Jonny Appleseed'] invoice.dat

实际上,XML的查询比SQL查询更有趣,这可以从HTML用到的CSS语法看出。当然,也不难想像用类似SQL的语法查询一个文件、甚至查询多个文件的JOIN。例如,从前面的Invoice文件可以(根据ItemId)建立将交易记录按产品类型归类的视图。数据库(数据分析)软件则可以建立在这些查询工具之上。XML数据库与NoSql数据库(如MongoDB)实现了类似的储存与查询功能,但它们大多强调独特的储存方式、查询语法及海量处理能力,而不是使用已有的用户数据文件。

另外,操作系统可以在以下几方面支持上述文件格式及查询。

1. 通过设置文件格式(类似DTD、XML Schema),操作系统可以支持在本地用二进制格式保存数据文件。这能压缩文件大小并且提高查询速度。仅当拷贝到其他目录下时,文件才被还原为文本格式。
2. 将结构化文档映射(mount)为目录结构。这方便为文件的子节点设置权限,例如禁止一个操作员查看某类产品的交易数据。另一方面,这也方便了在操作系统级别对文件节点的访问作记录(日志)。目录结构映射甚至可以用来支持查询本身。
3. 操作系统应支持统一处理动态生成的文件(视图),以便为它们也提供目录结构映射。(Unix中用cat(concatinate、“连接”)的命令名暗讽这一功能。)