LiteDB

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 19:49, 21 июня 2020.
LiteDB
LiteDB icon.png
LiteDB-main window.png
LiteDB version 0.5.2.0
Создатели: Maurício David
Разработчики: LiteDB team
Выпущена: August 2014; 6 years ago (2014-08)
Постоянный выпуск: 5.0.8 / 13 May 2020 года; 2 months ago (2020-05-13)
Состояние разработки: Активное
Написана на: C#
Операционная система: Linux, Windows, iOS, Android (Операционные Системы)
Размер дистрибутива: 706.9 KB
Локализация: Английская
Тип ПО: СУБД
Лицензия: MIT License
Веб-сайт www.litedb.org

LiteDB - это кроссплатформенная нереляционная база данных с открытым исходным кодом. LiteDB представляет собой бессерверную базу данных, поставляемую в виде одной небольшой DLL. LiteDB полностью написана на C#, что дает ей возможность работать на любой платформе, поддерживающей .NET Framework. LiteDB - это простая, быстрая и легкая встроенная база данных. Создатели LiteDB были вдохновлены базой данных MongoDB, поэтому ее API очень похож на официальный .NET API MongoDB. Разработчики рекомендуют использовать LiteDB для мобильных, локальных приложений и веб-сервисов. [Источник 1]

Особенности

  • Одна база данных на одного пользователя/аккаунт;
  • Поддержка портативной универсальной платформы Windows (UWP);
  • ACID операции;
  • Один файл данных (как в SQLite);
  • Восстановление данных при сбое записи (WAL mode);
  • Хранение файлов и потоковых данных (как GridFS в MongoDB);
  • Поддержка LINQ запросов;
  • Бесплатное использование даже в коммерческих целях.

Как работает LiteDB

Файловый формат

LiteDB работает со многими типами информации, такими как индексы, коллекции, документы. Для управления этой информацией LiteDB реализует страничный концепт базы данных. Страница - это блок информации одного типа размером 4096 байт. Также страница - это минимальная операция чтения / записи на диске. Есть 6 типов страниц:

  • Страница заголовка (Header Page): содержит информацию о базе данных, такую ​​как версия, размер файла данных и указатель на свободные страницы. Это первая страница в базе данных (PageID = 0).
  • Страница коллекции (Collection Page): каждая коллекция использует одну страницу и содержит всю информацию о коллекции, такую как имя, индексы, указатели и параметры. Все коллекции связаны друг с другом двусвязным списком.
  • Страница индекса (Index Page): используется для хранения узлов списка индексов. В LiteDB реализован список с пропусками, поэтому каждый узел имеет ключ и ссылку на уровень, указывающую на другой узел списка индексов.
  • Страница данных (Data Page): Страница данных содержит блоки данных. Каждый блок данных представляет документ, сериализованный в формате BSON. Если документ превышает одну страницу, блок данных использует ссылку, указывающую на расширенную страницу.
  • Расширенная страница (Extend Page): большие документы, которым требуется более одной страницы, сериализуются в несколько расширенных страниц. Расширенные страницы двусвязные и создают один блок данных для хранения документа. Каждая расширенная страница содержит только один документ или часть документа.
  • Пустая страница (Empty Page): когда страница любого типа удаляется из списка, она становится пустой страницей. Эта пустая страница будет использована при запросе новой страницы и преобразуется к требуемому типу.

Каждая страница имеет собственный заголовок и контент. Заголовок используется для управления общей структурой данных, такой как PageID, PageType, Free Space. Контент реализуется по-разному у разных типов страниц. [Источник 2]

Свободное пространство страниц

Страницы индекса и страницы данных содержат набор элементов (узлы списка индексов и блоки данных). Эти страницы могут хранить информацию и сохранять доступное пространство для дальнейшего заполнения. Для этого в LiteDB реализован список свободных страниц. Список свободных страниц - это двусвязный список страниц, отсортированный по доступному пространству. Когда базе данных нужна страница для хранения данных, используется этот список для поиска первой доступной страницы. После этого PagerService исправляет порядок страниц или удаляет их из списка, если на странице больше нет места.

Модели данных

Структуры данных

LiteDB хранит данные в виде документов, которые представляют собой JSON-подобные пары полей и значений. Каждый документ одновременно содержит данные и структуру. Рассмотрим пример:

{
    _id: 1,
    name: { first: "John", last: "Doe" },
    age: 37,
    salary: 3456.0,
    createdDate: { $date: "2014-10-30T00:00:00.00Z" },
    phones: ["8000-0000", "9000-0000"]
}
  • Поле _id содержит основной ключ документа - его уникальное значение в коллекции;
  • Поле name содержит встроенный документ с двумя строковыми полями;
  • Поле age содержит целое значение Int32;
  • Поле salary содержит вещественное значение типа Double;
  • Поле createDate содержит значение DateTime;
  • Поле phones содержит массив строк.

LiteDB хранит документы в коллекциях. Коллекция - это группа связанных документов, имеющих набор общих индексов. Коллекции аналогичны таблицам в реляционных базах данных.

BSON

LiteDB хранит документы в формате данных BSON (Binary JSON). BSON - это двоичное представление JSON с дополнительной информацией о типе данных. В документах значением поля может быть любой из типов данных BSON, включая другие документы, массивы и массивы документов. BSON - это быстрый и простой способ сериализации документов в двоичном формате. LiteDB использует только подмножество типов данных BSON. В таблице ниже представлены все поддерживаемые LiteDB типы данных BSON и их эквиваленты в .NET.

Соответствие BSON и .NET типов данных
Тип BSON Тип .NET
MinValue -
Null Любой .NET объект со значением null
Int32 System.Int32
Int64 System.Int64
Double System.Double
Decimal System.Decimal
String System.String
Document System.Collection.Generic.Dictionary<string, BsonValue>
Array System.Collection.Generic.List<BsonValue>
Binary System.Byte[]
ObjectId LiteDB.ObjectId
Guid System.Guid
Boolean System.Boolean
DateTime System.DateTime
MaxValue -

DateTime

Тип DateTime в BSON хранится с точностью до миллисекунд без свойства DateTimeKind, которое показывает, в каком формате (местном или UTC) записано время. Поэтому все значения типа DateTime преобразуются в UTC при загрузке и конвертируются обратно в местное время при извлечении.

Расширенный JSON (JSON Extended)

LiteDB использует расширенную версию JSON, чтобы не потерять информацию типа BSON, которой нет в JSON. Расширенный тип данных представляется как вложенный документ: после символа "$ " записывается ключ и его значение в виде строки.

LiteDB реализует JSON в своем статическом классе JsonSerializer. Сериализация и десериализация допускается только для значений типа BsonValues. Если вы хотите преобразовать тип вашего объекта в BsonValue, вам нужно использовать класс BsonMapper:

var customer = new Customer { Id = 1, Name = "John Doe" };
var doc = BsonMapper.Global.ToDocument(customer);
var jsonString = JsonSerialize.Serialize(doc, pretty, includeBinaryData);

Класс JsonSerialize также поддерживает TextReader и TextWriter для ввода/вывода напрямую из файла или потока.

ObjectId

ObjectId это 12-битный тип BSON, хранящий следующую информацию:

  • Timestamp: значение, представляющее секунды с начала эпохи UNIX (4 байта)
  • Machine: идентификатор машины (3 байта)
  • Pid: идентификатор процесса (2 байта)
  • Increment: счетчик, начинающийся со случайного значения (3 байта)

В LiteDB документы хранятся в коллекциях, для которых требуется уникальное поле _id, которое выступает в качестве основного ключа. Поскольку значения ObjectId малы, скорее всего, уникальны и быстро генерируются, LiteDB использует ObjectId в качестве значения по умолчанию для поля _id, если поле _id не указано. В отличие от типа данных Guid, значения типа ObjectId являются последовательными, поэтому это лучшее решение для индексации. ObjectId использует шестнадцатеричные числа, представленные в виде строк. [Источник 3]

Работа с LiteDB

Установка

LiteDB бессерверная база данных, поэтому процесс установки не предусмотрен. Достаточно скопировать файл LiteDB.dll в папку Bin и добавить ссылку на него. Также можно установить LiteDB, используя систему управления пакетами NuGet с помощью следующей команды:

Install-Package LiteDB

Если вы работаете в веб-среде, убедитесь, что у вашего пользователя IIS есть разрешение на запись в папку данных. [Источник 4]

Работа с файлами

Для работы с файлами используется класс FileStorage:

// Загрузите файл из файловый системы в базу данных
db.FileStorage.Upload("my-photo-id", @"C:\Temp\picture-01.jpg");

// И скачайте его позднее
db.FileStorage.Download("my-photo-id", @"C:\Temp\copy-of-picture-01.jpg");

Создание структур данных

