目前,我正在研究標題行中提到的遷移。問題是保存在註冊表中的應用程序配置有一個樹狀結構,例如:從Windows註冊表遷移到SQLite的應用程序配置
X
|->Y
|->Z
|->SomeKey someValue
W
|->AnotherKey anotherValue
等等。
如何在SQLite(或任何其他數據庫)中建模該結構?如果您有類似問題的經驗,請發郵件。提前致謝。
目前,我正在研究標題行中提到的遷移。問題是保存在註冊表中的應用程序配置有一個樹狀結構,例如:從Windows註冊表遷移到SQLite的應用程序配置
X
|->Y
|->Z
|->SomeKey someValue
W
|->AnotherKey anotherValue
等等。
如何在SQLite(或任何其他數據庫)中建模該結構?如果您有類似問題的經驗,請發郵件。提前致謝。
Baris,這個結構類似於一個目錄/文件結構。 您可以使用一個簡單的父親<>子關係對目錄和鍵值對進行建模。
喜歡的東西
Directory:
id integer auto_increment;
name string not null;
parent_id integer not null default 0;
Property:
id integer auto_increment;
key string;
value string;
directory_id integer not null;
有了這個,你可以通過查看WHERE PARENT_ID = someid和尋找directory_id = someid對性能解決根目錄下搜索與PARENT_ID = 0,子目錄的目錄。
希望這有助於:)如果你想存儲的層次結構由以前的海報提到
在關係數據庫中表示層次結構非常簡單。你只是使用自引用。例如,您有一個類別表,其中有一個名爲ParentCategoryId的字段,該字段爲null(對於葉子類別)或父類別的ID。你甚至可以設置外鍵來執行有效的關係。這種結構很容易在代碼中遍歷,通常是通過遞歸,但是在編寫sql查詢時很痛苦。
註冊表克隆的一種解決方法是使用註冊表鍵值路徑作爲鍵。也就是說,Path中有一個條目是「X/Y/Z/SomeKey」,值是「someValue」。這將更容易查詢,但可能無法按照您喜歡的方式表示層次結構。也就是說,你只有價值而不是層次結構的整體結構。
底線是你必須妥協,將具有未知數量級別的層次結構映射到關係數據庫結構上。
自引用的表都不錯,他們成爲當你開始選擇樹的葉子的吸引力。
您能說明從配置中檢索數據的用例嗎?
您打算一次加載整個配置還是單獨檢索每個參數?
葉節點的深度會有多大?
你用SQLite去的任何特定原因? – R0MANARMY 2010-04-27 15:01:59
我已經對SQLite進行了基準測試並對其進行了審查,並在此應用程序的另一部分中使用它,並使用了自定義和相對較快的C++包裝器。 – 2010-04-27 15:12:44
雖然它可能不是這個特定任務的正確工具。我無法想象性能問題是您轉移到SQLite的原因。 – R0MANARMY 2010-04-27 16:29:43