【咨询】数据库按块存储问题?

目前正在学习数据库文件储存,希望能够通过自己的努力制作出第一个属于自己的简单关系型数据库。

现在我打算为数据库设计一个存储系统,计划采取的方案是可变长存储方式,在划分好的每个 4 KB的块之中,按照“块元信息 + 块数据”的方式进行存储,但是我现在对一件事情感到担忧:

一般来说,UNIX 提供了按块读写文件的方式(lseek),也提供了性能良好的write和read函数,但是,一般数据库文件的读与写,往往是并发进行的(因为总是有多个连接请求)

因此,这就意味着数据库的文件偏移量,往往对于不同的连接有不同的数据,这样的话,很有可能就会造成文件数据的损坏。

查询了一下 UNIX 的文件 API,UNIX 确实提供了文件锁的机制,可以对文件的某一块进行锁定,但是考虑到由于写会造成文件总体的偏移量改变,所以还是感觉非常不确定。

请问大家一般这种场景是如何进行解决的呢?

读写相同位置不能并行,你要自己保证读写串行。不同位置的随便读写。你同一个进程操作文件为什么要用文件锁呢?

1 个赞

建议先从最简单的开始,比如leveldb, 去把它的代码读一遍,传统的b+ tree结构的关系型存储引擎太复杂了,很容易打击初学者的信心。另外即使你要实现关系型数据库目前看起来lsm tree的也比 b+ tree要流行了。

2 个赞

建议还是从先多学点数据库的基础吧。

写文件只能改写或者追加,不会造成偏移量改变。

1 个赞

建议先学习下课程 15-445 哈。

1 个赞