我想暂时设计我自己的用于教育目的的数据库引擎。设计二进制文件格式并不难,也不是问题,我过去做过,但是在设计数据库文件格式时,我遇到了一个非常重要的问题:
如何处理项目的删除?
到目前为止,我已经想到了以下两个选项:
- 每个项目都有一个“已删除”位,删除时设置为 1。
- 亲:比较快。
- 缺点:潜在的敏感数据将保留在文件中。
0x00
删除整个项目。- 亲:潜在的敏感数据将从文件中删除。
- 缺点:相对较慢。
- 重新创建整个数据库。
- 优点:没有空块,这使得后续问题无效。
- 缺点:覆盖整个 4 GB 数据库文件是一个非常好的主意,因为用户更正了一个错字。我会尽快把这个方法卖给 Twitter!
现在假设您的数据库中已经有一些空块(已删除的项目)。后续问题是如何处理插入新项?
- 将项目附加到文件的末尾。
- 亲:最快的可能。
- 缺点:文件会变得很大,因为所有的空块仍然存在,因为删除的项目实际上并没有被删除。
- 搜索与您要插入的块大小完全相同的空块。
- 临:可能会摆脱一些障碍。
- 缺点:您最终可能会在每次插入时扫描整个文件,却发现它不太可能遇到完美匹配的空块。
- 找到第一个等于或大于您要插入的项目的空块。
- 亲:你可能不会扫描整个文件,因为你会在中途发现一个空块;这将使文件大小保持相对较小。
0x00
缺点:在插入到比实际更大的空块中的项目末尾仍然会有很多剩余字节。
现在,我认为第一个删除方法和最后一个插入方法可能是“最好”的组合,但它们仍然会有自己的小问题。或者,第一种插入方法和预定的完整数据库重新创建。(在处理非常大的数据库时可能不是一个好主意。此外,该方法中的每个小更新都会将整个项目克隆到文件末尾,从而以可能疯狂的速度加速文件增长。)
除非有一种以文件系统批准的方式从文件中间删除/插入块的方法,否则最好的方法是什么?更重要的是,目前生产中使用的数据库通常如何处理这个问题?