问题陈述的上下文。滚动到底部询问问题。
注意:这些表不是关系型的,连接可以在应用程序级别进行。
类
记录
数据库的大多数原子单位(每个记录都有键、值、id)
页面
每个文件可以存储多个记录。每个页面都是一个有限的块(8kb??),它还存储一个偏移量以在顶部检索每个id?
索引
B树数据结构,它存储进行日志(N)查找的能力,以找到哪个id存在于哪个页面中。我们也可以将id和页面插入到B树中。
表格
每个表都是存储多个页面的目录的抽象。表还存储索引。
数据库
数据库是对目录的抽象,该目录包括作为该数据库一部分的所有表。
数据库管理器
提供在不同数据库之间切换、创建新数据库和删除现有数据库的能力。
主进程中的通信
启动数据库管理器,作为它自己的进程。当进程退出时,它会将索引保存回磁盘。该进程还根据间隔将索引存储回磁盘。为了与这个DB进程进行交互,我们将使用http与它进行通信。
数据库管理器存储对正在使用的当前数据库的引用。存储在数据库管理器中的当前数据库属性存储对hashmap中所有表的引用。每个表存储对从索引页从磁盘读取并保存在内存中的索引的引用。每个表公开用于设置和获取键值对的公共方法。Get方法通过b树导航以找到正确的页面,在该页面上根据存储在第一行上的偏移量找到键val对,并返回一条记录。
每个Set方法向数据库中添加一个键val对,然后更新该表的索引。
未决问题:
发布于 2022-04-08 02:56:00
我头上有几个音符:
你预计会存储多少个记录?最大键和值大小是多少?我问您,因为使用每个页面的文件方案,您可能会发现自己耗尽了可用的文件句柄。
是否需要对数据库/表进行区分?这种分离给你带来了什么?真正的问题不是苏格拉底。
我将根据您的最大键和值大小的倍数来定义页面大小,这样您就可以获得良好的读/写对齐,而不会有太多的碎片。它可能值得有一个天真的,但空间效率低的,实现对齐所有写入。
我建议从最简单的设计开始(加载所有索引、对齐写入、平面模式)来启动数据库,然后根据需要对复杂性和优化进行分层,但不是在前一刻。希望这能有所帮助!
https://stackoverflow.com/questions/71789508
复制相似问题