MiniOB 1
MiniOB is one mini database, helping developers to learn how database works.
|
这里负责管理在一个文件上表记录(行)的组织/管理 更多...
类 | |
struct | PageHeader |
数据文件,按照页面来组织,每一页都存放一些记录/数据行 更多... | |
class | RecordPageIterator |
遍历一个页面中每条记录的iterator 更多... | |
class | RecordPageHandler |
负责处理一个页面中各种操作,比如插入记录、删除记录或者查找记录 更多... | |
class | RecordFileHandler |
管理整个文件中记录的增删改查 更多... | |
class | RecordFileScanner |
遍历某个文件中所有记录 更多... | |
这里负责管理在一个文件上表记录(行)的组织/管理
表记录管理的内容包括如何在文件上存放、读取、检索。也就是记录的增删改查。 这里的文件都会被拆分成页面,每个页面都有一样的大小。更详细的信息可以参考BufferPool。 按照BufferPool的设计,第一个页面用来存放BufferPool本身的元数据,比如当前文件有多少页面、已经分配了多少页面、 每个页面的分配状态等。所以第一个页面对RecordManager来说没有作用。RecordManager 本身没有再单独拿一个页面 来存放元数据,每一个页面都存放了一个页面头信息,也就是每个页面都有 RecordManager 的元数据信息,可以参考 PageHeader,这虽然有点浪费但是做起来简单。
对单个页面来说,最开始是一个页头,然后接着就是一行行记录(会对齐)。 如何标识一个记录,或者定位一个记录? 使用RID,即record identifier。使用 page num 表示所在的页面,slot num 表示当前在页面中的位置。因为这里的 记录都是定长的,所以根据slot num 可以直接计算出记录的起始位置。 问题1:那么如果记录不是定长的,还能使用 slot num 吗? 问题2:如何更有效地存放不定长数据呢? 问题3:如果一个页面不能存放一个记录,那么怎么组织记录存放效果更好呢?
按照上面的描述,这里提供了几个类,分别是: