我如何索引树在SQLite表
How can I index a tree in a SQLite Table?
我有一个包含以下字段的表:
<>之前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吗?)。
相关文章:
- 数组索引的值没有增加
- 查询SQLite数据库中的日期
- 芬威克树(BIT).找到具有给定累积频率的最小索引,单位为 O(logN)
- 带内存和隔离功能的SQLite
- 查找最接近的大于当前数字的数字的索引
- 在C++中调整向量中的索引
- 重载元组索引运算符-C++
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 为std::string的某个索引赋值
- 并行用于C++17中数组索引范围内的循环
- Qt SQLite没有查询或参数计数不匹配
- Qt SQlite无法创建表
- 跟随整数索引列表的自定义类迭代器
- 如何在for循环中包含两个索引值的测试条件
- D3D11-将混合权重和索引传递到顶点着色器
- 将转换字符键入 int 以用作向量C++的索引
- 在 C++ 中访问数组负索引处的内存不会返回垃圾
- 绑定或色谱柱索引超出范围Sqlite C
- 如何在删除一行后重新索引或修复rowid sqlite
- 我如何索引树在SQLite表