我如何索引树在SQLite表

How can I index a tree in a SQLite Table?

本文关键字:SQLite 索引 何索引      更新时间:2023-10-16

我有一个包含以下字段的表:

<>之前id VARCHAR(32)主键父VARCHAR (32),名字VARCHAR (32)之前

parent是引用同一表的外键。这个结构生成一个树。这个树应该复制一个文件系统树。问题是从路径中查找id很慢。因此我想建立一个索引。最好的方法是什么?

示例数据:<>之前Id父名称-------- ----------- ----------1 NULL根2 1 foo31 bar4 3 baz5 4 aii之前

Would Index To:

<>之前Id父名称-------- ----------- ----------1 NULL根2 . root/foo31根/巴4 3根/bar/baz5 . root/bar/baz/aii之前

我目前正在考虑使用临时表,并在代码中手动运行一系列插入来构建索引。(我把它临时的原因是,如果这个数据库是从windows系统访问的,路径需要反斜杠,而从*nix它需要正斜杠)。还有别的办法吗?

那么,你有一个函数做这样的事情(伪代码):

int getId(char **path) {
    int id = 0;
    int i;
    char query[1000];
    for (i = 0; path[i] != NULL; i++) {
        sprintf(query, "select id from table where parent = %d and name = '%s'", id, name);
        id = QuerySimple(query);
        if (id < 0)
           break;
    }
    return id;
}

查看查询,您需要列(parent, name)上的(非唯一)索引,但可能您已经有了。

a(临时)表可以像您说的那样使用,请注意,您可以在程序中更改路径分隔符,从而避免在Windows和unix中使用不同的表。您还需要使附加表与主表保持同步。如果更新/删除/插入很少,那么您可以简单地在内存中保存已查找数据的缓存,并在更新发生时清除缓存(如果您愿意,也可以对缓存进行部分删除)。在这种情况下,你也可以读取更多的数据(例如,给定父节点读取所有子节点)来更快地填满缓存。在极端情况下,您可以读取内存中的整个表并在那里工作!这取决于您有多少数据,您的典型访问模式(读多少次,写多少次)和部署环境(您有多余的RAM吗?)。