Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在磁盘块中一致地存储索引_C_Database_Database Design - Fatal编程技术网

C 如何在磁盘块中一致地存储索引

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

我正在用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;
    short  next_disk_offset;
    long   data;
};
现在,当我插入一条记录时,也必须向索引中添加一个条目。如果索引只有几个元素,我可以将它一致地存储在一个磁盘块上,因为一个块的写入是原子的。但是,如果列表完全填充第一个块,则必须在insert上添加另一个块,并且必须更新两个块上的指针。但问题是,只能原子地写入1个块。所以,我的问题是如何一致地存储这种结构


在没有事务日志的情况下是否可以执行此操作?因为我可以将操作的描述存储在另一个磁盘块的第一类事务日志上,更新索引的指针,然后删除操作的描述,但这必须在3次写入中完成,速度太慢。有两种常见的策略:

事务日志 抄写 后者的工作原理是始终将新的和更改的数据复制到新的扇区,并在新映像建立后,使用一个原子扇区写入将其链接起来


不幸的是,我看不出这对双链接列表有什么作用。对于单链接列表,它是有效的。

这个问题与[数据库设计]无关。请删除此标记。作为旁白:您确定这是实现索引的方式吗?数据库索引通常用于缩短访问时间。双链接列表并不是实现这一目标的最佳方式。@ArjunShankar是的,我确信。当用户单击应用程序中的“下一步”或“上一步”按钮时,他只想查看下一个或上一个数据,因此不需要读取完整的索引,因为它可能有数百万条记录,这不是a真正的用途,但可以。@ArjunShankar Ok,那么,当列表长度超过1个扇区时,如何存储双链接列表呢?