Введение
Бессерверная реляционная система управления базами данных (СУБД)
SQLite (,/ɛ//s/,/k//juː/,/ɛ//l/'/aɪ//t/, '/s//iː//k//w//ə//,//l//aɪ//t/) – это движок базы данных, написанный на языке программирования C. Это не автономное приложение, а библиотека, которую разработчики программного обеспечения встраивают в свои приложения. Таким образом, он относится к семейству встраиваемых баз данных. Это наиболее широко используемый движок баз данных, поскольку он используется во многих популярных веб-браузерах, операционных системах, мобильных телефонах и других встраиваемых системах. Для библиотеки SQLite существуют привязки для многих языков программирования. Он в целом следует синтаксису PostgreSQL, но по умолчанию не обеспечивает проверку типов. Это означает, что, например, можно вставить строку в столбец, определенный как целое число.
История
D. Richard Hipp разработал SQLite весной 2000 года, работая в General Dynamics по контракту с Военно-морским флотом США. Хипп разрабатывал программное обеспечение для системы контроля повреждений на борту эсминцев с управляемыми ракетами; изначально эта система контроля повреждений использовала HP UX с серверной частью базы данных IBM Informix. SQLite начинался как расширение для Tcl. В 2018 году SQLite принял Кодекс поведения, основанный на правилах святого Бенедикта, что вызвало некоторые споры, и впоследствии он был переименован в Кодекс этики. SQLite входит в число четырех форматов, рекомендованных для долгосрочного хранения наборов данных, утвержденных для использования Библиотекой Конгресса.
Дизайн
SQLite был разработан для обеспечения работы программы без установки системы управления базами данных или администратора базы данных. В отличие от систем управления базами данных типа клиент-сервер, движок SQLite не имеет отдельных процессов, с которыми взаимодействует приложение. Вместо этого, компоновщик интегрирует библиотеку SQLite статически или динамически в приложение, которое использует функциональность SQLite посредством простых вызовов функций, снижая задержку при операциях с базой данных; для простых запросов с небольшой степенью параллелизма производительность SQLite выигрывает за счет избежания накладных расходов на межпроцессное взаимодействие. Благодаря безсерверной архитектуре приложения SQLite требуют меньше конфигурации, чем клиент-серверные базы данных. SQLite называют системой с нулевой конфигурацией, поскольку она не требует управления службами (например, стартовых скриптов) или контроля доступа на основе GRANT и паролей. Контроль доступа осуществляется посредством разрешений файловой системы, предоставляемых непосредственно файлу базы данных. Базы данных в клиент-серверных системах используют разрешения файловой системы, которые предоставляют доступ к файлам базы данных только процессу-демону, который управляет блокировками внутри себя, позволяя одновременную запись из нескольких процессов. SQLite хранит всю базу данных (определения, таблицы, индексы и сами данные) в виде единого кроссплатформенного файла на хост-машине, позволяя нескольким процессам или потокам одновременно обращаться к одной и той же базе данных. Эта простая конструкция реализуется путем блокировки файла базы данных во время записи. Доступ на запись может завершиться ошибкой, или его можно повторить до истечения заданного времени ожидания. Операции чтения в SQLite могут выполняться параллельно, однако из-за безсерверной архитектуры запись может выполняться только последовательно. Это ограничение не распространяется на временные таблицы и было смягчено в версии 3.7 благодаря внедрению протокола write-ahead logging (WAL), который обеспечивает одновременное чтение и запись. Поскольку SQLite полагается на блокировки файловой системы, он не является оптимальным выбором для задач, интенсивно использующих запись. SQLite использует PostgreSQL в качестве эталонной платформы. Вопрос "Что бы сделал PostgreSQL?" используется для интерпретации стандарта SQL. Одним из основных отличий является то, что, за исключением первичных ключей, SQLite не обеспечивает проверку типов; тип значения является динамическим и не строго ограничен схемой (хотя схема запускает преобразование при хранении, если такое преобразование потенциально обратимо). SQLite стремится следовать правилу Постеля. SQLite использует необычную систему типов для СУБД, совместимой с SQL: вместо назначения типа столбцу, как в большинстве систем баз данных SQL, типы присваиваются отдельным значениям; с точки зрения языка программирования, это динамическая типизация. Более того, она слабо типизирована, как и Perl: можно вставить строку в целочисленный столбец (хотя SQLite сначала попытается преобразовать строку в целое число, если предпочтительным типом столбца является целое число). Это придает столбцам гибкость, особенно при работе с динамически типизированным языком сценариев. Однако этот подход не переносится на другие продукты SQL. Распространенная критика заключается в том, что в системе типов SQLite отсутствует механизм обеспечения целостности данных, предоставляемый статически типизированными столбцами, хотя его можно эмулировать с помощью ограничений. Таблицы обычно включают скрытый индексный столбец rowid, который обеспечивает более быстрый доступ. Если база данных содержит столбец Integer Primary Key, SQLite обычно оптимизирует его, рассматривая его как псевдоним для rowid, в результате чего содержимое хранится как строго типизированное 64-битное целое число со знаком, а его поведение становится похожим на автоматически инкрементируемый столбец. В будущих версиях SQLite может появиться команда для определения того, имеет ли столбец поведение, аналогичное rowid, чтобы отличать эти столбцы от слабо типизированных, неавтоматически инкрементируемых целочисленных первичных ключей. Версия 3.6.19, выпущенная 14 октября 2009 года, добавила поддержку ограничений внешнего ключа. Хранимые процедуры не поддерживаются; это сознательный выбор разработчиков в пользу простоты, поскольку типичный сценарий использования SQLite заключается в его встраивании в хост-приложение, которое может определять собственные процедуры для работы с базой данных. Полная поддержка преобразований регистра Unicode может быть включена с помощью необязательного расширения. В версии SQLite 3.7.4 впервые появился модуль FTS4 (полнотекстовый поиск), который предлагает улучшения по сравнению со старым модулем FTS3. FTS4 позволяет пользователям выполнять полнотекстовый поиск в документах, аналогично тому, как поисковые системы ищут веб-страницы. Версия 3.8.2 добавила поддержку создания таблиц без rowid, что может обеспечить повышение производительности и экономию места. Поддержка общих табличных выражений была добавлена в SQLite в версии 3.8.3. В версии 3.8.11 появился новый модуль поиска под названием FTS5, более радикальные (по сравнению с FTS4) изменения которого потребовали увеличения номера версии. В 2015 году, с расширением json1 и новыми интерфейсами подтипов, версия SQLite 3.9 представила управление JSON-контентом. По состоянию на версию 3.33.0 максимальный поддерживаемый размер базы данных составляет 281 ТБ.
Tables normally include a hidden rowid index column, which gives faster access. If a database includes an Integer Primary Key column, SQLite will typically optimize it by treating it as an alias for rowid, causing the contents to be stored as a strictly typed 64 bit signed integer and changing its behavior to be somewhat like an auto incrementing column. Future versions of SQLite may include a command to introspect whether a column has behavior like that of rowid to differentiate these columns from weakly typed, non autoincrementing Integer Primary Keys. Version 3.6.19 released on October 14, 2009 added support for foreign key constraints. Stored procedures are not supported; this is an explicit choice by the developers to favor simplicity, as the typical use case of SQLite is to be embedded inside a host application that can define its own procedures around the database. Full support for Unicode case conversions can be enabled through an optional extension. SQLite version 3.7.4 first saw the addition of the FTS4 (full text search) module, which features enhancements over the older FTS3 module. FTS4 allows users to perform full text searches on documents similar to how search engines search webpages. Version 3.8.2 added support for creating tables without rowid, which may provide space and performance improvements. Common table expressions support was added to SQLite in version 3.8.3. 3.8.11 added a newer search module called FTS5, the more radical (compared to FTS4) changes requiring a bump in version. In 2015, with the json1 extension and new subtype interfaces, SQLite version 3.9 introduced JSON content managing. As of version 3.33.0, the maximum supported database size is 281 TB.
Разработка и распространение
Код SQLite размещается в Fossil, распределенной системе контроля версий, которая использует SQLite в качестве локального кэша для своего нереляционного формата базы данных и SQL SQLite в качестве языка реализации. SQLite находится в общественном достоянии, но не поддерживает "открытые внесения", при этом на веб-сайте указано, что "проект не принимает исправления от людей, не предоставивших письменное заявление об передаче своего вклада в общественное достояние". Вместо кодекса поведения основатели приняли кодекс этики, основанный на правилах Святого Бенедикта. В состав дистрибутива SQLite входит автономная программа командной строки sqlite3. Она может использоваться для создания базы данных, определения таблиц, вставки и изменения строк, выполнения запросов и управления файлом базы данных SQLite. Она также служит примером при написании приложений, использующих библиотеку SQLite. SQLite использует автоматизированное регрессионное тестирование перед каждым выпуском. Более 2 миллионов тестов выполняются в процессе проверки релиза. Начиная с релиза SQLite 3.6.17 от 10 августа 2009 года, релизы SQLite обеспечивают 100% покрытие тестами ветвей, что является одним из компонентов покрытия кода. Тесты и тестовые среды частично находятся в общественном достоянии, а частично являются проприетарными.
Среднее оборудование
ADO.NET адаптер, первоначально разработанный Робертом Симпсоном, поддерживается совместно с разработчиками SQLite с апреля 2010 года. Драйвер ODBC был разработан и поддерживается отдельно Кристианом Вернером. Драйвер ODBC, разработанный Кристианом Вернером, является рекомендуемым методом подключения для доступа к SQLite из OpenOffice.org. COM (ActiveX) оболочка обеспечивает доступ к SQLite в Windows из скриптовых языков, таких как JScript и VBScript, добавляя возможности базы данных SQLite в HTML-приложения (HTA).
Веб-браузеры
Браузеры Google Chrome, Opera, Safari и Android Browser позволяют хранить информацию в базе данных SQLite и извлекать ее из браузера, используя официальную сборку SQLite Wasm (WebAssembly) или технологию Web SQL Database, хотя последняя устаревает (в частности, заменяется SQLite Wasm или IndexedDB). Внутри браузеры на основе Chromium используют базы данных SQLite для хранения конфигурационных данных, таких как история посещений сайтов, файлы cookie, история загрузок и т. д. Mozilla Firefox и Mozilla Thunderbird хранят различные конфигурационные данные (закладки, файлы cookie, контакты и т. д.) во внутренних управляемых базах данных SQLite. До версии 57 Firefox ("Firefox Quantum") существовало стороннее расширение, которое использовало API, поддерживающий эту функциональность, для предоставления пользовательского интерфейса для управления произвольными базами данных SQLite. Несколько сторонних расширений могут использовать JavaScript API для управления базами данных SQLite.