Siaqodb

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 16:38, 21 января 2019.
Siaqodb
Siaqodb.svg
SiaqodbManager.svg
Скриншот менеджера управления базой данных
Создатели: Siaqodb
Разработчики: CCSTM Computing LLC
Выпущена: 3 November 2012 года; 7 years ago (2012-11-03)
Постоянный выпуск: 5.5.0.11 / 15 January 2018 года; 2 years ago (2018-01-15)
Предыдущий выпуск: 5.5.0.10 rc / 20 September 2017 года; 2 years ago (2017-09-20)
Состояние разработки: Активное
Написана на: C# .NET
Операционная система: Windows, Android, macOS, iOS
Локализация: Английский
Тип ПО: NoSQL (embedded)
Лицензия: Apache 2.0 License
Веб-сайт www.siaqodb.com

Siaqodb - это встраиваемая NoSQL база данных для создания объектов и документов. В настоящее время работает на платформах .NET, MonoMac, Universal Windows Platform (UWP), Xamarin.iOS, Xamarin.Android, Xamarin.Mac и Unity3D. [Источник 1]

Основные особенности

Кросс-платформенная NoSQL база данных

В настоящее время работает на платформах :

  • .NET
  • MonoMac
  • Universal Windows Platform (UWP)
  • Xamarin.iOS
  • Xamarin.Android
  • Xamarin.Mac
  • Unity3D

Синхронизация

База данных клиентской базы Siaqodb может быть синхронизирована с следующими базами данных Cloud / Server:

Особенности

  • ObjectDB и DocumentDB - объекты графа могут храниться отдельно или как единое целое.
  • Полностью на API ASYNC
  • ACID-транзакции - использует мощный механизм хранения: LMDB
  • Малый размер без дополнительных зависимостей
  • Встроенная или плавная поддержка шифрования
  • SiaqodbManager - управление сохраненными данными, запуск специальных запросов LINQ

Для разработчиков

  • Полный провайдер LINQ
  • Полная поддержка POCO
  • Поддержка портативной библиотеки классов
  • Частичная загрузка объектов и быстрая загрузка объектов
  • Может хранить полные графические объекты, массивы, списки, словари и т.д.
  • Thread Safe - полная поддержка приложений на основе ASP.NET
  • Отличная производительность - в сравнении с RavenDB или с SQLite

Сравнение Siaqodb и SQLite

Исследование скорости выполнения операций

Для сравнения двух баз данных необходимо определить объект, с которым нужно работать: [Источник 2]

 1 public class MyEntity
 2 {
 3     [SQLite.AutoIncrement, SQLite.PrimaryKey]
 4     public int OID { get; set; }
 5     public int IntValue { get; set; }
 6     public string StringValue { get; set; }
 7     public DateTime DateTimeValue { get; set; }
 8     public Guid GuidValue { get; set; }
 9     public double DoubleValue { get; set; }
10 }

Сравнения по скорости выполнения операций в двух базах данных будет производиться по четырем основным операциям:

  • INSERT
  • UPDATE
  • READ
  • DELETE

Код операции INSERT:

 1 public static void Insert()
 2 {
 3     var entities = GetEntities().ToArray();
 4     using (Siaqodb siaqodb = new Siaqodb())
 5     {
 6         siaqodb.Open(siaqodbPath, 100 * OneMB, 20);
 7         Console.WriteLine("InsertSiaqodb...");
 8         var stopwatch = new Stopwatch();
 9         stopwatch.Start();
10         for (int i = 0; i < ENTITY_COUNT; i++)
11         {
12             siaqodb.StoreObject(entities[i]);
13         }
14         stopwatch.Stop();
15         Console.WriteLine("InsertSiaqodb took:" + stopwatch.Elapsed);
16     }
17 
18     using (var dbsql = new SQLite.SQLiteConnection(sqLitePath))
19     {
20         dbsql.CreateTable();
21         Console.WriteLine("InsertSQLite...");
22         var stopwatch = new Stopwatch();
23         stopwatch.Start();
24         for (int i = 0; i < ENTITY_COUNT; i++)
25         {
26             dbsql.Insert(entities[i]);
27         }
28         stopwatch.Stop();
29         Console.WriteLine("InsertSQLite took:" + stopwatch.Elapsed);
30     }
31 }

Имеем следующий результат для ENTITY_COUNT = 1000 и 10000:

Рисунок 1 - Результат работы операции INSERT

Теперь сравним операцию UPDATE. Код операции:

 1 public static void Update()
 2 {
 3     using (Siaqodb siaqodb = new Siaqodb())
 4     {
 5         siaqodb.Open(siaqodbPath, 100 * OneMB, 20);
 6         var all = siaqodb.LoadAll();
 7         Console.WriteLine("UpdateSiaqodb...");
 8         var stopwatch = new Stopwatch();
 9         stopwatch.Start();
10         foreach(MyEntity en in all)
11         {
12             en.IntValue++;
13             siaqodb.StoreObject(en);
14         }
15         stopwatch.Stop();
16         Console.WriteLine("UpdateSiaqodb took:" + stopwatch.Elapsed);
17     }
18 
19     using (var dbsql = new SQLite.SQLiteConnection(sqLitePath))
20     {
21         var all = dbsql.Query("select * from MyEntity");
22         Console.WriteLine("UpdateSQLite...");
23         var stopwatch = new Stopwatch();
24         stopwatch.Start();
25         foreach (MyEntity en in all)
26         {
27             en.IntValue++;
28             dbsql.Update(en);
29         }
30         stopwatch.Stop();
31         Console.WriteLine("UpdateSQLite took:" + stopwatch.Elapsed);
32     }
33 }

Имеем результат для ENTITY_COUNT = 1000 и 10000:

Рисунок 2 - Результат работы операции UPDATE

Сравнение операции READ. Код операции:

 1 public static void Read()
 2 {
 3     using (Siaqodb siaqodb = new Siaqodb())
 4     {
 5         siaqodb.Open(siaqodbPath, 100 * OneMB, 20);
 6         Console.WriteLine("ReadAllSiaqodb...");
 7         var stopwatch = new Stopwatch();
 8         stopwatch.Start();
 9         var all = siaqodb.LoadAll();
10         stopwatch.Stop();
11         Console.WriteLine("ReadAllSiaqodb took:" + stopwatch.Elapsed);
12     }
13 
14     using (var dbsql = new SQLite.SQLiteConnection(sqLitePath))
15     {
16         Console.WriteLine("ReadAllSQLite...");
17         var stopwatch = new Stopwatch();
18         stopwatch.Start();
19         var all = dbsql.Query("select * from MyEntity");
20         stopwatch.Stop();
21         Console.WriteLine("ReadAllSQLite took:" + stopwatch.Elapsed);
22     }
23 }

Имеем результат для ENTITY_COUNT = 1000 и 10000:

Рисунок 3 - Результат операции READ

Сравнение операции DELETE. Имеем следующий код:

 1 public static void Delete()
 2 {
 3     using (Siaqodb siaqodb = new Siaqodb())
 4     {
 5         siaqodb.Open(siaqodbPath, 100 * OneMB, 20);
 6         Console.WriteLine("DeleteSiaqodb...");
 7         var all = siaqodb.LoadAll();
 8         var stopwatch = new Stopwatch();
 9         stopwatch.Start();
10         foreach(MyEntity en in all)
11         {
12             siaqodb.Delete(en);
13         }
14         stopwatch.Stop();
15         Console.WriteLine("DeleteSiaqodb took:" + stopwatch.Elapsed);
16     }
17 
18     using (var dbsql = new SQLite.SQLiteConnection(sqLitePath))
19     {
20         Console.WriteLine("DeleteSQLite...");
21         var all = dbsql.Query("select * from MyEntity");
22         var stopwatch = new Stopwatch();
23         stopwatch.Start();
24         foreach (MyEntity en in all)
25         {
26             dbsql.Delete(en);
27         }
28         stopwatch.Stop();
29         Console.WriteLine("DeleteSQLite took:" + stopwatch.Elapsed);
30     }
31 }

Имеем результат для ENTITY_COUNT = 1000 и 10000:

Рисунок 4 - Результат операции DELETE

Вывод

Из приведенных выше данных по скорости обработки четырех основных команд можно сделать вывод о том, что Siaqodb работает гораздо быстрее чем SQLite. [Источник 2]

Сравнение Siaqodb и RavenDB

Исследование скорости выполнения операций

Для сравнения двух баз данных необходимо определить сущность, с которым нужно работать: [Источник 3]

1 public class MyEntity
2 {
3 	public string Id { get; set; }
4 	public int IntValue { get; set; }
5 	public string StringValue { get; set; }
6 	public DateTime DateTimeValue { get; set; }
7 	public Guid GuidValue { get; set; }
8 	public double DoubleValue { get; set; }
9 }

Далее для тестирования были сгенерированы объекты по 10k и 100k штук:

 1 public static void GenerateEntities()
 2 {
 3     var random = new Random(DateTime.Now.Millisecond);
 4     for (int i = 0; i < ENTITY_COUNT; i++)
 5     {
 6         entities.Add(new MyEntity
 7             {
 8                 Id = Guid.NewGuid().ToString(),
 9                 IntValue = random.Next(),
10                 DoubleValue = random.NextDouble(),
11                 StringValue = Guid.NewGuid().ToString(),
12                 DateTimeValue = new DateTime(random.Next(1999, 2015), random.Next(1, 12), random.Next(1, 28)),
13                 GuidValue = Guid.NewGuid()
14             }
15         );
16     }
17 }

В результате имеем скорости работы основных операции для двух баз данных. Операция INSERT для 10K и 100K документов. Результат выполнения операции:

Рисунок 5 - Результат выполнения операции INSERT

Операция READ для 10K и 100K документов. Результат выполнения операции:

Рисунок 6 - Результат выполнения операции READ

Операция READ с помощью первичных ключей для 10K и 100K документов. Результат выполнения операции:

Рисунок 7 - Результат выполнения операции INSERT с помощью первичных ключей

Операция READ с помощью вторичного индекса 10K и 100K документов. Результат выполнения операции:

Рисунок 8 - Результат выполнения операции INSERT c помощью вторичного индекса

Операция UPDATE для 10K и 100K документов. Результат выполнения операции:

Рисунок 9 - Результат выполнения операции UPDATE

Операция DELETE для 10K и 100K документов. Результат выполнения операции:

Рисунок 10 - Результат выполнения операции DELETE

Вывод

Из приведенных выше данных по скорости обработки основных команд можно сделать вывод о том, что Siaqodb работает гораздо быстрее чем RavenDB. [Источник 3]

Начало работы

Установка

Самый простой способ начать работу с Siaqodb - это использовать пакет nuget . На странице пакета будут представлены сведения об использовании nuget. Вы также можете вручную загрузить весь пакет со страницы загрузки сайта Siaqodb . После того, как вы загрузите ZIP-файл, просто разархивируйте его и поместите содержимое в любом месте (Примечание: на некоторых системах Windows по умолчанию все файлы .zip блокируются, чтобы разблокировать его: щелкните правой кнопкой мыши по загруженному zip-файлу-> Свойства- > Разблокировать). [Источник 4]

Установка при встраивании в проект Visual Studio

Если вы вручную добавляете Siaqodb в свой проект, щелкните правой кнопкой мыши по папке «Ссылки» в обозревателе решений Visual Studio и выберите «Добавить ссылку». Перейдите в папку, в которой были установлены библиотеки DLL, выберите из папки /bin папку, которую вы используете, и добавьте DLL из соответствующей папки (пример для платформы .NET 4.5): [Источник 4]

  • Siaqodb.dll
  • SiaqodbPortable.dll

Обязательные параметры для использования БД

Необходим оператор: [Источник 4]

1 using Sqo;

Нужно определить классы, где будет храниться информация:

 1 public class Employee
 2 {
 3     public int OID { get; set; }  // note; setting an OID is not required and would happen behind the scenes if you omit it
 4     public Company Employer { get; set; }
 5     public string LastName { get; set; }
 6     public string FirstName { get; set; }
 7     public int Age { get; set; }
 8     public DateTime HireDate { get; set; }
 9     public string City { get; set; }
10 }
11 
12 public class Company
13 {
14     public int OID { get; set; }
15     public string Name { get; set; }
16     public string Address { get; set; }
17     public string Phone { get; set; }
18 }

Откройте/создайте базу данных и сохраните свои объекты:

1 Siaqodb siaqodb = new Siaqodb ("c:\Siaqodb\");
2 Company company = new Company();
3 company.Name = "MyCompany";
4 siaqodb.StoreObject(company);
5 Employee employee1 = new Employee();
6 employee1.Employer = company;
7 employee1.FirstName = "John";
8 employee1.LastName = "Walter";
9 siaqodb.StoreObject(employee1);

Примеры извлечения объектов из базы данных

  • Пример 1: получить все компании из базы данных: [Источник 4]
1 IObjectList<Company> companies = siaqodb.LoadAll<Company>();
  • Пример 2. Получите всех сотрудников, у которых FirstName содержат «John»
1 var query = from Employee emp in siaqodb
2                  where emp.FirstName.Contains("John")
3                  select emp;
4 foreach (Employee emp in query)
5 {
6     //do something with employee
7 }
  • Пример 3: получить всех сотрудников старше 30 лет и родившиеся в Берлине:
1 var query2 = from Employee emp in siaqodb
2                   where emp.Age > 30 && emp.City == "Berlin"
3                   select emp;
4 foreach (Employee emp in query2)
5 {
6     //do something with emp
7 }
  • Пример 4: получить всех сотрудников, работающих в компании «MyCompany»:
1 var query3 = from Employee1 emp in siaqodb
2                  where emp.Employer.Name == "MyCompany"
3                  select new { emp.FirstName, emp.LastName };

Источники

  1. Home // CCSTM Computing LLC. [2019-2019]. URL: https://www.siaqodb.com/ (дата обращения: 24.10.2018).
  2. 2,0 2,1 Siaqodb vs SQLite // CCSTM Computing LLC. [2019-2019]. URL: https://www.siaqodb.com/siaqodb-vs-sqlite/ (дата обращения: 24.10.2018).
  3. 3,0 3,1 Siaqodb vs RavenDB // CCSTM Computing LLC. [2019-2019]. URL: https://www.siaqodb.com/siaqodb-vs-ravendb/ (дата обращения: 24.10.2018).
  4. 4,0 4,1 4,2 4,3 Getting Started // CCSTM Computing LLC. [2019-2019]. URL: https://www.siaqodb.com/docs/Getting-started/ (дата обращения: 24.10.2018).