Встраиваемая СУБД

Встраиваемая система управления базами данных — архитектура систем управления базами данных, когда СУБД тесно связана с прикладной программой и работает на том же компьютере, не требуя профессионального администрирования.

Встраиваемые СУБД применяются во многих программах, которые хранят большие массивы данных, но при этом не требуется доступ с многих компьютеров. На «рабочем столе» неопытного пользователя тоже есть программы, в которых может найтись встраиваемая СУБД: почтовые клиенты и мессенджеры (базы переписки)[1], медиапроигрыватели (плей-листы и обложки)[2], просмотрщики изображений (метаданные и уменьшенные эскизы)[3], различные локальные БД наподобие телефонных справочников и геоинформационных систем (предоставляемые данные).

Исторически локальные и файл-серверные СУБД предоставляли скриптовый язык, на котором пользователь мог писать прикладную программу. Так устроены, например, Microsoft Access, FoxPro, Clipper, 1С: Бухгалтерия. Недостатком этого подхода были крайняя бедность результирующих программ и ограниченные средства отладки. Также зачастую не существовало компактной среды исполнения, которую можно распространять вместе с программой; если пользователю была нужна программа, ему нужно было устанавливать весь пакет. С распространением динамически подключаемых библиотек и Open Source-сообщества обстоятельства изменились: теперь программист может писать свою программу на том языке высокого уровня, на котором ему удобно, а СУБД же будет подсоединена к программе и станет единым целым с ней.

Особенности

[править | править код]
Нет отдельной программы-сервера
Физически встраиваемая СУБД является библиотекой, статически или динамически подсоединённой к основной программе. Программа и СУБД общаются не через сетевые сокеты, а через специализированный API[4][5]. В этом, правда, есть и недостаток: зачастую программист сам должен не допускать многопоточных гонок.
Высокая скорость и малый расход памяти, особенно на длинных строках и BLOBах
Благодаря специализированному API количество операций чтения-записи минимально.
Зачастую небольшой по меркам БД максимальный размер базы
От единиц гигабайт (объём памяти ПК на 2012 год) до единиц терабайт (порядка объёма жёсткого диска). Например, SQLite всегда держит в памяти оглавление БД (аналог таблицы размещения файлов), этим ограничивается объём БД[6].
Как правило, специализированный язык запросов или неполная совместимость с SQL-92
В угоду производительности часто разработчики реализуют или неполный SQL (SQLite),[7] или специализированный язык запросов (BerkeleyDB). К тому же встраиваемые СУБД могут действовать совсем по другому принципу, чем клиент-серверные: пинг к БД нулевой, и запрос можно выполнять по частям, несколькими обращениями к СУБД.
Нет пользовательских прав[7]; простейшая изоляция транзакций
Большего однопользовательской БД и не нужно. Как правило, транзакции изолируются по принципу «записываем по одному» с помощью стандартных механизмов ОС наподобие блокировки файлов. Доступ к одному файлу из нескольких программ наладить можно: так, SQLite успешно работает в малонагруженных сайтах[6]. Но высокая нагрузка ему не по зубам.
Нет архивации и репликации БД
Встраиваемая БД надёжна настолько, насколько надёжна библиотека СУБД и файловая система, на которой база данных располагается. Известные встраиваемые СУБД, как правило, хорошо оттестированы,[8] а современные файловые системы очень надёжны. Тем не менее, есть множество способов потерять данные,[9] так что такие решения по надёжности уступают серверным СУБД.
Как правило, нет языковых средств, упрощающих доступ к БД
Специализированные СУБД-языки наподобие xBase обычно представляют собой симбиоз языка запросов и языка прикладного программирования. В языках программирования общего назначения правильность запроса будет проверена не при компиляции, а лишь тогда, когда запрос будет послан в СУБД. И, конечно же, на языке программирования общего назначения конструкции доступа к БД (как встраиваемой, так и клиент-серверной) будут тяжеловесными.
Впрочем, в C# есть язык запросов LINQ, который компилируется в комбинацию вызовов методов, а те, как правило, готовят обычный SQL.

Примечания

[править | править код]
  1. В частности, Skype использует SQLite для хранения баз переписки
  2. В частности, AIMP использует SQLite для хранения плей-листов
  3. В частности, XnView хранит в базе SQLite эскизы и тэги
  4. Пример API BerkeleyDB (англ.)
  5. Пример API SQLite Архивная копия от 20 декабря 2012 на Wayback Machine (англ.)
  6. 1 2 Применение SQLite Архивная копия от 20 декабря 2012 на Wayback Machine (англ.)
  7. 1 2 Чего нет в SQLite Архивная копия от 20 декабря 2012 на Wayback Machine (англ.)
  8. Как тестируется SQLite Архивная копия от 21 декабря 2012 на Wayback Machine (англ.)
  9. Как можно запортить таблицу SQLite Архивная копия от 9 августа 2014 на Wayback Machine (англ.)