SQLite vs PostgreSQL: когда какая база нужна аналитику

SQLite и PostgreSQL решают одну задачу — хранить и запрашивать данные через SQL — но устроены принципиально по-разному. SQLite — это встраиваемая (embedded) библиотека: вся база живёт в одном файле, движок работает внутри вашего процесса, сервера нет. PostgreSQL — полноценная клиент-серверная СУБД: отдельный процесс, сетевые подключения, роли, репликация. Для аналитика разница важна на практике: локальный тренажёр, прототип или разовый разбор CSV прекрасно ложатся на SQLite, а продовый витринный слой, дашборды и конкурентная запись требуют PostgreSQL. На собеседовании эту границу спрашивают постоянно: «почему нельзя гнать аналитику продакшена на SQLite», «что такое ACID и как каждая БД его обеспечивает», «чем оконные функции в обеих отличаются». Оба движка используются в нашем SQL-тренажёре, так что синтаксис вы отработаете на реальных задачах — попробуйте на /sql-sandbox.

Сравнительная таблица

Параметр Sqlite Postgresql
Модель развёртыванияВстраиваемая библиотека внутри процесса приложения, без сервераКлиент-серверная СУБД, отдельный процесс и сетевой демон
Хранение данныхОдин файл на диске (весь БД в .db/.sqlite)Каталог данных с множеством файлов, управляется сервером
Конкурентная записьОграниченно: один writer одновременно, блокировка на уровне БД (WAL смягчает)Да: MVCC, много одновременных writer-ов без глобальной блокировки
Транзакции и ACIDДа, полноценный ACID через журнал/WALДа, полноценный ACID через MVCC и WAL
Типизация колонокДинамическая (type affinity), можно писать текст в INTEGER-колонкуСтрогая статическая типизация, ошибка при несовпадении типа
Типы данныхБазовые: INTEGER, REAL, TEXT, BLOB, NUMERICБогатый набор: JSONB, ARRAY, UUID, ENUM, geometric, range, tsvector
Оконные функции и CTEДа (window functions с 3.25, рекурсивные CTE)Да, полная поддержка, включая RANGE/GROUPS frame и продвинутые агрегаты
Масштаб данныхКомфортно до единиц ГБ, один узел, одна машинаТерабайты, партиционирование, репликация, шардинг через расширения
РасширяемостьОграниченная: часть extension (FTS5, JSON1, R-Tree)Высокая: PostGIS, pg_stat_statements, foreign data wrappers, свои типы и функции
Учётные записи и праваНет ролей и GRANT, доступ = права на файлРоли, GRANT/REVOKE, row-level security
Стоимость и запускБесплатно (public domain), zero-config, ничего ставить не надоБесплатно (open source), нужен установленный и настроенный сервер

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

Когда Sqlite

  • Выбирайте SQLite, когда база нужна локально и на одного «писателя»: прототип, тренажёр, встроенное хранилище в приложении, разовый анализ выгрузки или CSV
  • Она не требует установки и настройки — просто файл, который можно приложить к письму или закоммитить в репозиторий
  • Идеальна для обучения SQL, тестов и pet-проектов, где нет конкурентной записи и объёмы данных в пределах нескольких гигабайт

Когда Postgresql

  • Выбирайте PostgreSQL, когда несколько пользователей или сервисов пишут одновременно, данных много (десятки ГБ и выше) и нужны надёжность, роли и репликация
  • Это стандарт для продовых витрин, дашбордов, backend-приложений и аналитических хранилищ
  • Берите его, когда важны строгая типизация, JSONB, географические данные (PostGIS), сложные ограничения целостности и горизонтальное масштабирование

FAQ

Почему нельзя использовать SQLite для продакшена с высокой нагрузкой на запись?

SQLite допускает только одного writer одновременно — на время записи база блокируется (режим WAL это смягчает, но не снимает ограничение полностью). При десятках параллельных INSERT/UPDATE запросы выстраиваются в очередь и упираются в блокировку. PostgreSQL использует MVCC, поэтому много транзакций пишут параллельно, не мешая друг другу и не блокируя читателей.

Что такое ACID и как его обеспечивают обе базы?

ACID — это Atomicity, Consistency, Isolation, Durability: транзакция либо применяется целиком, либо откатывается, данные остаются согласованными, параллельные транзакции изолированы, а зафиксированные изменения переживают сбой. SQLite обеспечивает ACID через rollback-журнал или WAL. PostgreSQL — через MVCC и WAL, при этом изоляция настраивается уровнями вплоть до SERIALIZABLE.

Чем отличается типизация в SQLite и PostgreSQL и почему это важно на собеседовании?

В SQLite типизация динамическая (type affinity): в колонку INTEGER можно записать текст, движок не выдаст ошибку. В PostgreSQL типизация строгая — несовпадение типа приводит к ошибке. Это важно, потому что скрытые несоответствия типов в SQLite ловятся поздно и портят агрегаты, а строгая типизация PostgreSQL ловит их сразу при вставке.

Отличается ли SQL-синтаксис, и как перенести запросы с SQLite на PostgreSQL?

Базовый SQL (SELECT, JOIN, GROUP BY, оконные функции, CTE) почти одинаков, но есть различия: работа с датами (strftime/julianday в SQLite против date_trunc/интервалов в Postgres), автоинкремент (AUTOINCREMENT против SERIAL/GENERATED), приведение типов и функции строк. Перенос обычно требует правки этих мест. Отработать оба диалекта на живых задачах можно на /sql-sandbox, где движок поддерживает и SQLite, и PostgreSQL.

Источники

Практика по теме → Полный гайд в блоге →

Другие сравнения

Postgresql vs Clickhouse · Pandas vs Polars · Tableau vs Powerbi Datalens Superset · SQL vs Pandas · Dbt vs Airflow · Redshift vs Bigquery vs Snowflake · Airflow vs Dagster vs Prefect · Greenplum vs Clickhouse · Excel vs SQL · Postgresql vs Mysql · Spark vs Pandas · Power Bi vs Excel · Clickhouse vs Druid · Python vs R