Перейти до вмісту

PostgreSQL

Матеріал з K2 ERP Wiki Ukraine — База знань з автоматизації та санкцій в Україні

SEO title: PostgreSQL — open source об’єктно-реляційна база даних для застосунків, аналітики, GIS, JSON і enterprise-систем SEO description: PostgreSQL — Wiki-стаття про open source object-relational database management system. Розглянуто SQL, ACID, MVCC, транзакції, індекси, JSONB, PostGIS, extensions, roles, schemas, replication, WAL, backups, pg_dump, pg_restore, pg_upgrade, VACUUM, EXPLAIN, performance tuning, high availability, PostgreSQL License, переваги, обмеження, цікаві факти і хороші практики. SEO keywords: PostgreSQL, Postgres, PostgreSQL 18, PostgreSQL 18.3, database, open source database, relational database, object-relational database, SQL, ACID, MVCC, JSONB, PostGIS, PostgreSQL extensions, WAL, replication, logical replication, streaming replication, pg_dump, pg_restore, pg_upgrade, VACUUM, EXPLAIN, psql, PostgreSQL License Alternative to: MySQL для складніших SQL і extension-сценаріїв; MariaDB; Microsoft SQL Server у частині open source-середовищ; Oracle Database для частини enterprise-задач; SQLite для server-based multi-user систем; MongoDB у сценаріях, де потрібні SQL, транзакції й relational model; самописні storage-рішення; NoSQL без потреби


PostgreSQL або коротко Postgres — це потужна open source об’єктно-реляційна система керування базами даних. Вона використовується для вебзастосунків, бізнес-систем, фінансових сервісів, аналітики, геоданих, SaaS-платформ, API, data engineering, backend-розробки, enterprise-інфраструктури й дослідницьких проєктів.

PostgreSQL поєднує класичну relational database model із розширюваністю: підтримує SQL, транзакції, індекси, constraints, stored procedures, views, triggers, JSONB, extensions, replication, full-text search, foreign data wrappers і багато інших можливостей.

Основна ідея: PostgreSQL — це база даних для випадків, коли потрібні надійність, SQL, транзакції, гнучкість і можливість рости від маленького застосунку до серйозної production-системи.

Цікавий факт

PostgreSQL часто називають “найпросунутішою open source relational database” не через красивий слоган, а через поєднання речей, які рідко зустрічаються разом: сувора транзакційність, розширюваність, JSONB, PostGIS, складні індекси, SQL-функції, реплікація, foreign data wrappers і зріла спільнота.

Найцікавіше, що PostgreSQL може поводитися і як класична SQL-база, і як частково document-friendly система через JSONB, і як геопросторова база через PostGIS, і як платформа для розширень.

Найлюдяніший факт: PostgreSQL — це база даних, яка не намагається бути “простенькою”. Вона схожа на майстерню: спочатку здається великою, але потім виявляється, що майже для кожної складної задачі там уже є інструмент.

Загальний опис

PostgreSQL використовується для:

  • backend-застосунків;
  • web applications;
  • SaaS-платформ;
  • фінансових систем;
  • CRM і ERP;
  • аналітичних систем;
  • GIS і картографії;
  • data warehouses малого й середнього масштабу;
  • event logging;
  • API-серверів;
  • authentication systems;
  • e-commerce;
  • IoT backends;
  • scientific data;
  • internal tools;
  • enterprise applications;
  • cloud databases.

PostgreSQL цінують за передбачуваність, якість SQL-реалізації, сильну систему типів, extensibility, transactional integrity і активну ecosystem.

Перевага: PostgreSQL дозволяє почати з простої таблиці користувачів, а потім поступово додавати індекси, JSONB, views, replication, partitioning, full-text search і extensions без зміни базової платформи.

Історія PostgreSQL

PostgreSQL походить від проєкту POSTGRES, який розроблявся в University of California at Berkeley. Пізніше система отримала SQL-підтримку й назву PostgreSQL.

Основні етапи:

  • POSTGRES у Berkeley;
  • розвиток object-relational ідей;
  • поява Postgres95;
  • перехід до назви PostgreSQL;
  • розвиток SQL-сумісності;
  • зростання open source-спільноти;
  • поява MVCC, WAL, replication, JSONB, extensions;
  • активне використання в enterprise і cloud;
  • регулярні major і minor releases;
  • сильна ecosystem навколо PostGIS, pgAdmin, psql, Patroni, PgBouncer і managed PostgreSQL-сервісів.

Важливо: PostgreSQL має довгу історію, але це не “стара база з минулого”. Вона активно розвивається й регулярно отримує нові можливості.

PostgreSQL 18

PostgreSQL 18 — сучасна основна версія PostgreSQL. Вона принесла покращення продуктивності, нову I/O-підсистему, поліпшення upgrade-процесу, кращу роботу з індексами й інші зміни.

PostgreSQL 18 важлива для:

  • performance improvements;
  • нової I/O-архітектури;
  • оптимізації upgrade;
  • покращення planner;
  • розвитку SQL-функцій;
  • production-середовищ;
  • cloud deployments;
  • extension ecosystem;
  • довгострокового планування оновлень.

