LiteDBはSQLを書かずにC#のマネージドオブジェクトとして扱えるデータベースです。
アプリケーションのバックエンドに良さそうなので試してみました。
プロジェクトの作成
mkidr LiteDBSample
cd LiteDBSample
dotnet new console -f net8.0
dotnet add package LiteDB
サンプルコード
using LiteDB;
namespace LiteDBSample;
public class LiteDbKeyValueStore<TValue> : IDisposable
{
private readonly LiteDatabase _db;
private readonly ILiteCollection<Entry> _collection;
public LiteDbKeyValueStore(string dbPath = "kvstore.db")
{
_db = new LiteDatabase(dbPath);
_collection = _db.GetCollection<Entry>("kv_" + typeof(TValue).Name.ToLower());
_collection.EnsureIndex(x => x.Key, true);
}
private record Entry
{
[BsonId]
public string Key { get; set; } = string.Empty;
public TValue? Value { get; set; } = default;
}
public void Set(string key, TValue value)
{
_collection.Upsert(new Entry { Key = key, Value = value });
}
public TValue? Get(string key)
{
var entry = _collection.FindById(key);
return entry is null ? default : entry.Value;
}
public bool ContainsKey(string key)
{
return _collection.Exists(x => x.Key == key);
}
public bool Remove(string key)
{
return _collection.Delete(key);
}
public void Clear()
{
_collection.DeleteAll();
}
public void Dispose()
{
_db.Dispose();
}
}
class Program
{
static void Main()
{
using var db = new LiteDbKeyValueStore<int>();
for (int i = 0; i < 5; i++)
{
string key = $"key_{i}";
int val = i;
db.Set(key, val);
}
string key1 = "key_1";
if (db.ContainsKey(key1))
{
int val1 = db.Get(key1);
Console.WriteLine($"{key1}: {val1}");
// key_1: 1
}
Console.WriteLine("");
db.Remove(key1);
for (int i = 0; i < 5; i++)
{
string key2 = $"key_{i}";
if (db.ContainsKey(key2))
{
int val2 = db.Get(key2);
Console.WriteLine($"{key2}: {val2}");
}
}
// key_0: 0
// key_2: 2
// key_3: 3
// key_4: 4
db.Clear();
}
}
感想
LiteDBはファイルベースのスタンドアロンのデータベースで、そのカテゴリではSQLiteが有名です。
SQLiteは色々なプログラミング言語に対応していてSQLを使うデータベースですが、LiteDBは多分C#専用でSQLを書かずにデータベースを操作する点が特徴です。
SQLを使うタイプのデータベースの場合、取得したデータをプログラミング言語下の変数に代入する作業が必要になり、定型的な処理ですのでORMを使うことがあります。
その点LiteDBはデータベースから取得したデータが、C#のオブジェクトを取得できる分、コードがシンプルになる点がメリットだと思います。
SQLiteほどの機能は無いと思いますが、サンプルコードのように重複しないキーがありそれに紐づくデータを永続化させたい場合など、シンプルなデータ構造の場合LiteDBの真価が発揮される用途だと考えます。
コメント