键值单服务器数据库的数据库软件设计审查

Database Software Design Review for a Key Value Single Server DB

问题陈述的上下文。 滚动到底部有问题。

注意:table 不是关系型的,连接可以在应用程序级别完成。

记录

数据库的最原子单元(每条记录都有key,value,id)

页数

每个文件可以存储多条记录。每个页面都是一个有限的块(8 kb??),它还存储一个偏移量以在顶部检索每个 id?

索引

一种 B 树数据结构,它存储进行 log(n) 查找以查找哪个 ID 位于哪个页面的能力。 我们还可以将 id 和页面插入到这个 B 树中。

Table

每个 Table 是对存储多个页面的目录的抽象。 Table 还存储索引。

数据库

数据库是对目录的抽象,其中包括属于该数据库的所有 table。

数据库管理器

提供在不同数据库之间切换、创建新数据库和删除现有数据库的能力。

主进程中的通信

启动数据库管理器作为它自己的进程。 当进程退出时,它会将索引保存回磁盘。 该过程还根据时间间隔将索引存储回磁盘。 要与此数据库进程交互,我们将使用 http 与其通信。

数据库管理器存储对当前使用的数据库的引用。 存储在数据库管理器中的当前数据库属性存储对哈希图中所有 Table 的引用。 每个 Table 存储对从磁盘索引页读取并保存在内存中的索引的引用。 每个 Table 公开 public 方法来设置和获取键值对。 Get 方法通过 b-tree 导航找到正确的页面,在该页面上它根据存储在第一行的偏移量找到键 val 对,并且 returns 一个 Record.

每个 Set 方法都会向数据库添加一个键值对,然后更新该 table 的索引。

未解决的问题:

我脑海中的几个笔记:

您预计存储多少条记录?键和值的最大大小是多少?我问,因为使用每页文件方案,您可能会发现自己用尽了可用的文件句柄。

database/table 区分是否必要?这种分离对你有什么好处?真心问问题,不苏格拉底

我会根据最大键和值大小的倍数来定义页面大小,这样您可以获得良好的 read/write 对齐并且不会有太多碎片。可能值得拥有一个幼稚但 space 低效的对齐所有写入的实现。

我建议从尽可能简单的设计开始(加载所有索引、对齐写入、平面模式)来启动您的数据库,然后在需要时进行复杂性和优化,但不要在片刻之前。希望这对您有所帮助!