SQLite Rtree将影子表中的ID映射到原始表

时间:2017-04-09 20:53:18

标签: sqlite r-tree

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

根据SQLite文档,%rowid表可用于将影子表中的id映射到原始表。以下是文档说明的内容

“单个虚拟r-tree表的数据结构存储为三个 原生SQLite表声明如下。在每种情况下,'%'字符 在表名中,用用户提供的r-tree名称替换 表

CREATE TABLE%_node(nodeno INTEGER PRIMARY KEY,data BLOB)

CREATE TABLE%_parent(nodeno INTEGER PRIMARY KEY,parentnode INTEGER)

CREATE TABLE%_rowid(rowid INTEGER PRIMARY KEY,nodeno INTEGER)

r-tree结构的每个节点的数据存储在%_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,而是检索到它原始表中的几行。

2 个答案:

答案 0 :(得分:0)

A node can (must, unless it is the root node) store multiple rows.

The nodes are the bounding boxes of the tree, aren't they?

See the R-tree paper, it has a parameter for this.

答案 1 :(得分:0)

source code说:

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

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

(如果不查看所有节点的条目,则不能search in the R-tree。)