文件存储组织模块:src/storage
RMDB以数据⻚(Page)为单位对内存中的数据来进行统一管理。系统提供了Page类(Page class),通过
BufferPoolManager来管理数据⻚在磁盘和内存中的I/O,通过DiskManager来进行磁盘中文件的读写。
Page
Page类是数据管理的基本单位,每一个Page都对应唯一的⻚号(PageId),每一个数据⻚都对应一个磁盘文件,对于同一个文件中的数据⻚,用page_no来对数据⻚进行索引。
记录存储组织模块:src/record
记录存储组织模块为上层模块提供了对表中记录的操作接口,包括记录文件的创建和删除、记录的插入修改和删除、记录文件中数据⻚的读写等。
首先介绍记录文件相关的数据结构,每一个数据库中的表可以分为表的元数据和表的记录数据,表的元数据统一存储在<database.meta> 文件中,表的记录数据单独存储在同名文件中,我们称该文件为记录文件,在RMDB中,我们用RmFileHandle类来对一个记录文件进行管理,RmFileHandle类中记录了文件描述符和文件头信息,数据结构如下:
文件头信息用RmFileHdr结构体来进行维护。前文中提到,记录文件中顺序存放该表的每一条记录,按照数据⻚的形式进行划分,在目前系统中,同一个表中的所有记录大小是相同的,因此,在一个表创建之初,该表的record_size就固定下来了;对于数据⻚的管理,本系统目前使用Bitmap的形式进行管理,因此,在RmFileHdr中还记录了bitmap的大小,对于每一个数据⻚,都使用一个Bitmap来对该数据⻚的记录进行管理,因此Bitmap的大小在表创建之初就可以计算出来。RmFileHdr的数据结构如下:
file_hdr中的num_pages记录此文件分配的page个数,page_no范围为[0,file_hdr.num_pages),page_no从0开始增加,其中第0⻚存file_hdr,从第1⻚开始存放真正的记录数据。
对于每一个数据⻚,本系统使用RmPageHandle类进行封装管理,每一个数据⻚的开始部分并不直接存放记录数据,而是按照以下顺序进行存放:
page_lsn_ | page_hdr | bitmap | slots |
- page_lsn_用于故障恢复模块,将在故障恢复模块中进行详细介绍。
- page_hdr记录了两个信息,一个是num_records,记录当前数据⻚中已经分配的record个数,同时记录了next_free_page_no,记录了如果当前数据⻚写满之后,下一个还有空闲空间的数据⻚的page_no。
- bitmap记录了当前数据⻚记录的分配情况。
- slots则是真正的记录数据存放空间。
RmPageHandle的数据结构如下:
对于具体的每一个记录,使用RmRecord来进行管理,数据结构如下:
同时,使用Rid来对每一个记录进行唯一的标识,数据结构如下: