2017-04-09 4 views
1

J'ai créé une structure de données Rtree à l'aide de SQLite, qui génère 4 tables (une pour la table d'origine et trois pour les tables masquées). Et j'essaie de comprendre comment récupérer le id d'une ligne dans la table d'origine en utilisant l'attribut nodeno dans les tables fantômes. Selon la documentation de SQLite, la table% rowid peut être utilisée pour mapper l'ID (s) à partir des tables fantômes à la table d'origine. Voici ce que la documentation indiqueSQLite Rtree Mapping ID (s) de la table Shadow à la table Original

« La structure de données pour une table r-arbre virtuel unique est stocké dans trois tables SQLite indigènes déclarées comme suit. Dans chaque cas, le caractère « % » au nom de la table est remplacée avec le nom fourni par l'utilisateur de la table r-tree .

CREATE TABLE% _node (nodeno INTEGER PRIMARY KEY, BLOB de données)

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

CREATE TABLE% _rowid (r owid INTEGER PRIMARY KEY, nodeno INTEGER)

Les données de chaque noeud de la structure de l'arborescence sont stockées dans la table% _node. Pour chaque nœud qui n'est pas le nœud racine de l'arbre r, il y a une entrée dans la table% _parent associant le nœud à son parent. Et pour chaque ligne de données dans le tableau, il y a une entrée dans le répertoire% _rowid tableau que les cartes des entrées rowid à l'ID du nœud qu'il est stocké sur. »

J'ai essayé de courir la requête suivante

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

Je me attendais à ce que cette requête retournerait l'id d'un seul nœud dans la table d'origine (mytable) qui a une valeur de 9341 dans le nodeno attribut des tables d'ombre, mais au lieu il a récupéré plusieurs lignes de la table d'origine

Répondre

0

Un nœud peut (doit, sauf s'il s'agit du nœud racine) stocker plusieurs lignes.

Les nœuds sont les limites de l'arbre, n'est-ce pas?

Voir le papier R-tree, il a un paramètre pour cela.

+0

Oui, mais nodeno = 9341 est un nœud feuille ** ** dans le rtree –

+0

Cela vaut également pour les nœuds de feuilles. Aucune raison d'envelopper chaque point de données dans un nœud feuille séparé, n'est-ce pas? –

0

Le source code dit:

  1. Si le noeud est le noeud racine (noeud 1), puis les 2 premiers octets du noeud contiennent la profondeur de l'arbre comme un entier gros-boutiste. Pour les nœuds non-root, les 2 premiers octets restent inutilisés.
  2. Les 2 octets suivants contiennent le nombre d'entrées actuellement stockées dans le nœud.
  3. Le reste du noeud contient les entrées de noeud. Chaque entrée est constituée d'un seul entier de 8 octets suivi d'un nombre pair de coordonnées de 4 octets. Pour les nœuds feuilles, l'entier est le rowid d'un enregistrement. Pour les nœuds internes, il s'agit du numéro de nœud d'une page enfant.

Vous n'avez pas besoin de regarder dans la table _rowid; vous pouvez l'obtenir directement à partir de l'entrée dans le nœud feuille (si vous savez quelle entrée vous voulez).

(Vous ne pouvez pas search in the R-tree sans regarder dans toutes les entrées nœuds.)