欢迎您来到 数字平台。 您尚未登录。[登录] [注册新用户]
当前位置: 论坛首页 / 栏目 产品与服务 / 文章 403

点击:11339[回复顶层] [树状] [详细]
[回复留言] [回复(需要先登录)] [引用(需要先登录)]普通文章第 1 楼
文章id: 403
关于书目数据结构

作者: Harry


谢老师、江老师:

关于书目的数据结构我有些疑惑、想请教二位老师。

书目应该是非结构化的数据,dp2用SQL Server做数据库,SQL Server是结构化的数据库,书目中字段可重复、子字段也可重复、那不是要设计好多表、想来Marc定义的所有单位都要配一张表,sp2的书目数据库是这样复杂吗?

XML可以表述非结构化的数据,但我一直认为XML用于数据传输而非数据存储,如果用XML存储大量书目数据,那么对其检索、操作效率会不会很低?

DT1000/1500用的数据库是自己开发的,据说是非结构化数据库,最新版的Oracle才有部分非结构化数据处理功能,如此说来二位老师10多年前的工作岂不是很厉害,DT1500我用过,觉得效率挺高的。用dp2导入2000条书目数据大约要半个小时(无法忍受),而DT1500却只用几分钟(甚至更少),如果老数据库效率真的优于SQL Server,那为什么放弃了之前那么好的技术。

可能我的疑惑是源于我的无知,但还是希望二位老师不吝赐教。

 



发表时间: 2009-02-21 17:45:48
最后修改时间: 2009-02-21 17:53:35
[回复留言] [回复(需要先登录)] [引用(需要先登录)]普通文章第 2 楼
文章id: 404
回复: 关于书目数据结构

作者: xietao


以下是引用 Harry 于 2009-2-21 17:45:48 发表的文字:

谢老师、江老师:

关于书目的数据结构我有些疑惑、想请教二位老师。

书目应该是非结构化的数据,dp2用SQL Server做数据库,SQL Server是结构化的数据库,书目中字段可重复、子字段也可重复、那不是要设计好多表、想来Marc定义的所有单位都要配一张表,sp2的书目数据库是这样复杂吗?

XML可以表述非结构化的数据,但我一直认为XML用于数据传输而非数据存储,如果用XML存储大量书目数据,那么对其检索、操作效率会不会很低?

DT1000/1500用的数据库是自己开发的,据说是非结构化数据库,最新版的Oracle才有部分非结构化数据处理功能,如此说来二位老师10多年前的工作岂不是很厉害,DT1500我用过,觉得效率挺高的。用dp2导入2000条书目数据大约要半个小时(无法忍受),而DT1500却只用几分钟(甚至更少),如果老数据库效率真的优于SQL Server,那为什么放弃了之前那么好的技术。

可能我的疑惑是源于我的无知,但还是希望二位老师不吝赐教。

 

 
这个话题很有意思,它是多年来的一个核心话题,不过,大约我刚出道的时候,也就十多年前,已经就搞清楚了。而最近的这些年,只是在不断实践、优化,理论上没有任何新的突破。
 
首先关系数据库不是不能描述和存储可以重复的字段。例如你说的用很多的表来描述软件所需的数据,这就是非常非常正规的关系数据库的生存模式。但是,问题长期以来被一些人偷换了:如何仅仅用一张表来描述类似MARC的数据结构?这些人很蠢。就好像我问你:人如何一年之内仅仅吃一顿饭而存活?你肯定会回答说:不对呀,我们平常每天都要吃三顿饭,一年吃1000顿饭呢。
 
我刚开始编程试图实现图书馆软件的时候,那时候的商用数据库软件还不发达,正好我在大学时候关注过一般数据库的设施例如B+树构造的索引这样的有意思的技术,所以我们那时候就开始自己设计实现数据库。当时dbase已经出现了,也不是完全没有参考的例子。
 
