实现数据库的块存储
implementing block storage for a database
对于数据库类,我们正在实现自己的数据库,而我在如何在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…——这肯定会给你一些想法!
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- Sqlite3:将数据库表名存储在向量中
- 将产品数据库存储在Arduino上
- 将指针存储到SQLITE3数据库中的类别抛出segfault
- 添加两个时间值存储为数据库中的字符串
- 如何轻松快速地存储大型单词数据库?
- 在这种情况下,将数据存储在诸如SQLite之类的数据库中,还是存储在平面文本文件中更好
- 鸟类调查中的项目在代码中遇到问题.如何像数据库系统一样存储数据
- 在哪里可以在Windows和OS X上存储SQLite数据库
- 将公共密钥存储在数据库(C )中
- 将大量数据存储在数据库中的最有效方法
- 如何在小型聊天应用程序中为数据库存储的用户事务建模
- 从数据库中以 blob 数据类型形式存储的原始图像数据中检索 CImage 对象
- 如何通过C++代码在MySQL数据库中存储控制字符
- 将 Oracle 数据库表的 ROWID 存储为字符数组
- 黑莓 10 数据库持久存储
- QT C++ 将文件从数据库存储到我的文件系统
- 从数据库中选择客户端的信息并存储到向量中
- 如何在多维数组中存储数据库中的数据
- 可嵌入的文档存储数据库