实现数据库的块存储

implementing block storage for a database

本文关键字:存储 数据库 实现      更新时间:2023-10-16

对于数据库类,我们正在实现自己的数据库,而我在如何在C++中实现块存储(其中每个块是1024字节)时遇到了问题。

我们将每个数据库表存储为硬盘上可随机访问的块集合,其中第一个块是文件头,专用于元数据(块0),随后的每个块专用于存储表的行。这些块将作为文件写入硬盘。我们还将有一个块作为"内存中"的缓冲区;我们可以读取和编辑缓冲区中的数据,当我们准备好时,我们将内存中的缓冲区写回磁盘。

我认为我可以概念化内存中的缓冲区,但我遇到了如何将内存块写入文件的问题。我有两个想法,每个想法都有自己的困难:

想法1

创建一个正好为1024字节的类MemoryBlock。每个MemoryBlock可以存储任意数据(表的文件头或行)。通过将MemoryBlock数组写入文件,将每个表存储为单个文件。

难度:我可以更新文件中间的单个块吗?我的理解是,文件必须被覆盖或附加到。如果我有一个3个MemoryBlock(块0-2)的文件,并且我想更新块1中的一行,我可以把块1拉到缓冲区中,编辑它,然后把它写回文件的中间吗?我必须把整个文件拉到内存中,编辑我想要的内容,然后覆盖原始文件吗?

想法2

将每个块作为单独的文件存储在磁盘上。这将允许我随机访问任何块并将其写回磁盘,而不必担心表的其余部分

难度:我不确定这是否真的强制执行1024字节的块大小。是否有任何方法要求每个文件不超过1024字节?


我不赞成这两种想法,但我很感激任何有助于我更好地理解数据库管理系统中的块存储的意见。


编辑:正如@zaufi所指出的,1024字节的块大小是非常非典型的。写这篇文章时,我打算键入4096字节的块。

ohh man,您肯定需要阅读关于数据库内部的smth。。。

这是我的5美分:两个主意都不好!为什么决定使用1024字节的块???现代硬盘的物理扇区大小为4096字节!磁盘控制器具有高速缓存4M-6M-8M-16M-。。。所以写1K只是浪费资源。。。

顺便说一下,在文件中间更新smth总是个坏主意。。。但如果性能不是你关心的问题,你肯定可以…

在重新发明轮子之前,尝试研究各种DMBS中使用的典型方法。。。还有一个好的(简单的)阅读来源:谷歌关于leveldb和firends…——这肯定会给你一些想法!