# SQLite, MySQL и PostgreSQL: сравниваем популярные реляционные СУБД

Реляционные базы данных используются уже очень давно. Они стали популярными благодаря успешным реализациям реляционных моделей в системах управления, оказавшимся весьма удобными для работы с данными. В этой статье мы сравним три самые популярные [реляционные системы управления базами данных](https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%A1%D0%A3%D0%91%D0%94) (РСУБД): [SQLite](https://www.sqlite.org), [MySQL](https://www.mysql.com) и [PostgreSQL](https://www.postgresql.org).

#### Системы управления базами данных

Базы данных — это логически смоделированные хранилища любых типов данных. Каждая база данных, не являющаяся бессхемной, следует модели, которая задаёт определённую структуру обработки данных. СУБД — это приложения (или библиотеки), управляющие базами данных различных форм, размеров и типов.

Чтобы лучше разобраться в СУБД, ознакомьтесь с [этой статьёй](https://tproger.ru/translations/sql-nosql-database-models/).

#### Реляционные системы управления базами данных

Реляционные системы реализуют реляционную модель работы с данными, которая определяет всю хранимую информацию как набор связанных записей и атрибутов в таблице.

СУБД такого типа используют структуры (таблицы) для хранения и работы с данными. Каждый столбец (атрибут) содержит свой тип информации. Каждая запись в базе данных, обладающая уникальным ключом, передаётся в строку таблицы, и её атрибуты отображаются в столбцах таблицы.

#### Отношения и типы данных

Отношения можно определить как математические множества, содержащие наборы атрибутов, отображающие хранящуюся информацию.

Каждый элемент, формирующий запись, должен удовлетворять определённому типу данных (целое число, дата и т.д.). Различные РСУБД используют разные типы данные, которые не всегда взаимозаменяемы.

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

#### Популярные РСУБД

В этой статье мы расскажем о 3 наиболее популярных РСУБД:

* **SQLite:** очень мощная встраиваемая РСУБД.
* **MySQL:** самая популярная и часто используемая РСУБД.
* **PostgreSQL:** самая продвинутая и гибкая РСУБД.

#### SQLite

SQLite — это изумительная библиотека, встраиваемая в приложение, которое её использует. Будучи файловой БД, она предоставляет отличный набор инструментов для более простой (в сравнении с серверными БД) обработки любых видов данных.

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

**Поддерживаемые типы данных**

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

**Note:** для получения более подробной информации ознакомьтесь с [документацией](https://www.sqlite.org/datatype3.html).

**Преимущества**

* **Файловая:** вся база данных хранится в одном файле, что облегчает перемещение.
* **Стандартизированная:** SQLite использует SQL; некоторые функции опущены (`RIGHT OUTER JOIN` или `FOR EACH STATEMENT`), однако, есть и некоторые новые.
* **Отлично подходит для разработки и даже тестирования:** во время этапа разработки большинству требуется масштабируемое решение. SQLite, со своим богатым набором функций, может предоставить более чем достаточный функционал, при этом будучи достаточно простой для работы с одним файлом и связанной сишной библиотекой.

**Недостатки**

* **Отсутствие пользовательского управления:** продвинутые БД предоставляют пользователям возможность управлять связями в таблицах в соответствии с привилегиями, но у SQLite такой функции нет.
* **Невозможность дополнительной настройки:** опять-таки, SQLite нельзя сделать более производительной, поковырявшись в настройках — так уж она устроена.

**Когда стоит использовать SQLite**

* **Встроенные приложения:** все портируемые не предназначенные для масштабирования приложения — например, локальные однопользовательские приложения, мобильные приложения или игры.
* **Система доступа к дисковой памяти:** в большинстве случаев приложения, часто производящие прямые операции чтения/записи на диск, можно перевести на SQLite для повышения производительности.
* **Тестирование:** отлично подойдёт для большинства приложений, частью функционала которых является тестирование бизнес-логики.

**Когда не стоит использовать SQLite**

* **Многопользовательские приложения:** если вы работаете над приложением, доступом к БД в котором будут одновременно пользоваться несколько человек, лучше выбрать полнофункциональную РСУБД — например, MySQL.
* **Приложения, записывающие большие объёмы данных:** одним из ограничений SQLite являются операции записи. Эта РСУБД допускает единовременное исполнение лишь одной операции записи.

#### MySQL

MySQL — это самая популярная из всех крупных серверных БД. Разобраться в ней очень просто, да и в сети о ней можно найти большое количество информации. Хотя MySQL и не пытается полностью реализовать SQL-стандарты, она предлагает широкий функционал. Приложения общаются с базой данных через процесс-демон.

**Поддерживаемые типы данных**

* **TINYINT:** очень маленькое целое.
* **SMALLINT:** маленькое целое.
* **MEDIUMINT:** целое среднего размера.
* **INT или INTEGER:** целое нормального размера.
* **BIGINT:** большое целое.
* **FLOAT:** знаковое число с плавающей запятой одинарной точности.
* **DOUBLE, DOUBLE PRECISION, REAL:** знаковое число с плавающей запятой двойной точности.
* **DECIMAL, NUMERIC:** знаковое число с плавающей запятой.
* **DATE:** дата.
* **DATETIME:** комбинация даты и времени.
* **TIMESTAMP:** отметка времени.
* **TIME:** время.
* **YEAR:** год в формате YY или YYYY.
* **CHAR:** строка фиксированного размера, дополняемая справа пробелами до максимальной длины.
* **VARCHAR:** строка переменной длины.
* **TINYBLOB, TINYTEXT:** BLOB- или TEXT-столбец длиной максимум 255 (2^8 — 1) символов.
* **BLOB, TEXT:** BLOB- или TEXT-столбец длиной максимум 65535 (2^16 — 1) символов.
* **MEDIUMBLOB, MEDIUMTEXT:** BLOB- или TEXT-столбец длиной максимум 16777215 (2^24 — 1) символов.
* **LONGBLOB, LONGTEXT:** BLOB- или TEXT-столбец длиной максимум 4294967295 (2^32 — 1) символов.
* **ENUM:** перечисление.
* **SET:** множества.

**Преимущества**

* **Простота:** MySQL легко устанавливается. Существует много сторонних инструментов, включая визуальные, облегчающих начало работы с БД.
* **Много функций:** MySQL поддерживает большую часть функционала SQL.
* **Безопасность:** в MySQL встроено много функций безопасности.
* **Мощность и масштабируемость:** MySQL может работать с действительно большими объёмами данных, и неплохо походит для масштабируемых приложений.
* **Скорость:** пренебрежение некоторыми стандартами позволяет MySQL работать производительнее, местами срезая на поворотах.

**Недостатки**

* **Известные ограничения:** по определению, MySQL не может сделать всё, что угодно, и в ней присутствуют определённые ограничения функциональности.
* **Вопросы надёжности:** некоторые операции реализованы менее надёжно, чем в других РСУБД.
* **Застой в разработке:** хотя MySQL и является open-source продуктом, работа над ней сильно заторможена. Тем не менее, существует несколько БД, полностью основанных на MySQL (например, MariaDB). Кстати, подробнее о родстве MariaDB и MySQL можно из нашего [интервью](https://tproger.ru/interview/james-bottomley/) с создателем обеих РСУБД — Джеймсом Боттомли.

**Когда стоит использовать MySQL**

* **Распределённые операции:** когда вам нужен функционал бо́льший, чем может предоставить SQLite, стоит использовать MySQL.
* **Высокая безопасность:** функции безопасности MySQL предоставляют надёжную защиту доступа и использования данных.
* **Веб-сайты и приложения:** большая часть веб-ресурсов вполне может работать с MySQL, несмотря на ограничения. Этот инструмент весьма гибок и прост в обращении, что только на руку в длительной перспективе.
* **Кастомные решения:** если вы работаете над очень специфичным продуктом, MySQL подстроится под ваши потребности благодаря широкому спектру настроек и режимов работы.

**Когда не стоит использовать MySQL**

* **SQL-совместимость:** поскольку MySQL не пытается полностью реализовать стандарты SQL, она не является полностью совместимой с SQL. Из-за этого могут возникнуть проблемы при интеграции с другими РСУБД.
* **Конкурентность:** хотя MySQL неплохо справляется с операциями чтения, одновременные операции чтения-записи могут вызвать проблемы.
* **Недостаток функций:** в зависимости от выбора движка MySQL может недоставать некоторых функций.

#### PostgreSQL

PostgreSQL — это самая продвинутая РСУБД, ориентирующаяся в первую очередь на полное соответствие стандартам и расширяемость. PostgreSQL, или Postgres, пытается полностью соответствовать SQL-стандартам ANSI/ISO.

PostgreSQL отличается от других РСУБД тем, что обладает объектно-ориентированным функционалом, в том числе полной поддержкой концепта ACID (Atomicity, Consistency, Isolation, Durability).

Будучи основанным на мощной технологии Postgres отлично справляется с одновременной обработкой нескольких заданий. Поддержка конкурентности реализована с использованием MVCC (Multiversion Concurrency Control), что также обеспечивает совместимость с ACID.

Хотя эта РСУБД не так популярна, как MySQL, существует много сторонних инструментов и библиотек для облегчения работы с PostgreSQL.

**Поддерживаемые типы данных**

* **bigint:** знаковое 8-байтное целое.
* **bigserial:** автоматически инкрементируемое 8-битное целое.
* **bit \[(n)]:** битовая строка фиксированной длины.
* **bit varying \[(n)]:** битовая строка переменной длины.
* **boolean:** булевская величина.
* **box:** прямоугольник на плоскости.
* **bytea:** бинарные данные.
* **character varying \[(n)]:** строка символов фиксированной длины.
* **character \[(n)]:** строка символов переменной длины.
* **cidr:** сетевой адрес IPv4 или IPv6.
* **circle:** круг на плоскости.
* **date:** календарная дата.
* **double precision:** число с плавающей запятой двойной точности.
* **inet:** адрес хоста IPv4 или IPv6.
* **integer:** знаковое 4-байтное целое.
* **interval \[fields] \[(p)]:** временной промежуток.
* **line:** бесконечная прямая на плоскости.
* **lseg:** отрезок на плоскости.
* **macaddr:** MAC-адрес.
* **money:** денежная величина.
* **path:** геометрический путь на плоскости.
* **point:** геометрическая точка на плоскости.
* **polygon:** многоугольник на плоскости.
* **real:** число с плавающей запятой одинарной точности.
* **smallint:** знаковое 2-байтное целое.
* **serial:** автоматически инкрементируемое 4-битное целое.
* **text:** строка символов переменной длины.
* **time \[(p)] \[without time zone]:** время суток (без часового пояса).
* **time \[(p)] with time zone:** время суток (с часовым поясом).
* **timestamp \[(p)] \[without time zone]:** дата и время (без часового пояса).
* **timestamp \[(p)] with time zone:** дата и время (с часовым поясом).
* **tsquery:** запрос текстового поиска.
* **tsvector:** документ текстового поиска.
* **txid\_snapshot:** снэпшот ID пользовательской транзакции.
* **uuid:** уникальный идентификатор.
* **xml:** XML-данные.

**Преимущества**

* **Полная SQL-совместимость**.
* **Сообщество:** PostgreSQL поддерживается опытным сообществом 24/7.
* **Поддержка сторонними организациями:** несмотря на очень продвинутые функции, PostgreSQL используется в многих инструментах, связанных с РСУБД.
* **Расширяемость:** PostgreSQL можно программно расширить за счёт хранимых процедур.
* **Объектно-ориентированность:** PostgreSQL — не только реляционная, но и объектно-ориентированная СУБД.

**Недостатки**

* **Производительность:** В простых операциях чтения PostgreSQL может уступать своим соперникам.
* **Популярность:** из-за своей сложности инструмент не очень популярен.
* **Хостинг:** из-за вышеперечисленных факторов проблематично найти подходящего провайдера.

**Когда стоит использовать PostgreSQL**

* **Целостность данных:** если приоритет стоит на надёжность и целостность данных, PostgreSQL — лучший выбор.
* **Сложные процедуры:** если ваша БД должна выполнять сложные процедуры, стоит выбрать PostgreSQL в силу её расширяемости.
* **Интеграция:** если в будущем вам предстоит перемещать всю базу на другое решение, меньше всего проблем возникнет с PostgreSQL.

**Когда не стоит использовать PostgreSQL**

* **Скорость:** если всё, что нужно — это быстрые операции чтения, не стоит использовать PostgreSQL.
* **Простые ситуации:** если вам не требуется повышенная надёжность, поддержка ACID и всё такое, использование PostgreSQL — это стрельба из пушки по мухам.

Перевод статьи https://www.digitalocean.com/community/tutorials/sqlite-vs-mysql-vs-postgresql-a-comparison-of-relational-database-management-systems
