数据库设计如何知道C中某条记录占用的磁盘块信息

How to know disk block information in C occupied by some record Database Design

我想为我的桌面应用程序设计一个像 sqlite 这样的简单数据库管理系统。 sqlite 不能满足我需要的原因是它没有密码保护,也没有加密;任何人都可以使用某种 GUI 应用程序(如 Navicate)查看数据库。

在数据库设计中,table 中的 record/tuple 应该被索引,以便可以快速搜索以进行查找/删除/更新。正如所讨论的 here

这些索引使用指向记录的指针。索引可以是密集的、稀疏的、散列索引等。这些索引使用指向数据库文件中记录的指针。这些指针指向什么-

  1. 出于性能和效率的原因,单个记录不应跨越 超过两个磁盘块,因为块是磁盘中可以 read/writeen 的最小单位。使用C文件管理API我怎么知道 关于磁盘块。
  2. 索引文件中的指针是我们所在的特定位置 可以使用 C 语言中的 fseek() 或指向磁盘块的指针吗?
  1. 您没有指定 OS,但是在 POSIX 系统上,您可以使用 statvfs(3).

  2. 这听起来像是尚未编写的实现细节。但请记住,如果您的数据库将驻留在文件中,那么您只能使用文件级抽象 - 也就是说,文件偏移量就是您所拥有的。您无权访问原始分区。

此外,您是否调查过 SQLite Encryption Extension

从头开始设计一个好的 DBMS 并非易事。从您的消息来看,我似乎没有足够的知识来做到这一点。找到一些适合您需要的现成实现会更好。相信不会太难。

现在回答你的问题。

  1. 不,单个记录可能跨越多个磁盘块。软件实现不应该太依赖硬件,所有的硬盘驱动器都有缓存。所有 DBMS 都有一个 逻辑 单元,称为 "page"。 "page" 的实际大小因实施和用户设置而异,因此您最好 google 自己解决这个问题。

  2. 原始磁盘访问既危险又棘手。你应该避免它,并尽可能留给标准库。