2010-01-17 83 views
21

我在考慮使用/實施某種形式的嵌入式鍵值(或文件)店爲我的Windows桌面應用程序。我希望能夠存儲各種類型的數據(GPS軌道將是一個例子),當然也能夠查詢這些數據。數據量可能不會全部同時加載到內存中。嵌入式非關係型(NoSQL的)數據存儲

我考慮使用SQLite作爲一個鍵值存儲的存儲引擎,像y-serial東西,但.NET編寫。我還閱讀了關於FriendFeed's usage of MySQL to store schema-less data,這是一個很好的指示如何使用RDBMS的非關係數據。由於其簡單性,可移植性和庫大小,sqlite似乎是一個不錯的選擇。

我的問題是,是否有一個嵌入式非關係存儲任何其他的選擇嗎?它不需要分發,也不需要支持事務,但它必須能夠從.NET訪問,並且它應該有一個小的下載大小。

更新:我發現了一篇名爲SQLite as a Key-Value Database的文章,它將sqlite與Berkeley DB進行了比較,Berkeley DB是嵌入式鍵值存儲庫。

回答

5

個人而言,我會去的SQLite與NHibernate(和流利NHibernate的)。 NHibernate可以爲你的類自動生成數據庫模式,所以你只需要指定你想要保留的類,這對於Fluent NHibernate來說非常簡單。此外,您可以搜索特定的對象,而無需將所有數據加載到內存。

+0

但他想要一個無模式存儲.... – 2010-01-17 15:46:37

+0

阿斯特是正確的:我想避免關係模型。我希望能夠存儲幾乎任何類型的數據,而無需首先爲其準備數據庫模式。另外,如果數據結構稍後改變,那麼擁有嚴格的關係模型可能會產生問題 - 我需要爲存儲中的現有數據編寫SQL更改腳本。 – 2010-01-17 16:03:44

+1

我知道他在找什麼,但像NHibernate這樣的工具在模式生成中幾乎完全隱藏了關係方面。您不需要定義任何模式,只需要爲您定義類的映射(這對Fluent NHibernate來說非常簡單),當您的類更改時,您需要在任何持久性策略中進行某種更新。 – 2010-01-17 16:25:53

19

Windows有一個內置的嵌入式非關係存儲。它被稱爲ESENT,並被多個Windows應用程序使用,包括Active Directory和Windows桌面搜索。

http://blogs.msdn.com/windowssdk/archive/2008/10/23/esent-extensible-storage-engine-api-in-the-windows-sdk.aspx

如果你想.NET訪問,您可以使用CodePlex上的ManagedEsent層。

http://managedesent.codeplex.com/

該項目具有實現key-value存儲實現IDictionary接口PersistentDictionary類,而是由數據庫支持。

+0

@Laurion,我見過ESENT,最初很興奮。唯一的問題是它只有Windows(想想Mono + Linux/Mac)。 – 2010-02-23 12:09:07

2

應用KISS原則,以你的問題,我建議你使用的文件。

由於文件名是關鍵。 文件內容是值。 Windows文件夾是索引。

簡單,快捷,高效,靈活,和萬無一失(提供愚者低智商)。

+0

不錯的方法,儘管我覺得使用文件來存儲值對於簡單的值(例如單個整數)來說有點過分了。 – 2010-02-23 12:06:28

+0

這個問題意味着被存儲的內容可能很大(文檔/太多的數據要加載到內存中)。文件方法的優點之一是,您可以免費獲得一組很好的Stream處理類,這在處理大塊數據時非常有用,並且比將數據分割成任意nMB blob並將其存儲在數據庫。 – 2010-02-24 02:26:15

+2

是的。那麼文件系統的物理限制呢?當記錄數量達到100.000時,這種商店會如何運作?另外:當我談到「太多的數據」時,我的意思是_whole_數據庫 - 我提到這個以避免像對象樹序列化和類似的問題。 – 2010-02-24 17:28:26

1

感謝您的y_serial樣提...更確切地說,它是一個Python模塊:

使用SQLite倉庫Python對象

「序列化+持久性::在幾行代碼,壓縮並將Python對象註釋到SQLite中;然後稍後按關鍵字按順序檢索它們,而不使用任何SQL。數據庫最有用的「標準」模塊可存儲無模式數據。「

http://yserial.sourceforge.net

根據我的經驗,SQLite是比大多數數據庫(包括PostgreSQL與Berkeley DB),爲廣大的項目更快,更可靠的選擇 - 當然,它並不需要一個服務器守護程序。

yserial是很容易實現(和遠快於「文件名是鍵/文件內容是值」的方法;-)

+0

是的,我非常喜歡y-serial的方法,尤其是因爲它使用了sqlite。保持良好的工作!也許當我從其他項目中獲得一些時間時,我會嘗試在C#中執行類似的操作:) – 2010-03-03 18:17:10

2

你可以創建一個有兩列一個簡單的SQLite數據庫:

==documents== 
id|data 

並且數據將是json數據。

您還可以創建一個密鑰表這將是:

==keys== 
keyname|keyvalue|id 

,將鍵名和鍵值,以便快速查找索引。

單個數據庫文件可能是一個集合,您可以爲多個集合創建多個數據庫文件。

你可以使用文件夾爲「DBS」匹配DB->收藏 - >文件

+0

只需注意:您將創建一個模板sqlite數據庫文件,並隨時將其複製以創建新集合。 如果有人想創建一個PHP安裝程序來處理這個問題並開放源代碼,請告訴我。我認爲這會很好,但從來沒有打算自己做。 – RobKohr 2010-04-02 00:01:32

+0

你的建議正朝着y系列如何做的方向發展。你有看到它嗎? http://yserial.sourceforge.net/ – 2010-04-02 15:57:56

+0

不,但我正在尋找一個php解決方案。 – RobKohr 2010-04-02 22:11:23

10

的MongoDB的層次在RavenDB看看。看起來好像它可以嵌入和無模式是與.NET

作品從網站:

  • 擴展的基礎架構:烏鴉建立在現有的頂部,探明和可擴展的基礎設施
  • 簡單的Windows配置:Raven很容易安裝並在windows上以服務或IIS7網站的形式運行
  • 交易:Raven支持System.Transaction與ACID交易。如果你把數據在裏面,這些數據是要呆在那裏
  • 的Map/Reduce:輕鬆定義的map/reduce指標與LINQ查詢
  • .NET客戶端API:烏鴉配備了功能齊全的.NET客戶端API,它實現工作單位等等
  • REST風格:烏鴉是圍繞一個RESTful API
2

這是一個老問題,建,但我想我要補充的情況下,任何人在其上跌倒的答案。我的公司剛剛發佈了一個名爲Nxdb的.NET平臺的開源嵌入式XML數據庫。它在Apache 2.0許可下,並且在內部開發和使用了好幾年。它基本上是綁定到交叉編譯(使用IKVM)版本的BaseX(一個夢幻般的Java XML數據庫)以及嵌入式用例和.NET環境的額外功能。項目頁面在這裏:https://dracorp.assembla.com/spaces/nxdb

XML適用於這種類型的數據存儲,因爲只要您試圖存儲的內容可序列化爲文本,您就可以存儲複雜的分層樹。事實上,如果你直接訪問數據庫,你甚至不需要碰「XML」。它也可以用XQuery查詢,這是一個功能強大且完整的查詢語言。

1

您可以試試這個https://github.com/mdsoftware/mData。小,自由和很不尋常。Lisp-like數據查詢語言,表達式編譯器,高性能二進制序列化,全部包括在內。