不管是我们当初自己的数据库,还是现在用商用数据库,数据结构都很直接和简单:用一个表存放MARC数据,当然,MARC数据是不透明的,就像存储图像数据一样。这构成了MARC记录ID和记录体之间的一个二维的简单对照表,这叫做MARC表。然后,建立另外的一些表,把书名、作者等等和刚才这个ID对照起来,形成若干的二维对照表。后面这些叫做KEYS表。KEYS表为了检索的效率,一般需要配备多个,每种独立的检索途径配备一个。
 
这是正统的关系数据库设计了,教科书里面就是这么举例的,一点都不稀奇。有些人提出一个问题:如何让关系数据库系统自动维护这些表和表之间的关系(比方说,我保存一条MARC数据,关系数据库系统给我自动分拆数据并建立到这些表之中)?这个问题的答案是,不能。必须要开发程序去细心维护,而没有那个商用的关系数据库系统去替你维护。这好比有人去了饭馆,点了菜,问:谁来负责喂我饭?没有人喂你饭,你手脚都不残废,你可以自己吃。
 
所谓图书馆系统的应用服务器,或者数据库内核,一个重要作用,就是去维护这些表之间的关系。数据库内核概念有了后,就由数据库内核去负责了。刚才说的那些人,可以买我们的产品,那样就不用自己去维护表之间的关系了。不过,至少是要花钱的。
 
曾经有一个人和我争论,说他纯粹用商用数据库,所以不会出现我们自己开发数据库可能要犯的错误。这个人忘记了,在若干表的设施上面,他还是要不得不开发一些至关重要的数据逻辑处理模块,要加锁,要控制并发,这些事情难度一点也不低,就我开发过数据库的经验来说,和直接开发数据库底层所需要的细心、耐心、控制力是一样的,要求并不减低多少。这个人的逻辑是,作的事情少,犯错误的机会就少。但是他的说法不成立:因为一些容易犯错的事情他丢不掉,必须要做。他不但做了,而且是不情愿地做,犯错误的机率会大增。而且,他在说到软件价格的时候,并没有谦虚地(因为声称自己少作了事情而)降价,而要了高价 -- 比包含自己数据库的产品的价格还要高。
 
在上面所说的MARC表里面用MARC格式还是XML格式,这个问题不关键。只要能建立MARC数据或者XML数据和KEYS标的关系,也就是说能自如地操纵数据内部结构,能够进行拆分和组装,就可以了。是的,正如你说,它们都是传输格式 -- MARC也是,ISO2709么。但是,没有必要另开发一套专用的存储格式。传输格式完全可以做存储格式。说开一点去,类似UTF-8这样的Unicode传输格式,也被Oracle这样的数据库系统拿来做系统内部存储格式。而MS SQL Server则用UTF-16,更内核一些。
 
dt1000的数据库和Oracle不能比。dt1000好比一辆汽车,而Oracle好比一台发动机。dt1000自然是包含了自己的发动机,但是在发动机外面附加了另外的庞大逻辑,比如说上面介绍的多表关系。因此直接比较是不公平的。
 
10多年来,从纯技术的角度,很多环节我们都在下降而不是上升。这和能举的哑铃的重量是一致的。我很希望,如果运气好,市场足够大,我还能操刀作很多很厉害的东西,超过10多年前的水平。
 
关于速度问题,确实商用数据库并不是最适合某些特定应用的。不过对这一点,我抱淡然的态度,毕竟现在机器硬件在发展,速度问题不是太大。我见过很多人无限崇拜地谈论某些“大”数据库,而对其它事物视而不见,我已经习惯了。大就是慢,就是臃肿,然后就能获得崇拜,这并不是太奇怪的逻辑。
 
以前的技术并不是完全放弃了。许多事情要看机会。
 
感谢你的拐着弯的鼓励和夸奖,还有你的独特的眼光和深度。希望以后有机会多多交流。


发表时间: 2009-02-22 21:19:53
最后修改时间: 2009-02-22 21:29:35



页 1 / 1
 

在线用户
访客访客   访客访客   访客访客 (我自己)   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客
当前栏目在线用户数 25, 总在线用户数 26