Практична роль: PostgreSQL 18 варто розглядати для нових проєктів і планових оновлень, але production upgrade потрібно тестувати на копії даних.

PostgreSQL License

PostgreSQL поширюється під PostgreSQL License. Це permissive open source-ліцензія, подібна за духом до BSD або MIT License.

PostgreSQL License дозволяє:

  • використовувати PostgreSQL без ліцензійної плати;
  • запускати в комерційних продуктах;
  • змінювати код;
  • поширювати копії;
  • використовувати в proprietary systems;
  • створювати комерційні сервіси;
  • будувати managed database platforms;
  • використовувати PostgreSQL у SaaS.

Перевага: PostgreSQL License дуже business-friendly: компанії можуть використовувати PostgreSQL у продуктах без copyleft-вимоги відкривати власний код.

Object-relational database

PostgreSQL називають object-relational database management system. Це означає, що вона не обмежується мінімальним набором relational database-функцій.

PostgreSQL підтримує:

  • user-defined types;
  • custom functions;
  • operators;
  • extensions;
  • inheritance у частині сценаріїв;
  • composite types;
  • arrays;
  • JSONB;
  • range types;
  • domains;
  • custom index behavior через extensions;
  • procedural languages.

Проста аналогія: PostgreSQL — це не тільки таблиці й рядки. Це ще система, яку можна розширювати під складні типи даних і поведінку.

SQL

SQL — основна мова роботи з PostgreSQL.

Через SQL можна:

  • створювати таблиці;
  • вставляти дані;
  • читати дані;
  • оновлювати записи;
  • видаляти записи;
  • створювати індекси;
  • об’єднувати таблиці;
  • писати аналітичні запити;
  • створювати views;
  • керувати транзакціями;
  • налаштовувати permissions;
  • викликати functions.

Приклад:

SELECT id, email
FROM users
WHERE active = true
ORDER BY created_at DESC
LIMIT 10;

Практична роль: SQL у PostgreSQL дозволяє описувати не “як пройти по даних”, а “який результат потрібен”.

ACID

PostgreSQL підтримує принципи ACID для транзакцій.

ACID означає:

  • Atomicity — транзакція виконується повністю або не виконується;
  • Consistency — дані переходять між коректними станами;
  • Isolation — паралельні транзакції не мають ламати одна одну;
  • Durability — після commit дані мають зберегтися навіть після збою.

Важливо: ACID — одна з причин, чому PostgreSQL часто обирають для фінансових, бізнесових і критичних застосунків.

MVCC

MVCC або Multi-Version Concurrency Control — механізм, завдяки якому PostgreSQL дозволяє багатьом транзакціям працювати одночасно без грубого блокування читання.

MVCC означає:

  • читачі не блокують письменників у багатьох сценаріях;
  • транзакція бачить consistent snapshot;
  • старі версії рядків можуть існувати тимчасово;
  • потрібен VACUUM для прибирання старих версій;
  • isolation працює передбачуваніше;
  • concurrency стає ефективнішою.

Цікавий факт: MVCC — одна з причин, чому PostgreSQL може одночасно обслуговувати читання й записи, не перетворюючи кожен запит на чергу очікування.

Транзакції

Транзакція — це група операцій, які виконуються як єдине ціле.

Приклад:

BEGIN;

UPDATE accounts
SET balance = balance - 100
WHERE id = 1;

UPDATE accounts
SET balance = balance + 100
WHERE id = 2;

COMMIT;

Якщо щось пішло не так, можна зробити:

ROLLBACK;

Проста аналогія: транзакція — це як переказ грошей: не можна списати з одного рахунку й “забути” зарахувати на інший.

Таблиці

Таблиці — основа relational model у PostgreSQL.

Таблиця має:

  • columns;
  • rows;
  • data types;
  • constraints;
  • indexes;
  • primary key;
  • foreign keys;
  • default values;
  • generated columns у відповідних сценаріях;
  • permissions.

Приклад:

CREATE TABLE users (
    id bigserial PRIMARY KEY,
    email text NOT NULL UNIQUE,
    name text,
    active boolean NOT NULL DEFAULT true,
    created_at timestamptz NOT NULL DEFAULT now()
);

Практична роль: правильно спроєктована таблиця часто важливіша за десятки оптимізацій пізніше.

Constraints

Constraints захищають якість даних.

PostgreSQL підтримує:

  • PRIMARY KEY;
  • FOREIGN KEY;
  • UNIQUE;
  • NOT NULL;
  • CHECK;
  • EXCLUDE constraints;
  • default values;
  • generated values.

Приклад:

CREATE TABLE products (
    id bigserial PRIMARY KEY,
    name text NOT NULL,
    price numeric(12,2) NOT NULL CHECK (price >= 0)
);

Важливо: constraints краще тримати в базі, а не лише в коді застосунку. Код можна обійти, а database constraint стоїть ближче до даних.

Foreign keys

