文件数据组织

数据库的基本概念(二)
曾士熊
原文:http://www.ascc.sinica.edu.tw/nl/83/1009/section3_3.html
刘建文整理(http://blog.csdn.net/keminlau)

本文接第10个卷08期68页

二,文件简介

(一)文件结构

常见的电脑文件包括:可执行程序文件,批处理文件,文本文件和数据库文件等。可执行程序文件主要是由一连串的机器码指令所组成的,这些指令构成可处理特定工作或解决特定问题的程序。批处理文件(batch file)的内容包括命令(command)和可执行程序文件的主文件名,通常用来设定电脑系统的使用者环境或简化执行程序的程序。文本文件(text file)主要包括:文书文件和原始程序文件,其内容完全由字符(character)所构成。数据文件(data file)则是用来存放程序执行时的输入,输出数据。电脑系统常利用扩展文件名来区别不同性质的文件,例如:可执行程序文件为.exe 或.com,批处理文件为.bat,程序源代码文件通常以所用程序语言的名称为副文件名。文本文件和数据库文件的副文件名,除少数特例外,可由使用者依规定自选。

数据文件的文件结构:数据文件通常是由一组格式相同但内容有异的记录(record)所组成的,而且任何数据库文件所包含的记录数量不固定。详言之,同一文件里每一条记录都是由相同的列(field)所构成的,这些列的数据类型可以是整数,实数或字串,有时候部份列还会再分成更小的次列。

仔细比对表格数据类型和数据文件的文件结构,可发现两者的区别只是专有名词不同而已。换言之,若是把表格内容储存到电脑系统里,必然形成具有特定记录格式的数据文件。图七所示为一些专有名词在三个领域里的说法,图中任何同列的三个不同用语其实说的是相同事物。请注意:图七中最右边直栏的“关系式(relational)” 为关系(relation)的形容词。关系为代数学的专有名词:指的是由一组定义域所形成的笛卡尔乘积(Cartesian product)的子集合,其定义极为严谨,但却是经常有人误以为指的是表格间的关系(正确说法是关联) 。 1970年年6月,Codd 博士在学术期刊《Communication of ACM》上,发表他那篇有名的论文``A Relational Model of Data for Large Shared Data Banks''倡议以代数学的关系来描述表格,从此开启了学术界研究关系式数据模式和软体业者研发关系式数据库的热潮。多年之后,关系式数据库击败了原先颇为风行的网状式和层次式数据库,成为表格式数据库领域里独领风骚的唯一要角。

由于在数据文件里的各个记录(或表格里的行),其格式相同而数量不定,因此定义数据文件(或表格)时,只需宣告表格名称及其记录(或行)格式即可,例如:图八所示为参考的dBASE规则所编写的薪资单记录格式。在图八里,由左而右各个直栏分别是:列序号(Num)  ,列名称(Field Name) ,数据类型(Field Type) ,宽度(Width) ,小数位数(Dec)和索引(Index) 。在数据类型列里, “字符”代表该列的内容为字符或字串, “数字”表示该列内容为可用以计算的数字。宽度列记录各列的长度(字节数),原则为:每个英文字母或阿拉伯数字占1字节,每个中文字占2字节。在索引栏中, “Y ”表示需针对该列另建索引文件, "N"则表示不必。建索引的目的在于:当使用者需透过该列,从数据库文件(或表格)查找所要的记录(或行)时,借索引之助,可大幅提高数据检索的速度。不过建索引有利亦有弊:增加维护数据库系统时的工作负担。

(二)文件组织

建立数据库文件的目的非常明确:储存和维护数据,以备使用者能随时取用。很显然的,如何从文件里读出数据,必定会受到事前的数据存放方式所约制。因此如何安排记录的存取方式,便成为建立数据库文件时的重要课题。所谓文件组织,指的就是如何去安排记录在文件里的储存方式,以方便应用程序检索(retrieve)数据的一些技术。主要的文件组织有四种,包括:顺序存取(sequential access),直接存取(direct access) ,索引顺序存取(indexed sequential access)和多键检索(multi-key retrieval) 。

顺序存取组织 :这是构造最简单但检索速度最慢的一种文件组织,其作法只是把记录依照先来后到的顺序一条接一条的存放在文件里,不加以任何特别处理,如图九所示。在顺序存取式文件组织里,由于前后记录之间只有先来后到的差别,而无任何关联性,因此要从这种文件中读取任何一条记录,都必须从头开始,逐一读取并且比对每一条记录的指定列,直到找出所要的记录,或是读完整个文件为止(即查找失败)。这种作法称为线性查找(linear search) 。假设文件的记录总数为ñ且每一条记录被查找的机会均等,则利用线性查找法找出个别记录所需的平均比对次数为ñ / 2 。

排序式顺序存取组织 :由于上述简单型顺序存取文件的检索效能太差,通常程序设计人员会把数据文件里的记录,指定列由小而大的加以排序,用以排序的列称为键(key)。排序式顺序存取可用二分查找(binary search)法来检索数据(但是只对键列有效) 。同样具有ñ条记录的文件,使用二分查找法只需要大约(log N)的次的比对就能找到或确定找不到目标记录。请注意,这里的日志是以2为底而非以十为底。就具有1000条记录的文件而言,采用线性查找法所需的平均比对次数为500 ,而采用二分查找法所需的比对次数至多10个次。就记录的数量较大的数据库文件而言,二分查找法的数据检索速度要比线性查找法快上许多,但必须付出事前将数据文件加以排序的代价。排序式顺序存取文件的另一项优点是:排序时所用的键,往往也就是用以分类数据的关键列,因而有利于需要对数据顺序处理的作业,例如:文件批处理维护,制作统计报表等。

直接存取组织 :这种文件组织的特点是只要给予目标记录的键值,即可透过预定程序,转换成目标记录的地址(address) ,然后依此地址直接读出所要的记录。换言之,直接存取式组织可用以从数据库文件里迅速的检索出个别的记录。直接存取式文件组织的主要技术有二:

  • 目录查找法 (directory lookup):事先就数据主文件建立附加的目录文件,文件里每一条目录项的内容都是对应记录的键列内容和记录在数据主文件里的地址。作法是:从数据主文件里,逐条的读出各记录的键列并且计算该记录的地址,同时把这些目录项抄录到另外建立的目录文件。接着把目录文件依据键值排序,或是安排成树状组织(如图十所示)。检索数据时,先根据给定的键值从目录文件里找出符合条件的目录项,读出地址,接着再依此地址从数据主文件里读出目标记录。其优点是检索速度快,但所付出代价的是目录文件需占用额外的记忆空间,而且在维护数据主文件时,必须伴随着更新目录文件。
  • 哈希法 (hashing,也译做赫序法):预先备妥足够的数据库文件空间,每条记录存入文件时,必须先用预设规则(习惯上称做哈希函数)将键换算成地址,例如:把键值除以预设常数H,取余数为地址。检索数据时,也用相同的哈希函数把目标键值换算出原先的地址,因此可以快速检索出个别的记录。问题是计算地址时难免会发生碰撞,亦即不同的键值换算出相同的地址。发生碰撞时,须另外设法再找可用的新地址。依据前人经验,当数据库文件所载入的数据量超过其最大容量的80 %时,碰撞率会因空间拥挤而急遽升高。哈希法的成败关键,就在于寻找好的哈希函数以降低碰撞率,以及发生碰撞之后的妥善处理。哈希法由于无法维持记录间的排序性,因而不利于顺序处理作业。

索引顺序存取组织 :顾名思义,就是把排序过的数据主文件附加上索引文件所构成的文件组织。简要的说,索引顺序存取组织类似于把图十里的数据主文件加以排序,而排序过的数据库文件就形同排序式顺序存取文件。因此这种文件组织的第一个特点是:兼具排序式顺序存取组织有利于顺序处理作业,以及直接存取组织便于检索个别记录的优点。索引顺序存取组织的第二个特点是:新增或删除任何记录时,数据主文件和索引文件不仅可及时更新,而且数据主文件仍保持排序状态。为了能做到这一点,索引顺序存取文件的组织要比前面所说的复杂许多。常见的作法是:把数据主文件安排成串接的区块(block),并且把索引文件安排成B树或B*树结构,如图十一所示。详情请参考 Mary ES Loomis 所著《Data Management and File Processing》 一书的第十二及第二十章。

多键检索组织:前述的排序式顺序存取,直接存取文件和索引顺序存取等三种文件组织,都只能针对单一的非重复键(即不同记录的键值亦不相同)做建立文件组织的工作,依惯例都会选择数据库文件的主键(primary key)。若遇有除了主键以外,还需要另以其他列(习惯上称为副键,secondary key)检索记录的场合,就得另外建立多键检索组织,较常见的作法是建反列(inversion)文件。就以图十二的客户帐号数据表为例,假设要以列`` GROUP-CODE/BRANCH-TYPE为''副键,建立反列文件:首先就数据主文件的每一条记录,将预备当做副键的列和主键(列 ID)一并摘录出来; 然后仿照目录查表式直接存取组织的作法,另外建立原副键对原主键的反列文件,如图十三所示。 (待续)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值