2009-11-03 66 views
2

好消息!從4.8版本開始,BerkeleyDB具有c#接口。 BerkeleyDB對我來說是一件非常有趣的事情,因爲它非SQL特性。我知道如果有人想要存儲大量的鍵/值對,這是一個很好的工具。而且我知道'可連接'的桌子。我不知道的是如何使用BerkeleyDB存儲分層數據。一般適用於這個嗎?Hierarhical data and BerkeleyDB

我想幹什麼?我想存儲dmoz.org數據。現在我已經把所有的rdf導入到MySQL數據庫中。但我不需要存儲過程或其他複雜功能。我想使用BerkeleyDB作爲我的在線RSS閱讀器的數據存儲。所以有一個類別樹中的feed(正如我所說的從dmoz導入的類別,我有很多類別,以及feed - 數百萬個)。而且...我忘記了飼料項目。我想用BerkleyDB存儲它們:-)。

這看起來像我必須手動執行所有關係,,,沒關係......但我問的最重要的是速度。我的BerkeleyDB解決方案能否比基於MySQL的解決方案(或者一般的RDBMS)更快?

回答

2

它適用於此,但可能比您願意付出更多的工作。BerkeleyDB是一個非常普通的鍵/值存儲區,因此您只需說「對於鍵X,存儲值Y」 。稍後,您可以說「給我關鍵X的價值」,它會讓您回到Y.這真的是它從高水平做起。它具有非常強大的功能以保證重要的可靠性(稱爲ACID,用於原子性,一致性,隔離性和耐久性),並且性能卓越,但從程序員的角度來看,它是一種簡單的地圖結構。

所以是的,你可以存儲樹木,但你需要爲他們決定一個好的代表。您可以使用整數鍵(確保它們以big-endian字節順序存儲,因爲BDB使用按鍵上的字典順序),並且只需將結構作爲包含兒童整數列表的值。不過,你仍然需要手工編寫所有的遍歷算法。儘管不知道你對分層數據有什麼要求,但很難給出更具體的建議。對於它的作用,Berkeley DB可能無法獲得更快的速度(也就是說,你不會發現更快的速度,尤其是如果你願意犧牲一些ACID屬性的話)。它使您幾乎可以完全控制地圖的界面,因此理論上可以爲您的特定用例構建高度優化的結構。但是,考慮到底層接口,如果你實現了連接,複雜的過濾器查詢或任何種類的非重要查詢語言,你就必須編寫一些非常快速的代碼和算法來跟上這個大問題關係數據庫在那裏。如果你的數據可以用XML來模擬(eugh,但我知道有些人喜歡它),那麼現有的數據庫建立在BDB之上,稱爲BDB XML(也是Sleepycat,現在是Oracle的一部分)。這允許您將任意XML文檔存儲在數據庫中,並對數據庫執行快速的XPath和XQuery查詢。我不認爲有一個官方的.NET API,但我敢肯定,我遇到了一個非官方的.NET綁定。一般來說,除非你有一些非常特殊的要求,現有的解決方案在那裏不允許(這似乎不是你的情況),我建議不要滾動你自己的數據庫(甚至建立在除非你非常熟練地使用高效的算法和代碼優化。如果您要存儲RDF三元組,那麼就有專門的數據庫,甚至關係數據庫也不是特別不適合他們。 BDB XML仍然是一個可行的解決方案。這最終是你的選擇,但如果我是你,我會選擇處理更有趣的問題,而不必處理低級別的數據庫操作(並因此會在我的實際RDF存儲上使用現有包的薄層)。

+0

我已更新我的問題 – 2009-11-03 19:11:36

+0

已更新,以解決該問題:) – copumpkin 2009-11-03 19:31:06

+0

此在線提要閱讀器不只是一個大數據存儲。它具有強大的科學背景(文本處理和知識提取)。所以你認爲MySQL在這種情況下會好嗎? – 2009-11-03 20:03:39

1

分層結構可以使用父或子屬性存儲在鍵值存儲中。

如果您希望父級擁有1個或更多子級,請在每條記錄上使用父級屬性,並讓根節點具有ID​​ 0或其他有意義值的父級。

如果您希望孩子有一個或多個父母,請在每條記錄上使用一個孩子屬性。

如果您希望節點可能有多個父母,並且孩子使用單獨的表來存儲關係。

這樣,您可以通過查詢具有特定父代或子代的節點遍歷樹。

+0

因此,總之,我必須手動實現關係?速度如何? – 2009-11-03 19:13:23

+0

是的,但這是所有RDBMS的方式。如果您在關係列上使用索引,那麼它只是一個索引行查詢,所以只要您不是一直遍歷整個層次結構,性能就應該很好。 – 2009-11-03 21:30:19

+0

給你+1。謝謝! – 2009-11-04 07:38:25

相關問題