把数据库映射到文件的一种方法是使用多个文件,在任意一个文件中只存储一个固定长度的记录。另一种选择是构造自己的文件,使之能够容纳多种长度的记录。
1、定长记录
文件中的每个记录定义(伪代码)如下:
type insructor=record
ID varchar(5);
name varchar(20);
dept_name varchar(20);
salary numeric(8,2);
假设每个字符占一个字节,numeric(8,2)占8个字节。假设我们为每个属性ID、name和dept_name分配可以容纳的最大字节数,instructor记录占53个字节。简单方法是使用前53个字节来存储一个记录,接下来53个字节存储第二个记录,以此类推。但是这个方法有俩个疑问:
- 除非块的大小正好是53的倍数,否则一个记录会存储在俩个块中。读写一条记录需要俩次块访问
- 从这个结构中删除一条记录十分困难。
解决上面第一个问题,就是直接在一个块中只分配它能完整容纳下的最大记录数。每个块中余下的字节不使用。
第二个问题:在文件的开始处,分配一定数量的字节为文件头。我们需要在文件头中存储的只有内容被删除的第一个记录的地址。我们用第一个记录来存储第二个可用记录的地址,依次类推。我们可以把这些存储的地址看作指针,被删除的记录形成了一条链表,经常称为空闲列表。
在插入一条新纪录的时候,我们使用文件头所指向的记录插入记录,并改变文件头的指针以指向下一个可用记录。如果没有可用的空间,我们就把这条记录添加到文件末尾。
2、 变长记录
变长记录存储:前面是定长存储字节,后面是变长存储字节
entries记录位置,如果一条记录被删除,它所占用的空间被删除,那么entries被设置成删除状态,并且删除的记录的空间被后续记录占用,空闲空间还是在entries的最后一个条目和第一个记录中