SQLite Rtree 映射 id(s) 从影子表到原始表



我使用 SQLite 创建了一个 Rtree 数据结构,它生成 4 个表(一个用于原始表,三个影子表)。我正在尝试弄清楚如何使用影子表中的nodeno属性检索原始表中行的id

根据 SQLite 文档,%rowid 表可用于将 id(s) 从影子表映射到原始表。以下是文档所述内容

"单个虚拟 r 树表的数据结构存储在三个 本机 SQLite 表声明如下。在每种情况下,"%"字符 在表中,名称被替换为用户提供的 R 树名称 桌子。

创建表 %_node(节点无整数主键,数据 BLOB)

创建表 %_parent(节点无整数主键,父节点整数)

创建表 %_rowid(ROWID 整数主键,节点无整数)

r 树结构的每个节点的数据存储在 %_node 表中。对于不是 r 树根节点的每个节点,有 %_parent 表中将节点与其父节点相关联的条目。 对于表中的每一行数据,%中都有一个条目_rowid 从条目 rowid 映射到其节点 id 的表 被存储在上面。

我尝试运行以下查询

SELECT p.id 
FROM mytable_rowid r, mytable p 
WHERE r.rowid = p.id  
AND r.nodeno = 9341;

我原本以为这个查询会返回原始表 (mytable) 中单个节点的 id,该节点在影子表的nodeno属性中值为 9341,但它却从原始表中检索了几行。

一个节点可以(必须,除非它是根节点)存储多行。

节点是树的边界框,不是吗?

请参阅R树论文,它有一个参数。

源代码说:

  1. 如果节点是根节点(节点 1),则节点的前 2 个字节包含大端整数形式的树深度。对于非根节点,前 2 个字节将保持未使用状态。
  2. 接下来的 2 个字节包含节点中当前存储的条目数。
  3. 节点
  4. 的其余部分包含节点条目。每个条目由一个 8 字节整数后跟偶数个 4 字节坐标组成。对于叶节点,整数是记录的 rowid。对于内部节点,它是子页面的节点号。

因此,您不需要查看_rowid表;您可以直接从叶节点中的条目获取它(如果您知道需要哪个条目)。

(如果不查看所有节点的条目,则无法在 R 树中进行搜索。

最新更新