定长记录与不定长记录

文件是操作系统的一种基本的数据结构。在逻辑上可看作是记录的序列,物理上这些记录被映射到磁盘块中。一般数据模型中的记录在文件中有两种不同的组织格式:定长记录和不定长记录。

把数据库映射到文件的一种方法是使用多个文件,每个关系表被映射到一个文件中存储,这样每个文件中就只存储一个固定长度的记录,这就是定长记录格式的文件。另一种方法是自己构造文件,使之能够容纳多种长度的记录,这样整个数据库就可以被映射到一个文件中存储,即使用变长记录格式的文件。

1.定长记录

create table student(
  studentNo char,
  courseNo  char,
  float score,
)

假设一个字符占1B,float类型占4B,那么student表中的一条记录占16B。这种方法就是用16B来存储第一条记录,接下来的16B来存储第二条记录。如图1所示。

 

                                                                                   图1

这种简单的方法明显的有两个问题:

1.删除一条记录比较困难。要么填充被删空间,要么标记被删空间。

2.除非块的大小是16的倍数,否则有的记录会跨块存储。对于跨块存储的记录的访问就需要进行两次磁盘的I/O操作。

当一条记录被删除时,紧随其后的第二条记录移到被删除记录的位置。如果表中含有大量的记录时显然这种方法需要移动大量的记录。另一种方法是将文件的最后一条记录移动到被删除记录的位置。移动记录来填充删除记录所释放的空间的做法并不理想,这样做需要付出额外的块访问操作。所以一种做法是把删除记录的空间空着。等待随后的插入记录来使用这个空间。刚开始讲到在可以在被删除记录上做一个已删除标记,但当你去插入某条记录时往往要找到这个空间比较困难。所以引入了一种额外的结构。

在文件的开始处分配一定数量的字节作为文件头,文件头中存储有关文件的各种信息。在文件头中存储第一条记录被删除记录的地址。在第一条被删除记录中存储被删除第二条记录的地址。这样就形成了一条链表,称为空闲列表。如图2所示。

                                                                                     图2               

在插入一条记录时,可以使用头文件所指向的记录。并改变文件头的指针方向下一条记录。如果空闲列表为空,就将插入的记录添加到文件末尾。

2.变长记录

在数据库系统中,以下几种情况会使用变长记录:

1.多种记录类型(即多个关系表)在一个文件中存储;

2.允许记录类型中包含一个或多个变长字段;

3.允许记录类型中包含重复字段,如数组等。

有多种变长记录的存储管理技术,这里仅介绍分槽页结构。分槽页结构一般用于在块中组织记录。如图所示。每个块的开始处有一个块头,块头中包含的信息有:1.块头中已存储的条目个数#E;2.块中空闲空间的末尾地址EFS;3.条目数组,每个条目中存储了该条目所对应变长记录的大小ES和地址EP。

        如果一条记录被删除,首先,它所占用的空间被释放,他所对应的条目被置成删除状态(例如将ES置为-1,该条目可以留作后面插入的记录使用);其次,块中位于被删除记录左边的所有记录右移,使删除而被释放的空间集中到块的中部,所有被移动的记录所对应条目的EP值也需要跟着修改,使其指向记录的起始位置;最后,修改EFS的值,使它指向空闲空间的尾部,只要块中有空闲的空间,使用类似的技术可以使记录增长或缩短。 由于块的大小有限,典型为4KB,因此在块内移动记录的代价并不会太高。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章