目录:
一:什么是文件?
1.表
集合为表,文件在外存集合为表
2.文件
称存储在二级存储器(外存储器)中的记录集合为文件
二:文件及类别
1.操作系统的文件&数据库文件【记录的类型不同】
(1)操作系统的文件
操作系统中的文件仅是一维的连续的字符序列,无结构、无解释
它也是记录的集合,这个记录仅是一个字符组
用户为了存取、加工方便,把文件中的信息划分成若干组
每一组信息称为一个逻辑记录,且可按顺序编号
(2)数据库文件
数据库中的文件是带有结构的记录的集合
这类记录是由一个或多个数据项组成的集合,它也是文件中可存取的数据的基本单位
数据项是最基本的不可分的数据单位,也是文件中可使用的数据的最小单位
例如,图12. 1所示为一一个数据库文件,每个学生的情况是一一个记录,它由10个数据项组成。
2.定长记录文件&不定长记录文件【含有信息长度】
(1)定长记录文件
若文件中每个记录含有的信息长度相同,则称这类记录为定长记录,由这类记录组成的文件称做定长记录
(2)不定长记录文件
若文件中含有信息长度不等的不定长记录,则称不定长记录文件
3.单关键字文件&多关键字文件【记录中关键字的多少】
(1)单关键字文件
若文件中的记录只有一个惟一标识记录的主关键字,则称单关键字文件
(2)多关键字文件
若文件中的记录除了含有一个主关键字外,还含有若干个次关键字,则称为多关键字文件
记录中所有非关键字的数据项称为记录的属性
三:逻辑结构&物理结构
1.逻辑结构
记录的逻辑结构是指记录在用户或应用程序员面前呈现的方式
是用户对数据的表示和存取方式
通常,记录的逻辑结构着眼在用户使用方便
2.物理结构
记录的物理结构是数据在物理存储器上存储的方式
是数据的物理表示和组织
而记录的物理结构则应考虑提高存储空间的利用率和减少存取记录的时间
它根据不同的需要及设备本身的特性可以有多种方式
从11.1节的讨论中已得知:
一个物理记录指的是计算机用一条I/O命令进行读写的基本数据单位
对于固定的设备和操作系统,它的大小基本上是固定不变的
而逻辑记录的大小是由使用要求定的
3.文件的组织方式
文件在存储介质(磁盘或磁带)上的组织方式称为文件的物理结构
文件可以有各种各样的组织方式,其基本方式有3种:
顺序组织、随机组织和链组织
一个特定的文件应采用何种物理结构应综合考虑各种因素
如:存储介质的类型、记录的类型、大小和关键字的数目以及对文件作何种操作等
4.物理记录&逻辑记录之间的3种关系:
(1) 一个物理记录存放一个逻辑记录
(2)一个物理记录包含多个逻辑记录
(3)多个物理记录表示一个逻辑记录
用户读/写一个记录是指逻辑记录
查找对应的物理记录则是操作系统的职责
图12.2简单表示了这种关系
图中的逻辑记录和物理记录满足上述第- -种关系,物理记录之间用指针相链接
四:文件的操作【运算】
文件的操作有两类:检索和修改
1.文件的检索
文件的检索有下列3种方式:
(1)顺序存取
存取下一个逻辑记录
(2)直接存取
存取第i个逻辑记录
以上两种存取方式都是根据记录序号(即记录存人文件时的顺序编号)或记录的相对位置进行存取的
(3)按关键字存取
给定一个值,查询一个或-批关键字与给定值相关的记录
对数据库文件可以有如下4种查询方式:
①简单询问:
查询关键字等于给定值的记录
例如,在图12.1的文件中,给定--个准考证号码或学生姓名,查询相关记录
②区域询问:
查询关键字属某个区域内的记录
例如,在图12.1的文件中查询某某中学的学生成绩,则给定准考证号的某个数值范围。
③函数询问:
给定关键字的某个函数
例如查询总分在全体学生的平均分以上的记录或处于中值的记录。.
④布尔询问:
以上3种询问用布尔运算组合起来的询问
例如,查询总分在600分以上且数学在100分以上,或者总分在平均分以下的外语在98分以,上的全部记录。
2.文件的修改
文件的修改包括插入一个记录、删除-一个记录和更新-个记录 3种操作
文件的操作可以有实时和批量两种不同方式
通常实时处理对应答时间要求严格,应在接收询问之后几秒钟内完成检索和修改,而批量处理则不然
不同的文件系统其使用有不同的要求
例如,一个民航自动服务系统,其检索和修改都应实时处理;而银行的用有不同的要求
例如,一个民航自动服务系统,其检索和修改都应实时处理;而银行的件上,在一天的营业之后再进行批量处理
五:顺序文件
1.定义
顺序文件(SequentialFile)是记录按其在文件中的逻辑顺序依次进入存储介质而建立的
即顺序文件中物理记录的顺序和逻辑记录的顺序是一致的
2.连续文件&串联文件
若次序相继的两个物理记录在存储介质上的存储位置是相邻的,则又称连续文件
若物理记录之间的次序由指针相链表示,则称串联文件
3.特点
顺序文件是根据记录的序号或记录的相对位置来进行存取的文件组织方式
它的特点是:
(1)存取第i个记录,必须先搜索在它之前的i-1个记录
(2)插人新的记录时只能加在文件的末尾
(3)若要更新文件中的某个记录,则必须将整个文件进行复制
由于顺序文件的优点是连续存取的速度快
因此主要用于只进行顺序存取、批量修改的情况
若对应答时间要求不严时亦可进行直接存取
4.举例
磁带是一种典型的顺序存取设备
因此存储在磁带上的文件只能是顺序文件
磁带文件适合于文件的数据量甚大、平时记录变化少、只作批量修改的情况
在对磁带文件作修改时,--般需用另一条复制带将原带上不变的记录复制-遍
同时在复制的过程中插人新的记录和用更改后的新记录代替原记录写人
为了修改方便起见,要求待复制的顺序文件按关键字有序(若非数据库文件,则可将逻辑记录号作为关键字)
磁带文件的批处理过程可如下进行:
待修改的原始文件称做主文件存放在一条磁带上
所有的修改请求集中构成一个文件,称做事务文件,存放在另一台磁带上
尚需第三台磁带作为新的主文件的存储介质
=====================================================================================
主文件按关键字自小至大(或自大至小)顺序有序
事务文件必须和主文件有相同的有序关系
因此,首先对事务文件进行排序,然后将主文件和事务文件归并成-一个新的主文件
图12.3为这个过程的示意图
在归并的过程中,顺序读出主文件与事务文件中的记录比较它们的关键字并分别进行处理
对于关键字不匹配的主文件中的记录,则直接将其写人新主文件中
“更改”和“删去”记录时,要求其关键字相匹配
“删去”不用写人
而“更改”则要将更改后的新记录写入新主文件
“插人”时不要求关键字相匹配,可直接将事务文件.上要插入的记录写到新主文件的适当位置
=====================================================================================
例如有一个银行的账目文件:
其主文件保存着各储户的存款余额;
每个储户作为一个记录,储户账号为关键字;记录按关键字从小到大顺序排列
一天的存人和支出集中在一个事务文件中,事务文件也按账号排序
成批地更改主文件并得到一个新的主文件
其过程如图12.4所示
六:索引文件
1.定义
除了文件本身(称做数据区)之外
另建立--张指示逻辑记录和物理记录之间一一对应关系的表一索引表
这类包括文件数据区和索引表两大部分的文件称做索引文件
2.图解
图12. 5所示为两个索引表的例子
索引表中的每一项称做索引项
论主文件是否按关键字有序,索引表中的索引项总是按关键字(或逻辑记录号)顺序排列
3.索引顺序文件&索引非顺序文件
若数据区中的记录也按关键字顺序排列,则称索引顺序文件
反之,若数据区中记录不按关键字顺序排列,则称索引非顺序文件
4.特点
索引表是由系统程序自动生成的
在记录输人建立数据区的同时建立一个索引表
表中的索引项按记录输人的先后次序排列
待全部记录输入完毕后再对索引表进行排序
例如,对应于图12.6(a)的数据文件
其索引表如图12.6(b)所示
而图12.6(c)为文件记录输人过程中建立的索引表
5.检索
(1)检索方式
索引文件的检索方式为直接存取或按关键字(进行简单询问)存取
检索过程和第9章讨论的分块查找相类似
应分两步进行:
首先,查找索引表,若索引表上存在该记录,则根据索引项的指示读取外存上该记录
否则说明外存上不存在该记录,也就不需要访问外存
由于索引项的长度比记录小得多,则通常可将索引表-次读入 内存
由此在索引文件中进行检索只访问外存两次
即一次读索引,一-次读记录
并且由于索引表是有序的;则查找索引表时可用折半查找法
(2)索引文件的修改更新
索引文件的修改也容易进行
删除-个记录时,仅需删去相应的索引项
插人-一个记录时,应将记录置于数据区的末尾
同时在索引表中插人索引项
更新记录时,应将更新后的记录置于数据区的末尾,同时修改索引表中相应的索引项
当记录数目很大时,索引表也很大,以致-一个物理块容纳不下
在这种情况下查阅索索引表需占用3个物理块的外存,每一个物理块容纳3个索引
则建立的查找表如图12.7所索引表需占用3个物理块的外存
检索记录时,先查找查找表,再查索引表,然后读取记录
3次访向外存即可。若查找表中项目还多,则可建立更高一级的索引
通常最高可有四级索引:数据文件→索引表→查找表- +第二查找表- +第三查找表
而检索过程从最高一级索引即第三查找表开始,需要5次访问
上述的多级索引是一种静态索引,各级索引均为顺序表结构
其结构简单,但修改很不方便,每次修改都要重组索引。因此,当数据文件在使用过程中记录变动较多时,应采用动态索引
如二叉排序树(或二叉平衡树)、B树以及键树,这些都是树表结构,插人、删除都很方便
又由于它本身是层次结构,则无需建立多级索引,而且建立索引表的过程即二叉排序树(或平衡树)作索引,其查找性能已在第9章中进行了详细讨论
反之,当文件二叉排序树(或平衡树)作索引,其查找性能已在第9章中进行了详细讨论
反之,当文件很大时,索引表(树表)本身也在外存,则查找索引时尚需多次访问外存,并且,访问外存的次数恰为查找路径.上的结点数。显然,为减少访问外存的次数,就应尽量縮减索引表的深度
因此,此时宜采用m叉的B-树作索引表。m的选择取决于索引项的多少和缓冲区的大小。又,从“9. 2. 3/键树”的讨论可见,键树适用于作某些特殊类型的关键字的索引表
和上述对排序树的讨论类似,当索引表不大时,可采用双链表作存储结构(此时索引表在内存);反之,则采用Trie树。总之,由于访问外存的时间比内存查找的时间大得多,所以.对外存中索引表的查找效能主要取决于访问外存的次数,即索引表的深度
(3) 稠密索引&非稠密索引
显然,索引文件只能是磁盘文件
综上所述,由于数据文件中记录不按关键字顺序排列
则必须对每个记录建立一个索引项
如此建立的索引表称之为稠密索引,它的特点是可以在索引表中进行“预查找”,即从索引表便可确定待查记录是否存在或作某些逻辑运算
如果数据文件中的记录按关键字顺序有序,则可对一组记录建立-一个索引项,这种索引表称之为非稠密索引
它不能进行“预查找”,但索引表占用的存储空间少,管理要求低
七:ISAM文件和VSAM文件
1.ISAM文件
(1)定义
索引顺序存取方法ISAM为Indexed Sequential Access Methed的缩写,它是一种专为磁盘存取设计的文件组织方式
由于磁盘是以:盘组、柱面和磁道三级地址存取的设备
则可对磁盘上的数据文件建立盘组、柱面和磁道中三级索引
(2)文件结构示列
文件的记录在同一盘组上存放时,应先集中放在一个柱面上
然后再顺序存放在相邻的柱面上,对同一柱面,则应按盘面的次序顺序存放
shi
例如图12.8为存放在一个磁盘组上的ISAM文件
(3)磁道索引项结构
每个柱面建立一个磁道索引
每个磁道索引项由两部分组成:基本索引项和溢出索引项
如图12.9所示,每一部分都包括关键字和指针两项
前者表示该磁道中最末一个记录的关键字(在此为最大关键字)
后者指示该磁道中第-一个记录的位置
(4)柱面索引
柱面索引存放在某个柱面上,若柱面索引较大,占多个磁道,则可建立柱面索引的索引一主索引
在ISAM文件上检索记录时,先从主索引出发找到相应的柱面索引
再从柱面索引找到记录所在柱面的磁道索引
最后从磁道索引找到记录所在磁道的第-一个记录的位置
由此出发在该磁道上进行顺序查找直至找到为止
反之,若找遍该磁道而不存在此记录,则表明该文件中无此记录
例如,查找关键字为21的记录时的查找路径如图12. 8中的粗实线所示
从图12.8中读者可看到,每个柱面上还开辟有-个滥出区
并且,磁道索引项中有溢出索引项,这是为插人记录所设置的
由于ISAM文件中记录是按关键字顺序存放的,则在插人记录时需移动记录
并将同一磁道上最末一个记录移至溢出区,同时修改磁道索引项
(5)溢出区3种设置方法
通常溢出区可有3种设置方法:
(1)集中存放一整个文件 设-一个大的单- - 的溢出区;
(2)分散存放一每个柱 面设一个溢出区;
(3)集中与分散相结合一溢 出时记录先移至每个柱面各自的溢出区,待满之后再使用公共溢出区
图12.8是第二种设置法
(6)文件的插入和溢出处理
每个柱面的基本区是顺序存储结构
而溢出区是链表结构
同一磁道溢出的记录由指针相链
该磁道索引的溢出索引项中的关键字指示该磁道溢出的记录的最大关键字
而指针则指示在溢出区中的第一个记录
图12.10所示为插人记录和溢出处理的具体例子
其中(a)为插人前的某一柱面上的状态
(b)为插入R.s时,将第二道中关键字大于65的记录顺次后移,且使Roo溢出至溢出区的情况
(c)为插人Res之后的状态,此时2道的基本索引项的关键字改为80,且溢出索引项的关键字改为90
其指针指向第4道第一个记录即Rgo;
(d)是相继插人Ras和Ra后的状态,Ro。
s插人在第3道的第一个记录的位置而使Rrs溢出。
而由于80<83<90,则R被直接插人到溢出区,作为第2道在溢出区的第一个记录,
并将它的指针指向Reo的位置,同时修改第2道索引的溢出索引项的指针指向Res。
(7)柱面索的位置
通常,磁道索引放在每个柱面的第一道上,那么,柱面索引是否也放在文件的第一个柱面上呢?由于每一次检索都需先查找柱面索引,则磁头需在各柱面间来回移动,我们希望磁头移动距离的平均值最小。假设文件占有n个柱面,柱面索引在第x柱面上。则磁头移动距离的平均值为:
柱面索引应放在数据文件的中间位置的柱面上
2.VSAM文件
(1)定义
虚拟存储存取方法VSAM是Virtual Storage Access Method的缩写
这种存取方法利用了操作系统的虚拟存储器的功能,给用户提供方便
对用户来说,文件只有控制区间和控制区城等逻辑存储单位
与外存储器中柱面、磁道等具体存储单位没有必然的联系
用户在存取文件中的记录时,不需要考虑这个记录的当前位置是否在内存
也不需要考虑何时执行对外存进行“读/写”的指令
(2)文件的结构示意图
VSAM文件的结构如图12. 11所示。
它由3部分组成:索引集、顺序集和数据集
文件的记录均存放在数据集中
数据集中的一个结点称为控制区间(Control Interval)它是一个I/O操作的基本单位,它由一组连续的存储单元组成
控制区间的大小可随文件不同而不同
但同一文件.上控制区间的大小相同
每个控制区间含有一个或多个按关键字递增有序排列的记录
顺序集和索引集一起构成- -棵B+树,为文件的索引部分
顺序集中存放每个控制区间的索引项
(3)控制区间的结构示意图
每个控制区间的索引项由两部分信息组成:
即该控制的一个结点,结点之间用指针相链结,而每个结点又在其上- -层的结点中建有索引,且逐的一个结点,结点之间用指针相链结,而每个结点又在其上- -层的结点中建有索引,且逐层向上建立索引
所有的索引项都由最大关键字和指针两部分信息组成,这些高层的索引项形成B+树的非终端结点。因此,VSAM文件既可在顺序集中进行顺序存取,又可从最高层的索引(B+树的根结点)出发进行按关键字存取。顺序集中一个结点连同其对应的所有控制区间形成-个整体,称做控制区域(ControlRange)。每个控制区间可视为--个逻辑磁道,而每个控制区域可视为-一个逻辑柱面
在VSAM文件中,记录可以是不定长的,则在控制区间中除了存放记录本身以外
还有每个记录的控制信息(如记录的长度等)
和整个区间的控制信息(如区间中存有的记录数等)
控制区间的结构如图12. 12所示。
在控制区间上存取-一个记录时需从控制区间的.两端出发同时向中间扫描
(4)解决文件的溢出和插入
VSAM文件中没有溢出区,解决插人的办法是在初建文件时留有空间
-.是每个控制区间内不填满记录,在最末-个记录和控制信息之间留有空隙;
二是在每个控制区域中有一些完全空的控制区间,并在顺序集的索引中指明这些空区间
当插人新记录时,大多数的新记录能插人到相应的控制区间内
但要注意为了保持区间内记录的关键字自小至大有序
则需将区间内关键字大于插入记录关键字的记录向控制信息的方向移动
若在若干记录插人之后控制区间已满,则在下一个记录插人时要进行控制区间的分裂
即将近乎一半的记录移到同一控制区域中全空的控制区间中,并修改顺序集中相应索引
倘若控制区域中已经没有全空的控制区间,则要进行控制区域的分裂
此时顺序集中的结点亦在VSAM文件中删除记录时,需将同一控制区间中较删除记录关键字大的记录向前情况
在VSAM文件中删除记录时,需将同一控制区间中较删除记录关键字大的记录向前移动
把空间留给以后插人的新记录。若整个控制区间变空,则需修改顺序集中相应的索引项
由此可见,VSAM文件占有较多的存储空间,一般只能保持约75%的存储空间利用率
但它的优点是:动态地分配和释放存储空间,不需要对文件进行重组,并能较快地对插人的记录进行查找
查找一一个后插人记录的时间与查找一一个原有记录的时间是相同的
为了作性能上的优化,VSAM用了一些其他的技术,如指针和关键字的压缩、索引的存放处理等
八:直接存取文件【散列文件】
1.定义
直接存取文件指的是利用杂凑(Hash)法进行组织的文件
它类似于哈希表,即根据:
文件中关键字的特点设计一种哈希函数和处理冲突的方法将记录散列到存储设备上,故又称散列文件
2.桶
与哈希表不同的是,对于文件来说,磁盘上的文件记录通常是成组存放的
若干个记录组成一个存储单位,在散列文件中,这个存储单位叫做桶(Bucket)
假若-一个桶能存放m个记录
这就是说,m个同义词的记录可以存放在同一地址的桶中
而当第m+1个同义词出现时才发生“溢出”
处理溢出也可采用哈希表中处理冲突的各种方法,但对散列文件,主要采用链地址法。
3.处理溢出 【溢出桶-基桶】
当发生“溢出”时,需要将第m+1个同义词存放到另一个桶中
通常称此桶为“溢出桶”;相对地,称前m个同义词存放的桶为“基桶”
溢出桶和基桶大小相同,相互之间用指针相链接
当在基桶中没有找到待查记录时,就顺指针所指到溢出桶中进行查找
因此,希望同--散列地址的溢出桶和基桶在磁盘上的物理位置不要相距太远最好在同一柱面上
4.直接存取文件示例
例如,某一文件有18 个记录
其关键字分别为278, 109 , 063, 930,589 ,184, 505 ,269 , 008 ,083,164, 215,330,810,620,110,384,355
桶的容量m=3,桶数b=7。用除留余数法作哈希函数H(key)=key MOD 7
由此得到的直接存取文件如图12. 13所示
5.桶的容量和查找次数的关系
在直接文件中进行查找时,首先根据给定值求得哈希地址(即基桶号)
将基桶的记录出桶的记录读人内存继续进行顺序查找,直至检索成功或不成功
因此,总的查找时出桶的记录读人内存继续进行顺序查找,直至检索成功或不成功
因此,总的查找时出桶的记录读人内存继续进行顺序查找,直至检索成功或不成功。
因此,总的查找时间为:
a为存取桶数的期望值(相当于哈希表中的平均查找长度),
对链地址处理溢出来说,a=1+g;
te为存取-个桶所需的时间;ti为在内存中顺序查找一个记录所需时间。
a为装载因子,在散列文件中.
n为文件的记录数,
b为桶数,m为桶的容量。
显然,增加m可减少a,也就使a减小,此时虽则使ti增大,但由于te>>ti,则总的时间T仍可减少
图12.14 展示了a和a的关系。
在直接存取文件中删除记录时,和哈希表一样,仅需对被删记录作--标记即可
6.优缺点
总之,直接存取文件的优点是:
文件随机存放,记录不需进行排序
插人、删除方便
存取速度快
不需要索引区,节省存储空间
其缺点是:
不能进行顺序存取,只能按关键字随构不合理
即溢出桶满而基桶内多数为被删除的记录此时亦需重组文件
结构不合理,即溢出桶满而基桶内多数为被删除的记录
此时亦需重组文件
九:多关键字文件
多关键字文件的特点是
在对文件进行检索操作时,不仅对主关键字进行简单询问
还经常需要对次关键字进行其他类型的询问检索
1.多重表文件
多重表文件(MultilistFile)的特点是:
记录按主关键字的顺序构成-一个串联文件
并建立主关键字的索引(称为主索引)
对每一个次关键字项建立次关键字索引(称为次索引)
所有具有同一次关键字的记录构成一个链表
主索引为非稠密索引,次索引为稠密索引
多重链表文件易于构造,也易于修改
如果不要求保持链表的某种次序,则插人一个新记录是容易的
此时可将记录插在链表的头指针之后
但是,要删去一个记录却很繁琐,需在每个次关键字的链表中删去该记录
2:倒排序文件
倒排文件和多重表文件的区别在于次关键字索引的结构不同
通常,称倒排文件中的次关键字索引为倒排表
具有相同次关键字的记录之间不设指针相链
而在倒排表中该次关键字的一项中存放这些记录的物理记录号
解答,如询问“软件”专业的学生中有否选课程“乙”的
则只要将“软件”索引中的记录号和“乙”索引中的记录号作求“交”的集合运算即可
在插人和删除记录时,倒排表也要作相应的修改
值得注意的是倒排表中具有同--次关键字的记录号是有序排列的,则修改时要作相应移动
若数据文件非串链文件,而是索引顺序文件(如ISAM文件),
则倒排表中应存放记录的主关键字而不是物理记录号
倒排文件的缺点是维护困难
在同一索引表中,不同的关键字其记录数不同
各倒排表的长度不等,同--倒排表中各项长度也不等