在数据库管理系统(DBMS)中,数据的存取过程遵循一定的流程:
- 应用程序通过数据操纵语言(DML)向DBMS发出数据存取请求,如使用SELECT语句;
- DBMS会对这些请求进行语法检查,确认无误后还将核查语义及用户权限,这些信息均来源于数据字典(DD);
- 完成检查后,DBMS会优化查询执行,将请求转换为一连串单独记录的存取操作序列;
- 接着,DBMS将执行这些存取操作序列;
- 在系统缓冲区中,DBMS会搜索记录,若找到则继续后续操作,若未找到则转入下一步;
- DBMS将根据存储模式决定从哪个文件以及以何种方式读取物理记录;
- 随后,根据读取结果,DBMS会向操作系统(OS)发出读取记录的指令;
- OS执行该指令,读取记录数据后,将数据传回给DBMS;
- 在OS的管控下,DBMS将读取的记录送入系统缓冲区,并根据查询命令和DD的内容导出用户所需的记录格式;
- 数据从系统缓冲区送至用户工作区后,DBMS会反馈执行状态信息(成功或失败)给应用程序;
- 应用程序则对工作区中的数据进行相应处理。
数据库采用文件方式存储数据,这些文件在逻辑上可视为记录序列,物理上则映射至磁盘块中。
当需要删除一条记录时,虽然传统方法是将后续记录移至删除记录位置进行填补,但这涉及大量记录的移动,效率较低。为此,DBMS常采用暂不移动删除记录的空间,留待后续插入操作复用此空间的方法。但仅做删除标记并不足够,因此需引入额外结构以管理这些空间。
在文件开始处,DBMS会预留一定数量的字节作为文件头。文件头中存储了关于文件的各种信息,并记录了第一条被删除的记录。随后被删除的记录会以链表形式进行记录,此链表即称为空闲链表。
存储记录的常用方法包括堆文件、顺序文件、多表文件、B+树文件以及散列文件等(后两者多用于索引记录)。记录在文件中并无固定位置,可随机存放,即文件中的记录是以堆积方式存在。
顺序文件是为高效处理按特定搜索码值顺序排列的记录而设计的。搜索码是某个属性或属性集合的值,它可能不是主码甚至是超码。为快速按搜索码值顺序获取记录,DBMS会通过指针将文件块逻辑上有序地连接起来。每个文件块的指针指向搜索码值顺序的下一个文件块。
虽然顺序文件对于某些特定查询非常有效,但在插入和删除记录时维护物理顺序却较为困难。对此,DBMS采取了以下改进措施:
- 删除操作时,DBMS同样会在文件中定位待删除记录所在的文件块。删除记录后,若文件块内剩余记录过少,可能会考虑将其他文件块的记录移至该文件块或反之。
在小型的数据库管理系统中,通常会将一个关系的所有定长记录存储在单个文件中,以便利用操作系统提供的文件系统功能并简化DBMS的设计。大型数据库管理系统可能不直接依赖操作系统进行文件管理,而是自行管理一个由操作系统分配的大文件。
多表文件是一种特殊的文件结构,它在一个文件块中存储了两个或多个关系的相关记录。这种结构将多个关系的元组(行)混合在一起进行存储,从而支持高效的连接运算。
举例来说: