今天給大家介紹一個不錯的小巧輕量級的nosql檔案資料庫litedb。本部落格在2013年也介紹過2款.net平台的開源資料庫:
上面2個資料庫我的實際的項目中用過,還不錯。當然資料量很小,主要是客戶比較變态,必須要用xml檔案儲存,就想到了,另外ndatabase隻是自己覺得好玩,也用了一下。
提示:沒有x86,x64之分,可以anycpu使用。4.5版本也可以使用,如果需要專門的4.5版本,可以自己編譯,另外mono的問題,官方沒有提到,應該是暫時不支援,自己也沒有環境,不好測試,希望有環境的朋友,可以用簡單代碼測試一下。
主要特點有(翻譯官方介紹,如有不準确,請指正):
1.nosql檔案存儲。這是和傳統關系型資料庫的主要差別;支援實體類的字段更新;
2.類似mongodb的簡單api;
3.完全使用c#代碼,在.net 4.0環境下編寫,核心dll小巧,隻有168k;
4.支援acid事務處理;
5.可以進行寫入失敗的恢複;
6.存儲到檔案或者資料流中(類似mongodb的gridfs);
7.類似sqlite的單一檔案存儲;
8.支援檔案索引,可以進行快速搜尋;可以直接存儲檔案;
9.支援linq查詢;【這也許是c#編寫最直接的好處】;
10.支援指令行操作資料庫,官方提供了一個shell command line;
11.完全開源和免費,包括商業使用;
雖然小巧,但也不是萬能的,litedb給出了幾個可能或者比較适合使用的場景。大家可以根據實際情況進行或者根據需要進行測試,看是不是自己需要的:
1.桌面或者本地小型的應用程式
2.小型web應用程式
3.單個資料庫賬戶或者單個使用者資料的存儲
4.少量使用者的并發寫操作的應用程式
上面隻是基本介紹,先從搞一個簡單的案例介紹如何使用。大家可以感覺一下。如果要具體使用,就好好研究下官方的檔案。本文下面幾節也将大概介紹一下litedb的相關原理和技術細節。有空我會做一個大資料下的測試,看看如何。這裡隻是為了介紹給大家研究而已。
為了例子需要,我們建立一個簡單的實體類,如下面所示,隻包括幾個基本的屬性資訊。
使用過程首先要添加dll應用,以及引入命名空間:
下面是測試代碼,會在目前目錄下建立一個sample.db的資料庫檔案:
上述過程很清楚,根據注釋了解幾乎不用費神。
例子的使用簡單,但其實還不夠全面,本節就稍微翻譯一下litedb官方提供的一些技術資料和文檔。讓你對litedb更加了解和易于使用。
litedb是雖然單個檔案類型的資料庫,但是資料庫有很多資訊,例如索引,集合,檔案等。為了管理這些資訊,litedb實作了資料庫頁的概念。頁 是一個擁有4096 位元組的 存儲相同資訊的位址塊。頁 也是操作磁盤檔案(讀寫)的最小單元。litedb有6種頁類型。其作用也不一樣,分布是:header page,collection page,index page, data page,extend page,empty page。鑒于篇幅較大,這裡隻介紹重要的data page。其他幾個頁面的作用看檔案也很容易。data page的作用是存儲核心的資料,是以序列化後的bson格式來存儲。值得注意的是,如果存儲的資料太大,超過page大小,資料塊就會使用一個指針指向extend page。
在上面的代碼中,我們初始化資料庫是這樣的:
這種情況比較好用,可以打開或者建立新的資料庫,同樣也可以使用連接配接名稱來擷取,例如:
這樣會直接從connectionstrings找到這個名稱的連接配接。包括了檔案名稱,使用模式,以及版本資訊。一般情況下直接使用第一種即可。
litedb的資料庫連接配接完整形式是:filename=c:\path\mydb.db; journal=false; version=5
litedb的查詢必須在相關的查詢字段上使用索引,如果沒有索引,會預設去建立索引。上面例子中就是建立字段的索引,并查詢。litedb中查詢有2種方法:
1.使用靜态的幫助類query;<code></code>
2.使用linq方式,就是類似demo的方法;
litedb使用query的查詢方式有以下一些方法,詳細講解幾個重要的,其他幾個大家了解一下,也應該不難,如果有不準确的地方,還請指正:
query.all 傳回所有的資料,可以使用指定的索引字段進行排序
query.eq 查找傳回和指定字段值相等的資料
query.lt/lte 查找< 或 <= 某個值的資料
query.gt/gte 查找> 或 >= 某個值的資料
query.between 查找在指定區間範圍内的資料
query.in - 和sql的in類似吧,查找和清單中值相等的資料
query.not - 和eq相反,是不等于某個值的資料
query.startswith 查找以某個字元串開頭的資料
query.contains 查找保護某個字元串的資料,這個查詢隻掃描索引
query.and 2個查詢的交集
query.or 2個查詢結果的并集
看看實際代碼:
如圖,文法是左邊是字段,右邊是值。注意litedb不支援這種表達式:creationdate == duedate。
下面介紹使用linq的查詢的幾個主要方法:
findall: 查找表或者集合中所有的結果記錄 findone:傳回第一個或者預設的結果 findbyid: 通過索引傳回單個結果 find: 使用查詢表達式或者linq表達式查詢傳回結果
看看幾個例子:
當然還有一些方法如:count() , exists(),min() , max()等方法。。比較好了解。看看linq表達式的查詢案例:
litedb的介紹就基本完成了,實際還有很多技術細節在官方文檔中。比較簡單也好了解,不再翻譯。這裡提供一個2015年5月25日下載下傳的源碼版本和例子源代碼。
同樣,官方沒有提供離線版的chm文檔,我手動制作了一份,提供下載下傳,如下圖:
特别提醒:幫助檔案chm打開顯示不了請右鍵,屬性,解除鎖定。。。路徑,檔案名都不能含有特殊字元,否則也不能打開。。常見問題,有網友問起,提醒一下。
