基于磁盘的B + -tree实现,具有固定大小的键和值

时间:2013-01-12 07:50:50

标签: database data-structures relational-database b-tree

是否有任何库提供基于磁盘的B + -tree实现,专门针对所有键具有固定大小并且所有值也具有固定大小的场景(不一定与键的固定大小相同) ?

注意:是的,我想实现另一个玩具,概念验证RDBMS。有a very good reason为什么我没有使用SQL DBMS。 结束注释。

我并不特别介意库的编写语言。但是,我对库的功能有一些特定的要求。为了清楚起见,这些要求将用C语言编写的例子来说明。

库必须足够灵活,以允许我使用自己的比较功能。例如:

struct comparer
{
    void * extra;
    int (*function)(
        void *, // closure over extra
        char *, // 1st value to be compared
        char *  // 2nd value to be compared
    );
};

应如何操作索引文件的机制由所有键的固定长度,所有值的固定长度以及键的比较函数定义。例如:

struct index_spec
{
    size_t keylen, vallen;  // fixed lengths for keys and values
    struct comparer comp;   // comparison function for keys
};

如果库在可查询索引和可更新索引之间建立了差异,并且在需要可查询索引时使用可更新索引的机制,那将是一个非常好的触摸(尽管不是强制性的),但不是相反。例如:

struct queryable_index
{
    struct index_spec spec;
    FILE * file;            // opened in read mode
};

struct updateable_index
{
    struct index_spec spec;
    FILE * file;            // opened in read/write mode
};

struct queryable_index open_queryable_index
    (struct index_spec, const char *);

struct updateable_index open_updateable_index
    (struct index_spec spec, const char * filename);

struct queryable_index just_queryable_index
    (struct updateable_index index)
{
    struct queryable_index result;
    result.spec = index.spec;
    result.file = index.file;
    return result;
}

2 个答案:

答案 0 :(得分:3)

我所知道的最佳实施是Berkeley DB。它是一个高性能的嵌入式数据库系统,具有由Sleepycat开发的非常好的B树实现,后来被Oracle收购。

它是用C语言编写的,支持您使用的使用场景。它是开源的,如果你想构建自己的实现,代码是一个寻找灵感的好地方。

玩得开心!

答案 1 :(得分:0)

性LevelDB: " leveldb库提供持久性键值存储。键和值是任意字节数组。密钥根据用户指定的比较器功能在密钥值存储区内排序。"

https://github.com/google/leveldb/blob/master/doc/index.md