C 如何在磁盘块中一致地存储索引
我正在用C为Linux构建一个数据库引擎,我需要实现索引。 考虑这样一个简单的双链表索引:C 如何在磁盘块中一致地存储索引,c,database,database-design,C,Database,Database Design,我正在用C为Linux构建一个数据库引擎,我需要实现索引。 考虑这样一个简单的双链表索引: struct node_t { void *prev; void *next; long data; }; 对于永久存储,我必须在磁盘块中转换此结构,例如: struct node_on_disk_t { size_t prev_disk_block; short prev_disk_offset; size_t next_disk_block; s
struct node_t {
void *prev;
void *next;
long data;
};
对于永久存储,我必须在磁盘块中转换此结构,例如:
struct node_on_disk_t {
size_t prev_disk_block;
short prev_disk_offset;
size_t next_disk_block;
short next_disk_offset;
long data;
};
现在,当我插入一条记录时,也必须向索引中添加一个条目。如果索引只有几个元素,我可以将它一致地存储在一个磁盘块上,因为一个块的写入是原子的。但是,如果列表完全填充第一个块,则必须在insert上添加另一个块,并且必须更新两个块上的指针。但问题是,只能原子地写入1个块。所以,我的问题是如何一致地存储这种结构
在没有事务日志的情况下是否可以执行此操作?因为我可以将操作的描述存储在另一个磁盘块的第一类事务日志上,更新索引的指针,然后删除操作的描述,但这必须在3次写入中完成,速度太慢。有两种常见的策略: 事务日志 抄写 后者的工作原理是始终将新的和更改的数据复制到新的扇区,并在新映像建立后,使用一个原子扇区写入将其链接起来
不幸的是,我看不出这对双链接列表有什么作用。对于单链接列表,它是有效的。这个问题与[数据库设计]无关。请删除此标记。作为旁白:您确定这是实现索引的方式吗?数据库索引通常用于缩短访问时间。双链接列表并不是实现这一目标的最佳方式。@ArjunShankar是的,我确信。当用户单击应用程序中的“下一步”或“上一步”按钮时,他只想查看下一个或上一个数据,因此不需要读取完整的索引,因为它可能有数百万条记录,这不是a真正的用途,但可以。@ArjunShankar Ok,那么,当列表长度超过1个扇区时,如何存储双链接列表呢?