вторник, 14 апреля 2009 г.

SQLite для .NET разработчика. Ссылки.

Краткое описание на Wikipedia:
http://ru.wikipedia.org/wiki/SQLite

Обычная энциклопедическая статья, которая в общих чертах описывает функциональность этой встроенной СУБД. Очень радует лицензия продукта, которая Public Domain.


Официальный сайт SQLite
http://www.sqlite.org/

.NET программисту особенно тут делать нечего. Однако стоит прочитать две статьи в разделе Documentation - "Appropriate Uses For SQLite" и "Distinctive Features" чтобы иметь четкое понимание того, как именно позиционируется данный продукт.


SQLite Management Tools
http://www.sqlite.org/cvstrac/wiki?p=ManagementTools

Утилиты, которые позволяют управлять и выполнять запросы к базе SQLite

SQLite Converter Tools
http://www.sqlite.org/cvstrac/wiki?p=ConverterTools

Утилиты для конвертирования форматов других баз данных в формат SQLite и, наоборот.


SQLite Wrappers
http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers

Библиотеки, которые позволяют обращаться к базе SQLite из различных языков программирования.


System.Data.SQLite
http://sqlite.phxsoftware.com/

Наиболее развитый на мой взглять ADO.NET Data Provider для SQLite.

На официальном сайте можно отметить следующие интересные возможности этого проекта:
- Полная поддержка стека ADO.NET 2.0
- Поддержка .NET, .NET Compact Framework, Mono
- Поддержка ADO.NET Entity Framework, который доступен в .NET 3.5
- Design-Time поддержка в Visual Studio 2008
- Есть возможность шифрования базы данных

Для того чтобы распространять .NET проект, в котором используется база данных SQLite достаточно включить в него сборку System.Data.SQLite.dll, которая сама уже содержит оригинальную библиотеку.
Кроме того, можно использовать альтернативный вариант распространения - включать в дистрибутив приложения сборку System.Data.SQLite.dll из каталога ManagedOnly + оригинальную sqlite3.dll.


[UPDATE 2009-11-26]

Пост вызвыл активную реакцию, чему я безмерно рад. Большое спасибо за фидбек, я получил целый ряд полезных "зацепок", которые в последствии могут пригодится.

Насчет ссылочной целостности в SQLite. Действительно, неделю назад обнаружил в документации что по-умолчанию в SQLite не включены FK Constraints. Да, не фонтан. Пусть даже это и встроенная СУБД, но я бы не отказался от такого полезного механизма контроля.

По ссылке ниже описывается как можно проверить включены ли они или нет и что нужно сделать чтобы их таки включить:
http://www.sqlite.org/foreignkeys.html

Из документации видно, что в будущих релизах FK Constraints могут быть включены.

Плюс еще довольно полезная информация по поводу того, чего SQLite не умеет из SQL92 стандарта:
http://www.sqlite.org/omitted.html

Пока для себя расставил такие приоритеты:
- если размер дистрибутива важен, и можно принебречь остутствием ряда продвинутых фич, то я предпочту SQLite;
- требовать уж очень высокой скорости работы от встроенной СУБД думаю что не стоит;
- Embedded Firebird выгодно отличается от SQLite возможностью с нее "соскочить" на полновесную Firebird. Предполагаю что это будет максимально безполезненно;
- Еще подумываю об необходимости использовании ORM + встроенная БД. Тогда и поставщиков БД можно будет менять как перчатки. Ну или почти...

8 комментариев:

Kostiantyn Kolesnichenko комментирует...

Судя по описанию на вики, штука эта не очень юзабельная. По крайней мере по сравнению с MS SQL. Насколько я понял, в момент записи в одну таблицу блокируется вся БД - ну ничего себе "эффективная БД"! :-)

Alexey Diyan комментирует...

Дело в том, что SQLite это встроенная СУБД, которая не требует выделенного сервера БД.

Поэтому сравнение SQLite и MS SQL Server это не совсем корректно, поскольку у них совершенно разные ниши.

SQLite можно сравнивать с другими такими же встроенными СУБД, как например SQL Server Everywhere (http://demiliani.com/blog/archive/2006/04/10/3629.aspx).

Кроме того, я бы даже сравнивал вариант использования встроенных СУБД и использования данных в наборе XML файлов. Но никак не с "полновесными" СУБД.

Kostiantyn Kolesnichenko комментирует...

Неудачно сравнил, но сути не меняет. Сравни с Firebird-ом, с db4o, с каким-нить ембеддед MySQL-ем. Или с упомянутым тобой решением от МС.

Насколько я понял, у SQLite ниша - однопоточное хранение данных для ПО одного пользователя. Конечно - что кому удобнее. Для дотнета, имхо, удобнее юзать db4o (причём без особых проблем с паралеллизмом). А если говорить о реляционках - то Firebird.

Уверен, есть ещё немало embedded СУБД без проблем SQLite-a.

Alexey Diyan комментирует...

Прошу прощения, я только сейчас понял что у Firebird есть встроенное решение.

До сегодняшнего дня я был в полной уверенности что Firebird это исключительно клиент-сервер.

Насчет db4o даже не знаю что и думать. Никогда в глаза не видел эту СУБД. Видимо не попадался человек, который смог бы ее хорошо попиарить ;)

Что касается встроенного решения от MySQL, то я пока отношусь к нему немного настороженно. Если не ошибаюсь оно не так давно и появилось, к тому же у меня есть некоторые опасения насчет лицензии этого продукта. Хотя, вероятно, они бессмысленны.

Dmitriy комментирует...

Решение от Firebird значительно уступает SQLite. Во первых, встроенная база Firebird блокируется даже при доступе на чтение. А SQLite'овская позволяет читать в несколько потоков и блокируется только при записи. Причем отложенные транзакции значительно решают и эту проблему. Во вторых, SQLite имеет несколько вкусных фишек, которых нет в Firebird. Например, crossdatabase-запросы. В третьих, SQLite легче и шустрее. Embedded решение от MySQL - полный УГ.

Unknown комментирует...

Во первых, встроенная база Firebird блокируется даже при доступе на чтение.
Бред. FireBird - версионник, не блокировочник. Читающие транзакции не блокируют ни читающих, ни пишущих.

Насчет шустрости по сравнению с FireBird - вранье. Тестировано, проверено.

И уж насчет возможностей - SQLite есть слабое подобие SQL - движка, такого хотя бы как FireBird. Развитые типы данных, домены, триггеры, процедуры, обработка исключений, сообщения, ссылочная целостность - все это было еще 10 лет назад, когда никаких SQLite не было и в помине. А уж нынешнее состояние FireBird таково, что с SQLite сравнивать просто смешно.

FireBird embedded, в зависимости от версии, весит в районе 3 мегов. Поддержка шифрации обеспечивается только в Embedded.

SQLite - хорошая встраиваемая БД. И все.

Unknown комментирует...

Насчет блокировки именно встроенной FireBird - соврал, таки есть такое.
Да, работа только в одном потоке.

Но проверено, что Embedded таки шустрее, чем SQLite, особенно на больших объемах.

Анонимный комментирует...

А мы SQLite юзаем для некоторых интеграционных тестов.