Foreign key зв’язує таблиці й допомагає зберігати referential integrity.

Приклад:

CREATE TABLE orders (
    id bigserial PRIMARY KEY,
    user_id bigint NOT NULL REFERENCES users(id),
    created_at timestamptz NOT NULL DEFAULT now()
);

Foreign keys корисні для:

  • зв’язку users і orders;
  • захисту від “сирітських” записів;
  • коректної моделі даних;
  • каскадних операцій у частині сценаріїв;
  • підтримки цілісності.

Практична роль: foreign key — це спосіб сказати базі: “цей order не може існувати без реального user”.

Індекси

Індекси прискорюють пошук, сортування й фільтрацію даних.

PostgreSQL підтримує різні типи індексів:

  • B-tree;
  • Hash;
  • GIN;
  • GiST;
  • SP-GiST;
  • BRIN;
  • expression indexes;
  • partial indexes;
  • multicolumn indexes;
  • unique indexes.

Приклад:

CREATE INDEX idx_users_email ON users (email);

Важливо: індекс прискорює читання, але може уповільнювати записи. Індекси потрібно створювати за реальними запитами, а не “про всяк випадок”.

B-tree

B-tree — стандартний і найпоширеніший тип індексу в PostgreSQL.

B-tree добре підходить для:

  • equality search;
  • range queries;
  • ORDER BY;
  • primary keys;
  • unique constraints;
  • timestamp filtering;
  • numeric ranges;
  • text ordering.

Приклад:

CREATE INDEX idx_orders_created_at ON orders (created_at);

Практична роль: якщо не знаєте, який індекс потрібен, найчастіше першим кандидатом буде B-tree.

GIN

GIN індекси часто використовують для JSONB, arrays і full-text search.

Приклад для JSONB:

CREATE INDEX idx_events_payload ON events USING gin (payload);

GIN корисний для:

  • JSONB containment queries;
  • array search;
  • full-text search;
  • document-like data;
  • складних структур.

Цікавий факт: саме GIN + JSONB зробили PostgreSQL дуже привабливою для застосунків, де частина даних має document-like структуру.

BRIN

BRIN індекси корисні для дуже великих таблиць, де дані фізично приблизно впорядковані.

BRIN підходить для:

  • time-series data;
  • logs;
  • append-only tables;
  • telemetry;
  • великих таблиць із timestamp;
  • cheap indexing;
  • data warehouses у частині сценаріїв.

Приклад:

CREATE INDEX idx_logs_created_brin
ON logs USING brin (created_at);

Практична роль: BRIN може бути маленьким і ефективним там, де B-tree став би занадто великим.

JSONB

JSONB — binary JSON-тип у PostgreSQL. Він дозволяє зберігати напівструктуровані дані й виконувати по них запити.

JSONB корисний для:

  • event payloads;
  • flexible metadata;
  • external API responses;
  • feature flags;
  • audit records;
  • document-like fields;
  • mixed structured/unstructured data;
  • прототипів зі змінною схемою.

Приклад:

CREATE TABLE events (
    id bigserial PRIMARY KEY,
    payload jsonb NOT NULL,
    created_at timestamptz NOT NULL DEFAULT now()
);

Запит:

SELECT *
FROM events
WHERE payload @> '{"type": "signup"}';

Важливо: JSONB не означає, що схема більше не потрібна. Дані, які мають чітку структуру й часто використовуються в JOIN, краще зберігати в нормальних columns.

PostGIS

PostGIS — одне з найвідоміших PostgreSQL-розширень для геопросторових даних.

PostGIS використовується для:

  • карт;
  • координат;
  • геозон;
  • distance queries;
  • routes;
  • spatial indexes;
  • location-based services;
  • urban planning;
  • logistics;
  • delivery apps;
  • GIS analytics.

Приклад задачі:

-- Знайти об'єкти поруч із заданою точкою

Цікавий факт: завдяки PostGIS PostgreSQL може бути не просто базою даних, а справжнім GIS-двигуном для картографії й просторової аналітики.

Extensions

PostgreSQL має потужну систему extensions.

Розширення можуть додавати:

  • нові типи даних;
  • функції;
  • індекси;
  • foreign data wrappers;
  • GIS;
  • text search;
  • cryptography;
  • statistics;
  • monitoring;
  • scheduling;
  • vector search у відповідних extensions;
  • audit;
  • replication helpers.

Приклад:

CREATE EXTENSION IF NOT EXISTS pg_trgm;

Головна перевага: extensions — одна з причин, чому PostgreSQL часто називають не просто базою, а платформою для даних.

Schemas

Schema у PostgreSQL — це namespace всередині database.

Schemas допомагають:

  • групувати таблиці;
  • розділяти modules;
  • ізолювати об’єкти;
  • керувати permissions;
  • підтримувати multi-tenant design у частині сценаріїв;
  • уникати конфліктів імен.

Приклад:

CREATE SCHEMA billing;

CREATE TABLE billing.invoices (
    id bigserial PRIMARY KEY,
    amount numeric(12,2) NOT NULL
);

Практична роль: schemas — це як папки для database objects, але з власними правилами доступу й пошуку.

Roles і permissions

PostgreSQL використовує roles для користувачів і груп.

Roles можуть:

  • входити в систему;
  • володіти об’єктами;
  • мати privileges;
  • бути членами інших roles;
  • мати обмеження;
  • використовуватися для application access;
  • розділяти admin і runtime permissions.

Приклад:

CREATE ROLE app_user LOGIN PASSWORD 'change_me';

GRANT CONNECT ON DATABASE appdb TO app_user;
GRANT USAGE ON SCHEMA public TO app_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_user;

Критично: застосунок не має підключатися до production-бази під superuser. Least privilege у PostgreSQL — не прикраса, а базова безпека.

Row-Level Security

Row-Level Security або RLS дозволяє обмежувати доступ до рядків таблиці залежно від policy.

RLS корисна для:

  • multi-tenant SaaS;
  • доступу користувачів лише до своїх даних;
  • isolation;
  • internal admin tools;
  • security-sensitive applications;
  • fine-grained permissions.

Важливо: RLS потужна, але її потрібно ретельно тестувати. Помилка в policy може або заблокувати потрібні дані, або відкрити зайві.

WAL

WAL або Write-Ahead Log — журнал змін PostgreSQL.

WAL потрібен для:

  • crash recovery;
  • replication;
  • point-in-time recovery;
  • durability;
  • backups;
  • streaming replication;
  • logical decoding;
  • data safety.

Проста аналогія: WAL — це чорновий журнал, у який PostgreSQL спочатку записує, що має статися, щоб після збою знати, як відновитися.

Replication

PostgreSQL підтримує різні форми replication.

Типові варіанти:

  • streaming replication;
  • physical replication;
  • logical replication;
  • synchronous replication;
  • asynchronous replication;
  • hot standby;
  • read replicas;
  • cascading replication.

Replication використовується для:

  • high availability;
  • read scaling;
  • disaster recovery;
  • migration;
  • reporting replicas;
  • zero/low downtime upgrades у частині сценаріїв;
  • data distribution.

Важливо: реплікація — не backup. Якщо випадково видалити дані на primary, видалення може швидко потрапити й на replica.

Logical replication

Logical replication передає зміни на рівні таблиць і logical changes.

Вона корисна для:

  • selective replication;
  • міграцій;
  • інтеграції систем;
  • zero-downtime upgrade-підходів;
  • data pipelines;
  • cross-version scenarios;
  • event-driven systems;
  • CDC.

Приклад ідеї:

CREATE PUBLICATION app_pub FOR TABLE users, orders;

Практична роль: logical replication дає більше гнучкості, ніж проста фізична копія всього кластера.

Backups

PostgreSQL потребує надійного backup-плану.

Поширені підходи:

  • logical backup через `pg_dump`;
  • physical backup;
  • base backup;
  • WAL archiving;
  • point-in-time recovery;
  • managed cloud backups;
  • snapshots з database-aware підходом;
  • backup verification;
  • restore drills.

Критично: backup без перевіреного restore — це не backup, а припущення. Відновлення потрібно тестувати.

pg_dump і pg_restore

`pg_dump` створює logical backup бази, а `pg_restore` відновлює dump у custom format.

Приклад:

pg_dump -Fc -d appdb -f appdb.dump
pg_restore -d appdb_restore appdb.dump

Це корисно для:

  • перенесення баз;
  • logical backups;
  • вибіркового відновлення;
  • міграцій;
  • dev/test копій;
  • архівування структури й даних.

Важливо: для великих production-баз одного `pg_dump` може бути недостатньо. Часто потрібні physical backups і WAL archiving.

pg_upgrade

`pg_upgrade` використовується для major version upgrade PostgreSQL.

Він допомагає:

  • перейти між major versions;
  • зменшити downtime;
  • не робити повний dump/restore у великих базах;
  • зберегти data files у підтримуваному сценарії;
  • прискорити upgrade.

Критично: major upgrade PostgreSQL потрібно репетирувати на копії production. Потрібні backup, план rollback, перевірка extensions і тест застосунку.

VACUUM

VACUUM прибирає старі row versions, які виникають через MVCC.

VACUUM важливий для:

  • контролю bloat;
  • звільнення простору для reuse;
  • коректної statistics maintenance;
  • запобігання transaction ID wraparound;
  • стабільної продуктивності;
  • autovacuum.

Приклад:

VACUUM ANALYZE users;

Важливо: вимкнути autovacuum без дуже вагомої причини — один із найшвидших способів отримати проблеми в PostgreSQL.

EXPLAIN

EXPLAIN показує query plan.

Приклад:

EXPLAIN ANALYZE
SELECT *
FROM orders
WHERE user_id = 42
ORDER BY created_at DESC
LIMIT 20;

EXPLAIN допомагає зрозуміти:

  • чи використовується індекс;
  • де full scan;
  • скільки рядків читається;
  • які join algorithms;
  • де bottleneck;
  • чи правильна statistics;
  • чому запит повільний.

