【发布时间】:2012-08-17 19:04:16
【问题描述】:
我正在用 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;
};
现在,当我插入一条记录时,也必须将一个条目添加到索引中。如果索引只有几个元素,我可以将它一致地存储在 1 个磁盘块上,因为 1 个块的 write() 是原子的。但是,如果列表完全填满了第一个块,则必须在插入时添加另一个块,并且必须在两个块上更新指针。但问题是,只能原子写入 1 个块。所以,我的问题是如何一致地存储这种结构?
这可以在没有事务日志的情况下完成吗?因为我可以先将操作的描述存储在另一个磁盘块上(某种事务日志),更新索引的指针,然后删除操作的描述,但这必须在 3 个 write()s 中完成,太慢了
【问题讨论】:
-
本题与
[database-design]无关。请删除此标签。 -
顺便说一句:您确定这就是您要实现索引的方式吗?数据库索引通常旨在提高访问时间。双向链表并不是实现这一目标的最佳方式。
-
@ArjunShankar 是的,我确定。当用户在应用程序中点击“下一个”或“上一个”按钮时,他只想查看下一个或上一个数据,因此不需要读取完整的索引,因为它可能有数百万条记录
-
这不是database index 的真正用途,但没关系。
-
@ArjunShankar 好的,那么当列表长度超过 1 个扇区时如何存储双链表呢?
标签: c database database-design