Открыть сервис

SQLite

SQLite — это встраиваемая реляционная система управления базами данных (СУБД), реализованная в виде библиотеки на языке C. В отличие от большинства других распространённых СУБД (например, PostgreSQL или MySQL), SQLite не является отдельным серверным процессом, а встраивается непосредственно в приложение, которое её использует. Данные хранятся в одном файле на диске, что обеспечивает простоту развёртывания, переносимость и отсутствие необходимости в администрировании. SQLite является самой распространённой в мире СУБД: она используется в миллиардах устройств, включая смартфоны, браузеры, встраиваемые системы и настольные приложения.

История

Проект SQLite был создан американским программистом Д. Ричардом Хиппом (D. Richard Hipp) в 2000 году. Первоначальная цель заключалась в разработке лёгкой и быстрой СУБД для использования в военно-морском флоте США, где требовалась возможность работы с данными без выделенного сервера. Первая публичная версия, 1.0, была выпущена в августе 2000 года. Она поддерживала язык SQL, но не имела транзакций и индексов.

В 2001 году вышла версия 2.0, в которой была добавлена поддержка транзакций (на основе механизма журнала предзаписи) и улучшена производительность. Версия 3.0, выпущенная в 2004 году, стала значительным переломным моментом: она представила новую архитектуру, поддержку внешних ключей, триггеров, представлений и расширенный набор типов данных. С тех пор SQLite активно развивается, оставаясь при этом одним из самых стабильных и консервативных программных проектов. Код SQLite находится в открытом доступе (общественное достояние, public domain), что способствует его широкому распространению.

Архитектура и устройство

SQLite реализована в виде одной библиотеки (файл sqlite3.dll или libsqlite3.so), размер которой обычно составляет от 300 до 600 килобайт. Она не требует отдельного процесса, конфигурационных файлов или пользователей. Вся база данных хранится в одном файле (обычно с расширением .db, .sqlite или .sqlite3). Этот файл имеет строго определённый кроссплатформенный формат, что позволяет переносить базу данных между разными операционными системами без каких-либо преобразований.

Механизм хранения

SQLite использует B-деревья (B-tree) для хранения таблиц и индексов. Каждая таблица и каждый индекс представлены в виде отдельного B-дерева. Страницы данных имеют фиксированный размер (по умолчанию 4096 байт, но может быть изменён). Для обеспечения атомарности и изоляции транзакций SQLite применяет механизм журналирования (журнал предзаписи — WAL, или откатный журнал — rollback journal).

Типы данных

SQLite использует динамическую типизацию данных. В отличие от большинства реляционных СУБД, где тип данных строго привязан к столбцу, в SQLite тип данных ассоциируется с конкретным значением, а не с колонкой. Это называется «манифестной типизацией». Поддерживаются пять основных типов хранения (storage classes):

  • NULL — отсутствие значения.
  • INTEGER — целое число (1, 2, 3, 4, 6 или 8 байт в зависимости от величины).
  • REAL — число с плавающей точкой (8 байт, стандарт IEEE 754).
  • TEXT — текстовая строка (в кодировке UTF-8, UTF-16BE или UTF-16LE).
  • BLOB — бинарные данные (хранятся как есть).

Несмотря на динамическую типизацию, SQLite поддерживает объявление типов для столбцов (type affinity), что позволяет соблюдать совместимость с другими СУБД.

Особенности и ограничения

SQLite предназначена для сценариев, где не требуется высокая конкурентность записи или сложное администрирование. Она оптимизирована для чтения и однопользовательского доступа.

Поддерживаемые возможности

  • Полная поддержка SQL (стандарт SQL-92, за исключением некоторых расширенных функций).
  • Транзакции с поддержкой ACID (атомарность, согласованность, изоляция, долговечность).
  • Индексы (в том числе уникальные, частичные и выражения).
  • Триггеры и представления.
  • Внешние ключи (с версии 3.6.19).
  • Полнотекстовый поиск (FTS3, FTS4, FTS5).
  • JSON-функции (встроенная поддержка обработки JSON).
  • Common Table Expressions (CTE), включая рекурсивные.
  • Оконные функции (с версии 3.25.0).