Практична роль: EXPLAIN — це рентген для SQL-запиту. Без нього оптимізація часто перетворюється на вгадування.

Query planner

Query planner вирішує, як виконати SQL-запит.

Він враховує:

  • indexes;
  • table statistics;
  • row estimates;
  • join order;
  • join algorithms;
  • filters;
  • sort cost;
  • parallel execution;
  • work_mem;
  • data distribution.

Важливо: якщо statistics застарілі, planner може вибрати поганий план навіть для правильно написаного запиту.

Partitioning

Partitioning дозволяє розбивати велику таблицю на частини.

Partitioning корисний для:

  • time-series data;
  • logs;
  • events;
  • billing data;
  • великих таблиць;
  • швидшого видалення старих даних;
  • partition pruning;
  • maintenance;
  • архівування.

Приклад ідеї:

CREATE TABLE events (
    id bigint,
    created_at date NOT NULL,
    payload jsonb
) PARTITION BY RANGE (created_at);

Практична роль: partitioning не робить базу магічно швидкою, але може сильно допомогти, якщо дані природно діляться за часом або діапазонами.

Views і materialized views

View — збережений SQL-запит, який поводиться як віртуальна таблиця.

Materialized view зберігає результат фізично й потребує refresh.

Приклад:

CREATE VIEW active_users AS
SELECT id, email
FROM users
WHERE active = true;

Materialized view корисна для:

  • precomputed reports;
  • dashboards;
  • складних aggregates;
  • read-heavy workloads;
  • аналітики.

Важливо: materialized view може прискорити читання, але потрібно планувати, коли й як її оновлювати.

Stored procedures і functions

PostgreSQL дозволяє писати functions і procedures.

Мови можуть включати:

  • SQL;
  • PL/pgSQL;
  • PL/Python у відповідних сценаріях;
  • інші procedural languages через extensions.

Приклад:

CREATE FUNCTION add_numbers(a int, b int)
RETURNS int
LANGUAGE sql
AS $$
    SELECT a + b;
$$;

Практична роль: database functions корисні, коли логіка має бути близько до даних, але надмірна бізнес-логіка в базі може ускладнити підтримку.

Triggers

Trigger автоматично виконує функцію при зміні даних.

Triggers використовують для:

  • audit logs;
  • автоматичних timestamps;
  • denormalized counters;
  • validation;
  • change tracking;
  • history tables;
  • business rules у частині сценаріїв.

Важливо: triggers можуть бути дуже корисними, але прихована логіка в базі іноді ускладнює debugging.

PostgreSQL має вбудовані можливості full-text search.

Full-text search корисний для:

  • пошуку по статтях;
  • пошуку по товарах;
  • документації;
  • blog search;
  • internal search;
  • ranking;
  • language dictionaries;
  • search vectors.

Приклад:

SELECT *
FROM articles
WHERE to_tsvector('english', body) @@ plainto_tsquery('english', 'database index');

Практична роль: для невеликого й середнього пошуку PostgreSQL може замінити окремий search engine, але для великих search-платформ можуть знадобитися спеціалізовані рішення.

Foreign data wrappers

Foreign data wrappers або FDW дозволяють PostgreSQL працювати з зовнішніми джерелами даних як із таблицями.

FDW можуть використовуватися для:

  • іншої PostgreSQL-бази;
  • CSV/files;
  • зовнішніх SQL-систем;
  • data integration;
  • migration;
  • federation;
  • reporting;
  • ETL-процесів.

Цікавий факт: PostgreSQL може не лише зберігати дані, а й “дивитися” в інші системи через foreign data wrappers.

psql

psql — стандартний command-line client для PostgreSQL.

psql дозволяє:

  • виконувати SQL;
  • переглядати таблиці;
  • запускати scripts;
  • перевіряти connection;
  • використовувати meta-commands;
  • експортувати результати;
  • адмініструвати базу;
  • працювати в terminal.

Приклади:

psql -d appdb
\dt
\d users
\x

Практична роль: psql — це інструмент, який варто знати навіть тим, хто зазвичай користується GUI.

pgAdmin

pgAdmin — популярний графічний інструмент для PostgreSQL.

pgAdmin корисний для:

  • перегляду databases;
  • виконання SQL;
  • адміністрування ролей;
  • перегляду схем;
  • роботи з таблицями;
  • backup/restore у частині сценаріїв;
  • візуального аналізу об’єктів;
  • навчання.

Важливо: GUI зручний, але для production-адміністрування все одно потрібно розуміти SQL, permissions, backups і logs.

PgBouncer

PgBouncer — connection pooler для PostgreSQL.

Він корисний, коли застосунок відкриває багато database connections.

PgBouncer допомагає:

  • зменшити кількість backend connections;
  • покращити latency;
  • захистити PostgreSQL від connection storm;
  • краще використовувати resources;
  • працювати з web apps;
  • масштабувати application servers.

Практична роль: PostgreSQL connections не безкоштовні. PgBouncer часто рятує системи, де застосунок створює забагато підключень.

High availability

High availability для PostgreSQL зазвичай будується з кількох компонентів.

Можливі елементи:

  • primary;
  • standby replicas;
  • streaming replication;
  • failover manager;
  • Patroni;
  • etcd або Consul у частині сценаріїв;
  • load balancer;
  • PgBouncer;
  • backup system;
  • monitoring;
  • alerting;
  • runbooks.

Критично: high availability не замінює backup. HA захищає від простою, але не від випадкового DELETE, помилки міграції або ransomware.

Monitoring

PostgreSQL потрібно моніторити.

Важливі метрики:

  • connections;
  • query latency;
  • locks;
  • deadlocks;
  • replication lag;
  • cache hit ratio;
  • index usage;
  • table bloat;
  • autovacuum activity;
  • WAL generation;
  • disk usage;
  • CPU;
  • memory;
  • I/O;
  • slow queries.

Практична роль: PostgreSQL зазвичай попереджає про проблеми метриками задовго до повної аварії.

Performance tuning

PostgreSQL tuning включає багато рівнів.

Потрібно враховувати:

  • SQL-запити;
  • індекси;
  • schema design;
  • statistics;
  • VACUUM;
  • memory settings;
  • connection pooling;
  • disk I/O;
  • WAL settings;
  • partitioning;
  • hardware;
  • application behavior;
  • transactions length;
  • locks;
  • caching.

Важливо: найкращий performance tuning часто починається не з конфігурації сервера, а з правильного індексу або переписаного SQL-запиту.

Locks і deadlocks

PostgreSQL використовує locks для захисту даних і schema changes.

Проблеми можуть виникати через:

  • довгі транзакції;
  • migrations у peak time;
  • неправильний порядок оновлень;
  • unindexed foreign keys;
  • manual locks;
  • DDL у production;
  • idle in transaction;
  • deadlocks.

Критично: “idle in transaction” у production може тримати ресурси, заважати VACUUM і створювати дивні проблеми.

Міграції schema

Schema migrations змінюють структуру бази.

Вони можуть включати:

  • CREATE TABLE;
  • ALTER TABLE;
  • CREATE INDEX;
  • backfill;
  • data migration;
  • constraint validation;
  • column rename;
  • table partitioning;
  • rollback plan.

Практична порада: великі schema migrations потрібно робити поступово: додати column, backfill, перевірити, перемкнути код, прибрати старе.

PostgreSQL і MySQL

Критерій PostgreSQL MySQL
Тип Object-relational database Relational database
SQL features Дуже сильний і розширюваний SQL Широко використовуваний, простий старт
JSON JSONB із потужними індексами JSON-підтримка є, але інша за моделлю
Extensions Дуже сильна extension ecosystem Менш центральна роль extensions
Типові сценарії Складні запити, data integrity, GIS, enterprise Web apps, CMS, LAMP-екосистема, прості deployment

Висновок: MySQL часто простіший для старту в класичних web-сценаріях, а PostgreSQL сильніший у складному SQL, data integrity, extensibility і GIS.

PostgreSQL і SQLite

Критерій PostgreSQL SQLite
Архітектура Server-based database Embedded file-based database
Concurrency Краще для багатьох користувачів і серверних застосунків Чудова для локальних і невеликих сценаріїв
Адміністрування Потрібен server process Один файл бази
Типові задачі Web apps, enterprise, SaaS, analytics Mobile apps, desktop apps, local storage, tests

Висновок: SQLite прекрасна для локальної бази, а PostgreSQL — для server-side систем із багатьма користувачами, транзакціями й складними запитами.

PostgreSQL і MongoDB

Критерій PostgreSQL MongoDB
Модель Relational + JSONB Document database
SQL Основна мова Не SQL-first
Schema Чітка схема плюс JSONB Гнучкі документи
Transactions Сильна SQL-транзакційність Транзакції є, але інша модель
Коли доречно Data integrity, joins, relational model, mixed structured data Document-first workloads, flexible document model

Висновок: PostgreSQL часто кращий, коли потрібні SQL, joins і цілісність даних, а MongoDB — коли вся модель справді document-first.

PostgreSQL і Oracle Database

Критерій PostgreSQL Oracle Database
Ліцензія Open source PostgreSQL License Комерційна enterprise СКБД
Вартість Без ліцензійної плати за community version Комерційне ліцензування
Enterprise features Багато можливостей + extensions/ecosystem Дуже сильний enterprise stack
Міграція Можлива, але потребує аналізу SQL, procedures і типів Legacy enterprise-системи

Висновок: PostgreSQL часто обирають як open source альтернативу для частини Oracle-сценаріїв, але міграція складних enterprise-систем потребує ретельного аналізу.

PostgreSQL у хмарі

PostgreSQL доступний у багатьох cloud-сценаріях:

  • self-managed VM;
  • managed PostgreSQL;
  • Amazon RDS;
  • Amazon Aurora PostgreSQL-Compatible;
  • Google Cloud SQL;
  • AlloyDB;
  • Azure Database for PostgreSQL;
  • Kubernetes operators;
  • Neon;
  • Supabase;
  • Crunchy Data;
  • EDB;
  • Aiven;
  • Timescale Cloud.

Практична роль: managed PostgreSQL зменшує частину адміністративної роботи, але не скасовує потребу в schema design, індексах, backup-політиці й query tuning.

Безпека PostgreSQL

Безпека PostgreSQL включає:

  • roles;
  • least privilege;
  • SCRAM authentication;
  • TLS;
  • network restrictions;
  • pg_hba.conf;
  • row-level security;
  • audit logging;
  • secret management;
  • encryption at rest на рівні платформи;
  • backups encryption;
  • patching;
  • extension review;
  • monitoring;
  • access logs.

Критично: PostgreSQL не можна виставляти у відкритий інтернет без сильного захисту. База має бути за firewall, private network або контрольованим доступом.

pg_hba.conf

`pg_hba.conf` керує тим, хто й як може підключатися до PostgreSQL.

Він визначає:

  • connection type;
  • database;
  • user;
  • address;
  • authentication method.

Приклад ідеї:

host    appdb    app_user    10.0.0.0/24    scram-sha-256

Важливо: помилка в pg_hba.conf може або заблокувати легальних користувачів, або відкрити доступ зайвим адресам.

Типові помилки початківців

Поширені помилки:

  • не створити індекс для частого WHERE;
  • створити забагато індексів;
  • підключатися до бази під superuser;
  • не налаштувати backups;
  • не тестувати restore;
  • не читати EXPLAIN;
  • тримати довгі транзакції;
  • ігнорувати VACUUM;
  • зберігати все в JSONB без схеми;
  • робити schema migrations без плану;
  • відкривати PostgreSQL у public internet;
  • не використовувати connection pooling;
  • плутати replica з backup;
  • не моніторити disk usage;
  • оновлювати major version без репетиції.

Небезпека: PostgreSQL може довго пробачати помилки, але потім одна погана міграція, відсутній backup або заповнений диск стають великою аварією.

Хороші практики PostgreSQL

Рекомендовано:

  • проєктувати schema свідомо;
  • використовувати constraints;
  • створювати індекси під реальні запити;
  • аналізувати EXPLAIN ANALYZE;
  • тримати autovacuum увімкненим;
  • налаштувати backups і restore drills;
  • використовувати least privilege;
  • не підключатися з застосунку під superuser;
  • використовувати connection pooling;
  • моніторити slow queries;
  • тестувати migrations;
  • стежити за replication lag;
  • планувати major upgrades;
  • перевіряти extensions перед upgrade;
  • зберігати runbook для аварій;
  • не плутати JSONB із заміною всієї relational model.

Головне правило: PostgreSQL найкраще працює, коли база — це не просто “місце для зберігання”, а добре спроєктована частина архітектури.

Переваги PostgreSQL

Основні переваги PostgreSQL:

  • open source;
  • permissive PostgreSQL License;
  • сильна SQL-підтримка;
  • ACID;
  • MVCC;
  • advanced indexes;
  • JSONB;
  • PostGIS;
  • extensions;
  • replication;
  • partitioning;
  • full-text search;
  • stored procedures;
  • views і materialized views;
  • roles і permissions;
  • strong data integrity;
  • активна спільнота;
  • широка cloud-підтримка;
  • хороша документація;
  • підходить для startup і enterprise.

Головна перевага: PostgreSQL дає дуже сильну базу даних без ліцензійного бар’єра й з величезною екосистемою.

Обмеження PostgreSQL

PostgreSQL має обмеження.

Можливі проблеми:

  • потребує грамотного адміністрування;
  • великі write-heavy workloads потребують tuning;
  • MVCC створює bloat без правильного VACUUM;
  • horizontal sharding не є “однією кнопкою”;
  • складні major upgrades потребують плану;
  • connection count потрібно контролювати;
  • неправильні індекси можуть шкодити;
  • великий JSONB без схеми може стати хаосом;
  • HA потребує додаткової архітектури;
  • managed cloud не скасовує оптимізацію запитів;
  • дуже великі analytics workloads можуть потребувати спеціалізованих систем.

Помилка: вважати, що PostgreSQL автоматично вирішить усі проблеми з даними. Погана схема й погані запити можуть зламати навіть дуже хорошу базу.

Коли варто використовувати PostgreSQL

PostgreSQL добре підходить, якщо потрібно:

  • relational database;
  • SQL;
  • транзакції;
  • data integrity;
  • joins;
  • JSONB разом із relational data;
  • GIS через PostGIS;
  • strong constraints;
  • complex queries;
  • reporting;
  • web backend;
  • SaaS;
  • enterprise applications;
  • open source database;
  • extensibility;
  • cloud portability;
  • mature ecosystem.

Практична порада: PostgreSQL часто є хорошим default choice для backend-бази, якщо немає чіткої причини обирати іншу систему.

Коли PostgreSQL може бути невдалим вибором

PostgreSQL може бути не найкращим вибором, якщо:

  • потрібна тільки локальна embedded database — SQLite може бути простішою;
  • потрібен extreme distributed write scale без складної архітектури;
  • workload повністю document-first і не потребує SQL;
  • потрібен спеціалізований search engine на рівні Elasticsearch/OpenSearch;
  • потрібна massive columnar analytics platform;
  • команда не готова адмініструвати backup, VACUUM, indexes і monitoring;
  • застосунок створює тисячі connections без pooling;
  • потрібна база “без схеми” через поганий дизайн, а не через реальну потребу.

Важливо: PostgreSQL універсальна, але не чарівна. Для деяких workloads краще спеціалізовані системи.

Цікаві факти про PostgreSQL

  • PostgreSQL часто називають Postgres, і це нормальна коротка назва.
  • PostgreSQL походить від Berkeley POSTGRES.
  • PostgreSQL має власну permissive PostgreSQL License, схожу за духом до BSD/MIT.
  • PostGIS перетворює PostgreSQL на сильну GIS-платформу.
  • JSONB дозволяє зберігати document-like дані, але при цьому залишатися в SQL-світі.
  • MVCC дає PostgreSQL сильну concurrency-модель, але потребує VACUUM.
  • EXPLAIN ANALYZE — один із найважливіших інструментів для оптимізації.
  • Реплікація — це не backup.
  • PostgreSQL може бути маленькою базою для pet project і серйозною production-базою для великого бізнесу.
  • Багато сучасних “database products” фактично будуються навколо PostgreSQL або його extensions.

Найлюдяніший факт: PostgreSQL подобається розробникам не лише тому, що вона безкоштовна. Вона подобається тому, що часто поводиться чесно: якщо добре спроєктувати дані й запити, вона відповідає стабільністю.

Приклади сценаріїв використання

SaaS backend

PostgreSQL зберігає користувачів, підписки, платежі, permissions, audit logs і application data.

Інтернет-магазин

Таблиці products, orders, users, payments і inventory працюють із constraints, transactions і indexes.

GIS-сервіс

PostGIS дозволяє шукати об’єкти поруч, будувати геозони й виконувати spatial queries.

Event logging

JSONB зберігає payload подій, а BRIN або partitioning допомагають працювати з великими time-based таблицями.

Internal analytics

Materialized views, aggregates і read replica допомагають робити звіти без надмірного навантаження на primary.

Підказка: якщо застосунок росте, PostgreSQL краще масштабувати поступово: індекси, pooling, query tuning, replicas, partitioning, а вже потім складні distributed-рішення.

Приклад базової схеми

CREATE TABLE customers (
    id bigserial PRIMARY KEY,
    email text NOT NULL UNIQUE,
    name text NOT NULL,
    created_at timestamptz NOT NULL DEFAULT now()
);

CREATE TABLE orders (
    id bigserial PRIMARY KEY,
    customer_id bigint NOT NULL REFERENCES customers(id),
    total numeric(12,2) NOT NULL CHECK (total >= 0),
    status text NOT NULL DEFAULT 'new',
    created_at timestamptz NOT NULL DEFAULT now()
);

CREATE INDEX idx_orders_customer_id ON orders (customer_id);
CREATE INDEX idx_orders_created_at ON orders (created_at);

Практична роль: навіть проста схема вже показує сильні сторони PostgreSQL: primary key, foreign key, check constraint, defaults і indexes.

Приклад backup-команд

pg_dump -Fc -d appdb -f appdb.dump
createdb appdb_restore
pg_restore -d appdb_restore appdb.dump

Критично: backup-команди потрібно тестувати на реальних розмірах даних і з реальним restore-процесом, а не лише записати в документацію.

Джерела

  • Офіційний сайт PostgreSQL.
  • PostgreSQL Documentation.
  • PostgreSQL Release Notes.
  • PostgreSQL Versioning Policy.
  • PostgreSQL License.
  • PostgreSQL Wiki.
  • Документація щодо SQL, MVCC, WAL, replication, JSONB, indexes, extensions, PostGIS, backup, pg_dump, pg_restore, pg_upgrade, VACUUM, EXPLAIN і security.
  • Матеріали щодо relational databases, open source databases, cloud PostgreSQL, high availability, monitoring і database performance tuning.

Висновок

PostgreSQL — це одна з найсильніших open source баз даних для сучасних застосунків. Вона поєднує SQL, ACID, MVCC, constraints, advanced indexes, JSONB, PostGIS, extensions, replication, backup-інструменти, security-модель і permissive PostgreSQL License.

PostgreSQL добре підходить для web backend, SaaS, enterprise applications, GIS, аналітики, фінансових систем, internal tools і багатьох cloud-сценаріїв. Водночас вона потребує дисципліни: schema design, indexes, backups, VACUUM, monitoring, security, migrations і upgrade planning мають бути продуманими.

Головна думка: PostgreSQL — це не просто “місце, куди складати дані”. Це зріла платформа для роботи з даними, яка винагороджує правильну архітектуру й уважне адміністрування.

Див. також

Тематичні мітки