2011-12-31 31 views
0

我有一個表具有以下字段:如何在SQLite表中索引樹?

 
id  VARCHAR(32) PRIMARY KEY, 
parent VARCHAR(32), 
name VARCHAR(32) 

父是一個外鍵引用同一個表。這個結構生成一棵樹。這棵樹應該複製一個文件系統樹。問題是,從一條路徑上查找一個id是slooow。所以我想建立一個索引。這樣做的最好方法是什麼?

示例數據:

 
    id   parent  name 
-------- ----------- ---------- 
    1   NULL   root 
    2    1   foo 
    3    1   bar 
    4    3   baz 
    5    4   aii 

將指數爲:

 
    id   parent  name 
-------- ----------- ---------- 
    1   NULL   root 
    2    1   root/foo 
    3    1   root/bar 
    4    3   root/bar/baz 
    5    4   root/bar/baz/aii 

我目前考慮使用臨時表和手動運行從對建立索引的一系列插件的代碼。 (我把它設置爲臨時的原因是,如果這個數據庫是從Windows系統訪問的,路徑需要反斜槓,而從* nix它需要正斜槓)。有沒有其他的選擇?

回答

0

所以,你有做這樣的(僞)功能:

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; 
} 

看着查詢,則需要在列(母公司名稱)(非唯一)的索引,但也許你已經有了它。

一個(臨時)表可以像你說的那樣使用,注意你可以改變程序中的路徑分隔符,避免爲windows和unix使用不同的表。您還需要保持附加表與主站同步。如果更新/刪除/插入很少,而不是表格,則可以簡單地保留已查找數據的內存緩存,並在發生更新時清除緩存(如果需要,還可以對緩存進行部分刪除)。在這種情況下,您還可以讀取更多數據(例如,讓父母讀取所有孩子)來更快地填充緩存。在極端情況下,您可以讀取內存中的整個表格並在其中工作!它取決於您擁有多少數據,典型的訪問模式(多少次讀取,多少次寫入)以及部署環境(您是否有RAM可供使用?)。