Ограничения

  • Одновременная запись: SQLite использует блокировку на уровне всей базы данных. Несколько процессов могут одновременно читать базу, но только один процесс может выполнять запись в любой момент времени. Это делает её непригодной для высоконагруженных веб-приложений с множеством одновременных записей.
  • Размер базы данных: максимальный размер одного файла базы данных составляет около 140 терабайт (при размере страницы 65536 байт). На практике рекомендуется использовать базы данных размером до нескольких гигабайт.
  • Сетевой доступ: SQLite не имеет встроенной поддержки сетевого доступа. Она предназначена для локального использования. Для доступа по сети необходимо использовать специальные обёртки (например, sqlite3 через TCP/IP) или сторонние решения.
  • Пользователи и права доступа: SQLite не поддерживает систему пользователей и ролей. Управление доступом осуществляется на уровне файловой системы операционной системы.

Применение

Благодаря своей лёгкости, надёжности и отсутствию необходимости в администрировании, SQLite нашла применение в самых разных областях:

  • Мобильные устройства: является стандартной СУБД для платформ Android и iOS. Все системные и пользовательские приложения, работающие с данными (контакты, сообщения, настройки), используют SQLite.
  • Веб-браузеры: Mozilla Firefox, Google Chrome, Apple Safari и Opera используют SQLite для хранения закладок, истории посещений, куки, настроек и данных веб-хранилищ.
  • Настольные приложения: многие программы, от медиаплееров (VLC, iTunes) до офисных пакетов (LibreOffice), используют SQLite для хранения настроек и пользовательских данных.
  • Встраиваемые системы: SQLite работает на устройствах с ограниченными ресурсами, таких как маршрутизаторы, роутеры, промышленные контроллеры и устройства Интернета вещей (IoT).
  • Разработка и тестирование: SQLite часто используется как тестовая база данных для приложений, которые в production работают с более мощными СУБД (например, PostgreSQL). Это ускоряет тестирование и упрощает настройку окружения.
  • Анализ данных: благодаря поддержке SQL и возможности работы с CSV-файлами (через виртуальные таблицы), SQLite применяется для быстрого анализа небольших и средних наборов данных.
  • Образование: SQLite часто используется в учебных курсах по базам данных из-за своей простоты и отсутствия необходимости в установке сервера.

Инструменты и интерфейсы

Для работы с SQLite существует множество инструментов:

  • Командная строка: sqlite3 — стандартная утилита командной строки, входящая в состав дистрибутива SQLite. Позволяет выполнять SQL-запросы, импортировать/экспортировать данные, настраивать параметры.
  • Графические интерфейсы: DB Browser for SQLite, SQLiteStudio, SQLite Expert, DBeaver (с поддержкой SQLite) и другие.
  • Языки программирования: SQLite имеет встроенную поддержку в большинстве популярных языков программирования: C/C++, Python (модуль sqlite3), PHP, Java (через JDBC), Ruby, Go, Rust, JavaScript (через WebAssembly) и многих других.

Версии и лицензирование

SQLite распространяется как общественное достояние (public domain). Это означает, что код можно использовать, модифицировать и распространять без каких-либо ограничений, в том числе в коммерческих продуктах. Разработчики SQLite не требуют лицензионных отчислений или указания авторства.

Наиболее значимые версии:

  • 1.0 (2000) — первая публичная версия.
  • 2.0 (2001) — добавлены транзакции.
  • 3.0 (2004) — новая архитектура, поддержка внешних ключей, триггеров, UTF-16.
  • 3.7.0 (2010) — введение режима журнала предзаписи (WAL).
  • 3.8.0 (2013) — поддержка Common Table Expressions (CTE).
  • 3.25.0 (2018) — оконные функции.
  • 3.35.0 (2021) — поддержка команд ALTER TABLE ... DROP COLUMN и ALTER TABLE ... RENAME COLUMN.

Критика

Основные критические замечания в адрес SQLite связаны с её ограничениями по конкурентности записи и масштабируемости. Для приложений с высокой нагрузкой на запись (например, социальные сети, финансовые системы) SQLite не подходит. Также критикуется отсутствие встроенной поддержки репликации и шардинга, что делает её непригодной для распределённых систем. Кроме того, динамическая типизация может приводить к ошибкам, если разработчик не контролирует типы данных на уровне приложения.

Источники

  • Официальная документация SQLite (sqlite.org)
  • «The Definitive Guide to SQLite» by Grant Allen, Mike Owens (Apress, 2010)
  • «Using SQLite» by Jay A. Kreibich (O'Reilly Media, 2010)
  • SQLite Release Notes (sqlite.org/changelog.html)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →