我使用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,而是检索到它原始表中的几行。
答案 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)
- 如果节点是根节点(节点1),则节点的前2个字节包含树深度作为大端整数。对于非根节点,前两个字节未使用。
- 接下来的2个字节包含当前存储在节点中的条目数。
- 节点的其余部分包含节点条目。每个条目包含一个8字节整数,后跟偶数个4字节坐标。对于叶节点,整数是记录的rowid。对于内部节点,它是子页面的节点号。
醇>
所以你不需要查看_rowid
表;你可以直接从叶子节点的条目中获取它(如果你知道你想要哪个条目)。
(如果不查看所有节点的条目,则不能search in the R-tree。)