在POC或迷你專案中使用 LiteDB

enter image description here
3/24,我發了篇FB貼文,提到我很久沒有在撰寫範例的時候使用關聯式資料庫了。這不是因為關聯式資料庫不好,而是使用場景和情境的問題。

大部分的教學文章或範例,為求讓主題專注不要失焦,我會讓範例盡可能地簡單。例如,用Console App 取代 Web 架構,用file取代DB。這樣學員的進入障礙會再降低一點,畢竟,我們不能假設每一位學員都對MVC框架或是資料庫存取的ORM有認識。

那篇貼文得到不少迴響,其中有位讀者建議,也可以考慮用 LiteDB,我當時回覆說我會找個時間來試試看。既然說了出口,肯定是必須要測試一下的。

LiteDB

技術上來說,LiteDB 是一個嵌入式的 NoSQL 資料庫,特別是針對 .NET 開發者設計。其本質上是一個檔案,但它提供了類似於傳統關聯式資料庫管理系統的功能,包括存儲、檢索、更新和刪除資料操作。LiteDB 以單一檔案的形式儲存在專案資料夾中,這使得它非常適合於輕量級應用。不管是desktop app、mobile app或任何需要資料庫但又不希望安裝重量級資料庫伺服器的情境,都很適合。

你只需要針對專案安裝 NuGet 套件就可以使用:

dotnet add package LiteDB 

不需要伺服器、不用管帳號密碼、可以跨平台,所有的資料都存儲在單一檔案,便於管理和分發、佈署。簡單的說,當我寫好範例,在裡面放一些資料,丟上GitHub,你不管在哪一個平台(Windows, Linux),Clone下來之後,無須任何配置、設定,就可使用,資料也不會消失,無須重建。

確實,這對做範例非常方便。

你可以看看我在GitHub上的這個範例:

git clone https://github.com/isdaviddong/TestLiteDB.git

下載下來之後,無須任何設定,直接 dotnet run 就可以執行:
圖片

專案中,包含了一個MyData.db檔案,就是資料庫實際儲存的位置:
圖片
你可以透過底下這樣的程式碼,即可使用:

var db = new LiteDatabase("MyData.db")
var col = db.GetCollection<Person>("persons");

其中的Person類別可以視為資料表的設計:

public class Person
{
    public int Id { get; set; }
    public string? Name { get; set; }
    public int Age { get; set; }
    public string? Address { get; set; }
}

然後,你要新增資料,只需要:

var ret = col.Insert(person);

要刪除,只需要

var result = col.Delete(id);

要用LINQ查詢,也沒問題:

 // 使用LINQ查詢
 var result = from c in col.FindAll() where c.Name.Contains(word) select c;
 Console.WriteLine($"\n找到{result.Count()}筆資料.\n");

 foreach (var item in result)
 {
     Console.WriteLine($"編號: {item.Id} 人員:{item.Name}, 年齡:{item.Age}, address:{item.Address}");
 }

簡單試用了一下,我覺得,很可以啊!👍

確實,他讓資料儲存變得非常簡單,大致符合我的需求。無須建立資料庫或資料表,只需要宣告個類別,然後LiteDB會自動把這個類別當做資料表,所有的資料存取會自動儲存在一個附檔名為.db的檔案中,這樣很方便交付給學員測試。

而且在資料存取的過程中,用的語法是很單純的C#和LINQ,資料的新增、刪除、查詢…方式,就如同一般我們對 C# 中的集合物件操作類似,如此一來,也隔離開了傳統關聯式資料庫所需要對 ORM 或 SQL語法的倚賴,符合我對範例需要專注在單一一個議題盡量不要失焦的要求。

總的來說,LiteDB確實是一個非常適合範例或輕量級專案或開發POC時的需求,值得大家參考使用。在我的 Github 上就有簡單的使用範例,不妨下載下來運行看看:
https://github.com/isdaviddong/TestLiteDB.git


後記:
許多網友也提到,LiteDB使用在測試或POC專案可以收到快速開發的效果,但正式環境戶多執行緒、多用戶同時使用時,可能會造成資料存取異常,使用時也請注意唷。

留言

這個網誌中的熱門文章

精彩(且驚人)的Semantic Kernel入門範例

使用LM Studio輕鬆在本地端以API呼叫大語言模型(LLM)

VS Code的字體大小

專業的價值...

使用AI(ChatGPT)對PR進行自動化 Code Reivew