LiteDB поддерживает классы POCO для строгой типизации документов. POCO (Plain Old CLR Object) - это простой объект, созданный в среде Common Language Runtime (CLR) в .NET Framework и свободный от наследования или атрибутов. [Источник 5] Когда вы получаете экземпляр LiteCollection из LiteDatabase.GetCollection <T>, <T> будет вашим типом документа. Если <T> не является BsonDocument, LiteDB преобразует ваш класс в BsonDocument. Для этого LiteDB использует класс BsonMapper:

// Простой строго типизированный документ
public class Customer
{
    public ObjectId CustomerId { get; set; }
    public string Name { get; set; }
    public DateTime CreateDate { get; set; }
    public List<Phone> Phones { get; set; }
    public bool IsActive { get; set; }
}

var typedCustomerCollection = db.GetCollection<Customer>("customer");

var schemelessCollection = db.GetCollection("customer"); // <T> это BsonDocument

Коллекции

Документы хранятся в коллекциях. LiteCollection - это универсальный класс для управления коллекциями в LiteDB. Каждая коллекция должна иметь уникальное имя. Коллекции создаются автоматически при первой операции вставки (Insert) или операции EnsureIndex. Выполнение запроса, удаление или обновление документа в несуществующей коллекции не создает его. LiteCollection <T> - это универсальный класс, который можно использовать с новым типом <T> в качестве BsonDocument. LiteDB неявно преобразует тип <T> в BsonDocument, и все операции будут использовать этот созданный документ. [Источник 6]

// Строго типизированный класс
using(var db = new LiteDatabase("mydb.db"))
{
    // Получить экземпляр коллекции
    var col = db.GetCollection<Customer>("customer");
    
    // Вставка документа в коллекцию (если не существует, создать новую)
    col.Insert(new Customer { Id = 1, Name = "John Doe" });
    
    // Создание, если не существует, нового индекса по полю Name
    col.EnsureIndex(x => x.Name);
    
    // Поиск документа
    var customer = col.FindOne(x => x.Name == "john doe");
}

Пример работы

Еще один небольшой пример, как хранить и искать документы:

// Создание вашего POCO класса
public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string[] Phones { get; set; }
    public bool IsActive { get; set; }
}

// Открываем базу данных (или создаем, если она не существует)
using(var db = new LiteDatabase(@"C:\Temp\MyData.db"))
{
    // Получаем коллекцию (или создаем, если не существует)
    var col = db.GetCollection<Customer>("customers");

    // Создаем новый экземпляр класса 
    var customer = new Customer
    { 
        Name = "John Doe", 
        Phones = new string[] { "8000-0000", "9000-0000" }, 
        IsActive = true
    };
	
    // Вставить новый документ (идентификатор будет автоматически увеличен)
    col.Insert(customer);
	
    // Обновить документ внутри коллекции
    customer.Name = "Joana Doe";
	
    col.Update(customer);
	
    // Индексировать документ, используя свойство документа Name
    col.EnsureIndex(x => x.Name);
	
    // Использовать LINQ для запроса документов
    var results = col.Find(x => x.Name.StartsWith("Jo"));

    // Создание индекса в телефонных номерах. Это мультиключевой индекс
    col.EnsureIndex(x => x.Phones, "$.Phones[*]"); 

    // и теперь мы можем запросить телефоны
    var r = col.FindOne(x => x.Phones.Contains("8888-5555"));
}

Источники

  1. Официальный сайт LiteDB [Электронный ресурс] — URL: https://www.litedb.org/ (дата обращения: 12.05.2020)
  2. Как работает LiteDB //Официальная документация по LiteDB [Электронный ресурс] — URL: https://github.com/mbdavid/LiteDB/wiki/How-LiteDB-Works/ (дата обращения: 07.06.2020)
  3. Структуры данных //Официальная документация по LiteDB [Электронный ресурс] — URL: https://github.com/mbdavid/LiteDB/wiki/Data-Structure/ (дата обращения: 03.06.2020)
  4. Начало работы //Официальная документация по LiteDB [Электронный ресурс] — URL: https://github.com/mbdavid/LiteDB/wiki/Getting-Started/ (дата обращения: 03.06.2020)
  5. POCO Support // Документация Microsoft [Электронный ресурс] — URL: https://docs.microsoft.com/en-us/dotnet/framework/wcf/samples/poco-support?redirectedfrom=MSDN/ (дата обращения: 07.06.2020)
  6. Collections//Официальная документация по LiteDB [Электронный ресурс] — URL: https://github.com/mbdavid/LiteDB/wiki/Collections/ (дата обращения: 07.06.2020)