PostgreSQL
PostgreSQL 18
</div>
</div>
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
== Індекси ==
<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">
SELECT *
CREATE INDEX idx_logs_created_brin
Небезпека: PostgreSQL здатна довго пробачати помилки, але потім одна погана міграція, відсутній backup або заповнений диск стають великою аварією. FDW можуть використовуватися для: WHERE payload @> '{"type": "signup"}'; UPDATE accounts
Проблеми можуть виникати через:
Цікавий факт: PostgreSQL здатна не лише зберігати інформаційні дані, а й “дивитися” в інші системи через foreign data wrappers. Погана схема й погані запити можуть зламати навіть дуже хорошу базу. * Реплікація — це не backup. Потрібні backup, план rollback, перевірка extensions і тест застосунку.
Приклад:
Internal analytics
BRIN індекси корисні для дуже великих таблиць, де інформаційні дані фізично приблизно впорядковані.== Full-text search ==
</syntaxhighlight>
pg_upgrade
pg_dump -Fc -d appdb -f appdb.dump
BRIN
Приклад:
Критично: backup без перевіреного restore — це не backup, а припущення. * precomputed reports;
- dashboards;
- складних aggregates;
- read-heavy workloads;
- аналітики. Пізніше платформа отримала SQL-підтримку й назву PostgreSQL. Це означає, що вона не обмежується мінімальним набором relational database-функцій. ! PostgreSQL поширюється під PostgreSQL License. B-tree — стандартний і найпоширеніший тип індексу в PostgreSQL. База має бути за firewall, private network або контрольованим доступом.== Stored procedures і functions ==
RLS корисна для: </syntaxhighlight>
);
JSONB
Приклад:
SELECT *
- зв’язку users і orders;
- захисту від “сирітських” записів;
- коректної моделі даних;
- каскадних операцій у частині сценаріїв;
- підтримки цілісності.
- SQL-запити;
- індекси;
- schema design;
- statistics;
- VACUUM;
- memory settings;
- connection pooling;
- disk I/O;
- WAL settings;
- partitioning;
- hardware;
- application behavior;
- transactions length;
- locks;
- caching. PostgreSQL — це одна з найсильніших open source баз даних для сучасних застосунків. MongoDB
Критично: high availability не замінює backup. інформаційні дані, які мають чітку структуру й часто використовуються в JOIN, краще зберігати в нормальних columns.</syntaxhighlight>
Практична роль: для невеликого й середнього пошуку PostgreSQL здатна замінити окремий search engine, але для великих search-платформ можуть знадобитися спеціалізовані рішення для бізнесу.
);
MVCC означає:
VACUUM ANALYZE users;
FROM articles Потрібно враховувати: Він визначає:
name text NOT NULL,
- JSONB containment queries;
- array search;
- full-text search;
- document-like data;
- складних структур. SELECT id, email
- audit logs;
- автоматичних timestamps;
- denormalized counters;
- validation;
- change tracking;
- history tables;
- business rules у частині сценаріїв. * 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. Приклад:
Загальний SEO-опис
id bigserial PRIMARY KEY,
</syntaxhighlight> SET balance = balance + 100
id bigserial PRIMARY KEY,
Trigger автоматизовано виконує функцію при зміні даних. FROM users
SQL
Full-text search корисний для:
amount numeric(12,2) NOT NULL
Критично: “idle in transaction” у production здатна тримати ресурси, заважати VACUUM і створювати дивні проблеми.
) PARTITION BY RANGE (created_at);
Транзакції
id bigserial PRIMARY KEY,
</syntaxhighlight>
Найлюдяніший факт: PostgreSQL подобається розробникам не лише тому, що вона безкоштовна.Schemas
<syntaxhighlight lang="sql">
PostgreSQL здатна бути не найкращим вибором, якщо:
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
<syntaxhighlight lang="sql">
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
CREATE INDEX idx_orders_customer_id ON orders (customer_id);
'''Практична роль:''' навіть проста схема вже показує сильні сторони PostgreSQL: primary key, foreign key, check constraint, defaults і indexes. email text NOT NULL UNIQUE,
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
== Locks і deadlocks ==
<syntaxhighlight lang="sql">
</div>
</div>
== Хороші практики PostgreSQL ==
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
Приклад:
'''Практична роль:''' PostgreSQL 18 варто розглядати для нових проєктів і планових оновлень, але production upgrade потрібно тестувати на копії даних. * PostgreSQL License.</div>
* 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. name text NOT NULL,
</div>
</div>
'''Висновок:''' PostgreSQL часто кращий, коли потрібні SQL, joins і цілісність даних, а MongoDB — коли вся модель справді document-first. );
* '''Atomicity''' — транзакція виконується на 100% або не виконується;
* '''Consistency''' — інформаційні дані переходять між коректними станами;
* '''Isolation''' — паралельні транзакції не мають ламати одна одну;
* '''Durability''' — після commit інформаційні дані мають зберегтися навіть після збою.<syntaxhighlight lang="sql">
High availability для PostgreSQL зазвичай будується з кількох компонентів.
Replication застосовується для для:
'''Практична роль:''' SQL у PostgreSQL дає можливість описувати не “як пройти по даних”, а “який результат потрібен”. * іншої PostgreSQL-бази;
* CSV/files;
* зовнішніх SQL-систем;
* data integration;
* migration;
* federation;
* reporting;
* ETL-процесів.<syntaxhighlight lang="sql">
<syntaxhighlight lang="sql">
== PgBouncer ==
== PostgreSQL і MongoDB ==
LIMIT 20;
<div style="background:#f0eaff; border-left:6px solid #8e44ad; padding:12px; margin:12px 0;">
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
<syntaxhighlight lang="sql">
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
</div>
payload jsonb NOT NULL,
'''Практична роль:''' PostgreSQL зазвичай попереджає про проблеми метриками задовго до повної аварії. ! '''Практична роль:''' partitioning не робить базу магічно швидкою, але здатна сильно допомогти, якщо інформаційні дані природно діляться за часом або діапазонами. pg_dump -Fc -d appdb -f appdb.dump
== Backups ==
* карт;
* координат;
* геозон;
* distance queries;
* routes;
* spatial indexes;
* location-based services;
* urban planning;
* logistics;
* delivery apps;
* GIS analytics. Помилка в policy здатна або заблокувати потрібні інформаційні дані, або відкрити зайві. * 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.</div>
PostgreSQL називають '''object-relational database management system'''. * 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-сервісів.<div style="background:#f0eaff; border-left:6px solid #8e44ad; padding:12px; margin:12px 0;">
</div>
'''Query planner''' вирішує, як виконати SQL-запит. '''Практична роль:''' database functions корисні, коли логіка має бути близько до даних, але надмірна бізнес-логіка в базі здатна ускладнити підтримку.== Типові помилки початківців ==
pg_restore -d appdb_restore appdb.dump
Вона застосовується для; так само реалізовано бізнес-систем, фінансових сервісів, аналітики, геоданих, SaaS-платформ, API, data engineering, backend-розробки, enterprise-інфраструктури й дослідницьких проєктів. ! Через SQL можна:
High availability
BRIN підходить для:
PostgreSQL часто називають “найпросунутішою open source relational database” не через красивий слоган, а через поєднання речей, які рідко зустрічаються разом: сувора транзакційність, розширюваність, JSONB, PostGIS, складні індекси, SQL-функції, реплікація, foreign data wrappers і зріла спільнота.- SQL;
- PL/pgSQL;
- PL/Python у відповідних сценаріях;
- інші procedural languages через extensions. PgBouncer часто рятує системи, де застосунок створює забагато підключень. Якщо щось пішло не так, можна зробити:
MVCC
У PostgreSQL tuning передбачено багато рівнів. * створювати таблиці;
- вставляти інформаційні дані;
- читати інформаційні дані;
- оновлювати записи;
- видаляти записи;
- створювати індекси;
- об’єднувати таблиці;
- писати аналітичні запити;
- створювати views;
- керувати транзакціями;
- налаштовувати permissions;
- викликати functions.== EXPLAIN ==
Constraints
Приклад:
- проєктувати 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.</syntaxhighlight>
Приклади сценаріїв використання
psql дає можливість:
COMMIT;
Тематичні мітки
GRANT CONNECT ON DATABASE appdb TO app_user;
Коли PostgreSQL здатна бути невдалим вибором
PostGIS застосовується для для:
=== Інтернет-магазин ===
PostgreSQL поєднує класичну relational database model із розширюваністю: підтримує SQL, транзакції, індекси, constraints, stored procedures, views, triggers, JSONB, extensions, replication, full-text search, foreign data wrappers і багато інших можливостей. Materialized view корисна для:
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
pgAdmin корисний для:
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_user; CREATE TABLE orders (
B-tree добре підходить для: </syntaxhighlight>
<syntaxhighlight lang="sql">
'''Головна думка:''' PostgreSQL — це не без зусиль “місце, куди складати інформаційні дані”. MySQL
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
</div>
AS $$
</div>
id bigserial PRIMARY KEY,
</div>
* офіційний сайт PostgreSQL. * Документація щодо SQL, MVCC, WAL, replication, JSONB, indexes, extensions, PostGIS, backup, pg_dump, pg_restore, pg_upgrade, VACUUM, EXPLAIN і security. customer_id bigint NOT NULL REFERENCES customers(id),
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
== pgAdmin ==
'''Constraints''' захищають якість даних.== WAL ==
'''Цікавий факт:''' через PostGIS PostgreSQL здатна бути не без зусиль базою даних, а справжнім GIS-двигуном для картографії й просторової аналітики. * CREATE TABLE;
* ALTER TABLE;
* CREATE INDEX;
* backfill;
* data migration;
* constraint validation;
* column rename;
* table partitioning;
* rollback plan. Roles можуть:
== Logical replication ==
'''критично:''' RLS потужна, але її потрібно ретельно тестувати. WHERE id = 2;
{| class="wikitable"
!== Цікавий факт ==
* читачі не блокують письменників у багатьох сценаріях;
* транзакція бачить consistent snapshot;
* старі версії рядків можуть існувати тимчасово;
* потрібен VACUUM для прибирання старих версій;
* isolation функціонує передбачуваніше;
* concurrency стає ефективнішою. Він дає можливість зберігати напівструктуровані інформаційні дані й виконувати по них запити.<syntaxhighlight lang="sql">
! '''критично:''' JSONB не означає, що схема більше не потрібна.== Query planner ==
* PostgreSQL часто називають Postgres, і це нормальна коротка назва.<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
== Див. так само ==
Поширені помилки:
== конкурентні переваги PostgreSQL ==
<syntaxhighlight lang="sql">
Він враховує:
!== Міграції schema ==
<div style="background:#fdecea; border-left:6px solid #e74c3c; padding:12px; margin:12px 0;">
</div>
EXPLAIN оптимізує зрозуміти:
<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">
через '''Foreign key''' зв’язує таблиці й користувачі можуть зберігати referential integrity. * time-series data;
* logs;
* events;
* billing data;
* великих таблиць;
* швидшого видалення старих даних;
* partition pruning;
* maintenance;
* архівування. '''Перевага:''' PostgreSQL License дуже business-friendly: компанії можуть використовувати PostgreSQL у продуктах без copyleft-вимоги відкривати власний код. PostgreSQL
psql -d appdb
'''Критично:''' major upgrade PostgreSQL потрібно репетирувати на копії production.</div>
Приклад ідеї:
* довгі транзакції;
* migrations у peak time;
* неправильний порядок оновлень;
* unindexed foreign keys;
* manual locks;
* DDL у production;
* idle in transaction;
* deadlocks. * Матеріали щодо relational databases, open source databases, cloud PostgreSQL, high availability, monitoring і database performance tuning. '''Практична роль:''' EXPLAIN — це рентген для SQL-запиту. * PostgreSQL Wiki. );
'''Помилка:''' вважати, що PostgreSQL автоматизовано вирішить усі проблеми з даними.<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
Мови можуть включати:
pg_restore -d appdb_restore appdb.dump
'''MVCC''' або '''Multi-Version Concurrency Control''' — механізм, через якому PostgreSQL дає можливість багатьом транзакціям працювати одночасно без грубого блокування читання. Відновлення потрібно тестувати. EXPLAIN ANALYZE
<div style="background:#fdecea; border-left:6px solid #e74c3c; padding:12px; margin:12px 0;">
<div style="background:#f0eaff; border-left:6px solid #8e44ad; padding:12px; margin:12px 0;">
'''Головне правило:''' PostgreSQL найкраще функціонує, коли база — це не без зусиль “місце для зберігання”, а добре спроєктована частина архітектури.</div>
\x
'''Практична роль:''' BRIN здатна бути маленьким і ефективним там, де B-tree став би занадто великим.</div>
'''критично:''' materialized view здатна прискорити читання, але потрібно планувати, коли й як її оновлювати. PostgreSQL
PostgreSQL доступний у багатьох cloud-сценаріях:
== pg_dump і pg_restore ==
createdb appdb_restore
* пошуку по статтях;
* пошуку по товарах;
* документації;
* blog search;
* internal search;
* ranking;
* language dictionaries;
* search vectors. HA захищає від простою, але не від випадкового DELETE, помилки міграції або ransomware.</div>
* selective replication;
* міграцій;
* інтеграції систем;
* zero-downtime upgrade-підходів;
* data pipelines;
* cross-version scenarios;
* event-driven systems;
* CDC.</div>
== PostgreSQL License ==
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
== Безпека PostgreSQL ==
created_at timestamptz NOT NULL DEFAULT now()
== Приклад backup-команд ==
* використовувати PostgreSQL без ліцензійної плати;
* запускати в комерційних продуктах;
* змінювати код;
* поширювати копії;
* використовувати в proprietary systems;
* створювати комерційні сервіси;
* будувати managed database platforms;
* використовувати PostgreSQL у SaaS. Foreign keys корисні для:
== Performance tuning ==
критично: ACID — одна з причин, чому PostgreSQL часто обирають для фінансових, бізнесових і критичних застосунків.
</div>
active boolean NOT NULL DEFAULT true,
PostgreSQL 18 важлива для:
* connection type;
* database;
* user;
* address;
* authentication method. `pg_upgrade` застосовують, коли потрібно для major version upgrade PostgreSQL. Приклад:
WHERE user_id = 42
created_at timestamptz NOT NULL DEFAULT now()
FROM events
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
'''критично:''' індекс прискорює читання, але здатна уповільнювати записи. ORDER BY created_at DESC
* equality search;
* range queries;
* ORDER BY;
* primary keys;
* unique constraints;
* timestamp filtering;
* numeric ranges;
* text ordering. '''критично:''' triggers можуть бути дуже корисними, але прихована логіка в базі іноді ускладнює debugging. |-
| технічна архітектура
| Server-based database
| Embedded file-based database
|-
| Concurrency
| Краще для багатьох користувачів і серверних застосунків
| Чудова для локальних і невеликих сценаріїв
|-
| Адміністрування
| Потрібен server process
| Один файл бази
|-
| Типові задачі
| Web apps, enterprise, SaaS, analytics
| Mobile apps, desktop apps, local storage, tests
|}
'''Практична роль:''' якщо не знаєте, який індекс потрібен, найчастіше першим кандидатом буде B-tree. '''Row-Level Security''' або '''RLS''' дає можливість обмежувати доступ до рядків таблиці залежно від policy. * PostgreSQL Release Notes.<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
PostgreSQL License дає можливість:
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
'''Практична роль:''' logical replication дає більше гнучкості, ніж проста фізична копія всього кластера. \d users
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
'''View''' — збережений SQL-запит, який поводиться як віртуальна таблиця.== Views і materialized views ==
PostgreSQL потребує надійного backup-плану. '''Висновок:''' SQLite прекрасна для локальної бази, а PostgreSQL — для server-side систем із багатьма користувачами, транзакціями й складними запитами.</div>
Важливі метрики:
PostgreSQL добре підходить, якщо потрібно:
* перегляду databases;
* виконання SQL;
* адміністрування ролей;
* перегляду схем;
* роботи з таблицями;
* backup/restore у частині сценаріїв;
* візуального аналізу об’єктів;
* навчання. Критерій
payload jsonb
VACUUM важливий для:
== Джерела ==
</div>
</div>
ROLLBACK;
<div style="background:#fdecea; border-left:6px solid #e74c3c; padding:12px; margin:12px 0;">
== Приклад базової схеми ==
'''VACUUM''' прибирає старі row versions, які виникають через MVCC.<syntaxhighlight lang="sql">
== B-tree ==
LANGUAGE sql
* входити в систему;
* володіти об’єктами;
* мати privileges;
* бути членами інших roles;
* мати обмеження;
* використовуватися для application access;
* розділяти admin і runtime permissions. '''PgBouncer''' — connection pooler для PostgreSQL. '''WAL''' або '''Write-Ahead Log''' — журнал змін PostgreSQL. Приклад:
* потрібна тільки локальна embedded database — SQLite здатна бути простішою;
* потрібен extreme distributed write scale без складної архітектури;
* workload на 100% document-first і не потребує SQL;
* потрібен спеціалізований search engine на рівні Elasticsearch/OpenSearch;
* потрібна massive columnar analytics platform;
* команда не готова адмініструвати backup, VACUUM, indexes і monitoring;
* застосунок створює тисячі connections без pooling;
* потрібна база “без схеми” через поганий дизайн, а не через реальну потребу.</div>
* crash recovery;
* replication;
* point-in-time recovery;
* durability;
* backups;
* streaming replication;
* logical decoding;
* data safety.<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
PostgreSQL добре підходить для web backend, SaaS, enterprise applications, GIS, аналітики, фінансових систем, internal tools і багатьох cloud-сценаріїв. це потужна open source об’єктно-реляційна платформа керування базами даних виступає ключовою рисою вебзастосунків забезпечується через '''PostgreSQL''' або коротко '''Postgres'''. Приклад ідеї:
<syntaxhighlight lang="text">
PostgreSQL має потужну систему '''extensions'''. name text,
<div style="background:#f0eaff; border-left:6px solid #8e44ad; padding:12px; margin:12px 0;">
Приклад для JSONB:
</div>
PostgreSQL потрібно моніторити.</div>
|-
| ліцензійний пакет
| Open source PostgreSQL License
| Комерційна enterprise СКБД
|-
| Вартість
| Без ліцензійної плати за community version
| Комерційне ліцензування
|-
| Enterprise features
| Багато можливостей + extensions/ecosystem
| Дуже сильний enterprise stack
|-
| Міграція
| Можлива, але потребує аналізу SQL, procedures і типів
| Legacy enterprise-системи
|}
`pg_hba.conf` керує тим, хто й як здатна підключатися до PostgreSQL. '''psql''' — стандартний command-line client для PostgreSQL. price numeric(12,2) NOT NULL CHECK (price >= 0)
'''Практична порада:''' PostgreSQL часто виступає як хорошим default choice для backend-бази, якщо немає чіткої причини обирати іншу систему.<div style="background:#fdecea; border-left:6px solid #e74c3c; padding:12px; margin:12px 0;">
'''PostgreSQL 18''' — сучасна основна реліз системи PostgreSQL. * перенесення баз;
* logical backups;
* вибіркового відновлення;
* міграцій;
* dev/test копій;
* архівування структури й даних. '''Критично:''' backup-команди потрібно тестувати на реальних розмірах даних і з реальним restore-процесом, а не лише записати в документацію. Це permissive open source-ліцензія, подібна за духом до BSD або MIT License. '''Практична роль:''' managed PostgreSQL зменшує частину адміністративної роботи, але не скасовує потребу в schema design, індексах, backup-політиці й query tuning.</div>
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
</div>
<syntaxhighlight lang="sql">
'''Практична роль:''' PostgreSQL connections не безкоштовні. Вона поєднує SQL, ACID, MVCC, constraints, advanced indexes, JSONB, PostGIS, extensions, replication, backup-інструменти, security-модель і permissive PostgreSQL License. Це зріла платформа для роботи з даними, яка винагороджує правильну архітектуру й уважне адміністрування. Partitioning корисний для:
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
created_at timestamptz NOT NULL DEFAULT now()
WHERE to_tsvector('english', body) @@ plainto_tsquery('english', 'database index');
</div>
{| class="wikitable"
* performance improvements;
* нової I/O-архітектури;
* оптимізації upgrade;
* покращення planner;
* розвитку SQL-функцій;
* production-середовищ;
* cloud deployments;
* extension ecosystem;
* довгострокового планування оновлень.
- 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 містить:
критично: вимкнути autovacuum без дуже вагомої причини — один із найшвидших способів отримати проблеми в PostgreSQL.
|- | Тип | Object-relational database | Relational database |- | SQL features | Дуже сильний і розширюваний SQL | Широко використовуваний, простий старт |- | JSON | JSONB із потужними індексами | JSON-підтримка виступає як, але інша за моделлю |- | Extensions | Дуже сильна extension ecosystem | Менш центральна роль extensions |- | Типові сценарії | Складні запити, data integrity, GIS, enterprise | Web apps, CMS, LAMP-екосистема, прості deployment |}
Приклад: критично: для великих production-баз одного `pg_dump` здатна бути недостатньо. * групувати таблиці;
- розділяти modules;
- ізолювати об’єкти;
- керувати permissions;
- підтримувати multi-tenant design у частині сценаріїв;
- уникати конфліктів імен. PostgreSQL використовує roles для користувачів і груп.== Таблиці ==
SELECT a + b;
|- | Модель | 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 |}
CREATE TABLE events ( !== Triggers == Цікавий факт: MVCC — одна з причин, чому PostgreSQL здатна одночасно обслуговувати читання й записи, не перетворюючи кожен запит на чергу очікування. PostgreSQL
Foreign data wrappers
PostGIS — одне з найвідоміших PostgreSQL-розширень для геопросторових даних. SQLite
created_at timestamptz NOT NULL DEFAULT now()
історія продукту PostgreSQL
Materialized views, aggregates і read replica допомагають робити звіти без надмірного навантаження на primary. JSONB — binary JSON-тип у PostgreSQL. Підказка: якщо застосунок росте, PostgreSQL краще масштабувати поступово: індекси, pooling, query tuning, replicas, partitioning, а вже потім складні distributed-рішення. критично: реплікація — не backup. Код можна обійти, а database constraint стоїть ближче до даних. * PostgreSQL має власну permissive PostgreSQL License, схожу за духом до BSD/MIT. WAL потрібен для: критично: GUI зручний, але для production-адміністрування все одно потрібно розуміти SQL, permissions, backups і logs. Висновок: MySQL часто простіший для старту в класичних web-сценаріях, а PostgreSQL сильніший у складному SQL, data integrity, extensibility і GIS.</syntaxhighlight> Проста аналогія: транзакція — це як переказ грошей: не можна списати з одного рахунку й “забути” зарахувати на інший. Типові варіанти: CREATE TABLE billing.invoices (
CREATE TABLE customers (
WHERE active = true;
- primary;
- standby replicas;
- streaming replication;
- failover manager;
- Patroni;
- etcd або Consul у частині сценаріїв;
- load balancer;
- PgBouncer;
- backup system;
- monitoring;
- alerting;
- runbooks.
<syntaxhighlight lang="sql"> PostgreSQL дає можливість писати functions і procedures.<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;"> `pg_dump` створює logical backup бази, а `pg_restore` відновлює dump у custom format.<syntaxhighlight lang="sql"> <div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;"> FROM users
- не створити індекс для частого WHERE;
- створити забагато індексів;
- підключатися до бази під superuser;
- не налаштувати backups;
- не тестувати restore;
- не читати EXPLAIN;
- тримати довгі транзакції;
- ігнорувати VACUUM;
- зберігати все в JSONB без схеми;
- робити schema migrations без плану;
- відкривати PostgreSQL у public internet;
- не використовувати connection pooling;
- плутати replica з backup;
- не моніторити disk usage;
- оновлювати major version без репетиції. Materialized view зберігає результат фізично й потребує refresh.
<syntaxhighlight lang="sql">
GIN
pg_hba.conf
- контролю bloat;
- звільнення простору для reuse;
- коректної statistics maintenance;
- запобігання transaction ID wraparound;
- стабільної продуктивності;
- autovacuum. Основні етапи:
CREATE TABLE users (
'''EXPLAIN''' показує query plan. UPDATE accounts
id bigserial PRIMARY KEY,
</div>
Приклад:
* перейти між major versions;
* зменшити downtime;
* не робити повний dump/restore у великих базах;
* зберегти data files у підтримуваному сценарії;
* прискорити upgrade.== PostgreSQL у хмарі ==
'''Практична роль:''' foreign key — це спосіб сказати базі: “цей order не здатна існувати без реального user”. '''Основна ідея:''' PostgreSQL — це база даних для випадків, коли потрібні надійність, SQL, транзакції, гнучкість і можливість рости від маленького застосунку до серйозної production-системи. id bigserial PRIMARY KEY,
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
'''критично:''' якщо statistics застарілі, planner здатна вибрати поганий план навіть для правильно написаного запиту. '''Проста аналогія:''' WAL — це чорновий журнал, у який PostgreSQL спочатку записує, що має статися, щоб після збою знати, як відновитися. Приклад:
created_at timestamptz NOT NULL DEFAULT now()
Приклад:
CREATE INDEX idx_users_email ON users (email);
- нові типи даних;
- функції;
- індекси;
- foreign data wrappers;
- GIS;
- text search;
- cryptography;
- statistics;
- monitoring;
- scheduling;
- vector search у відповідних extensions;
- audit;
- replication helpers. Практична роль: schemas — це як папки для database objects, але з власними правилами доступу й пошуку. Водночас вона потребує дисципліни: schema design, indexes, backups, VACUUM, monitoring, security, migrations і upgrade planning мають бути продуманими. * EXPLAIN ANALYZE — один із найважливіших інструментів для оптимізації. Критерій
- multi-tenant SaaS;
- доступу користувачів лише до своїх даних;
- isolation;
- internal admin tools;
- security-sensitive applications;
- fine-grained permissions.
CREATE INDEX idx_events_payload ON events USING gin (payload);
- columns;
- rows;
- data types;
- constraints;
- indexes;
- primary key;
- foreign keys;
- default values;
- generated columns у відповідних сценаріях;
- permissions.== Roles і permissions ==
CREATE TABLE products (
критично: PostgreSQL універсальна, але не чарівна.</syntaxhighlight>
ACID
CREATE ROLE app_user LOGIN PASSWORD 'change_me';
ORDER BY created_at DESC
PostgreSQL підтримує:
ACID означає: Foreign data wrappers або FDW дозволяють PostgreSQL працювати з зовнішніми джерелами даних як із таблицями. JSONB корисний для: Приклад:
PostgreSQL походить від проєкту POSTGRES, який розроблявся в University of California at Berkeley. * Багато сучасних “database products” фактично будуються навколо PostgreSQL або його extensions. PostgreSQL має вбудовані функції ERP full-text search. Якщо випадково видалити інформаційні дані на primary, видалення здатна оперативно потрапити й на replica. * PostgreSQL здатна бути маленькою базою для pet project і серйозною production-базою для великого бізнесу. * PostgreSQL Versioning Policy. PostgreSQL використовує locks для захисту даних і schema changes.== VACUUM ==
- indexes;
- table statistics;
- row estimates;
- join order;
- join algorithms;
- filters;
- sort cost;
- parallel execution;
- work_mem;
- data distribution. PostGIS дає можливість шукати об’єкти поруч, будувати геозони й виконувати spatial queries. RETURNS int
Основні конкурентні переваги PostgreSQL:
- event payloads;
- flexible metadata;
- external API responses;
- feature flags;
- audit records;
- document-like fields;
- mixed structured/unstructured data;
- прототипів зі змінною схемою.
Triggers використовують для:
Monitoring
Це корисно для:
PostGIS
</syntaxhighlight> CREATE SCHEMA billing; CREATE INDEX idx_orders_created_at ON orders (created_at);
email text NOT NULL UNIQUE,
PostgreSQL і Oracle Database
Schema migrations змінюють структуру бази.== Висновок ==
PostgreSQL підтримує різні типи індексів:
psql
Практична роль: правильно спроєктована таблиця часто важливіша за десятки оптимізацій пізніше. Приклад:
PostgreSQL застосовується для для: </syntaxhighlight> GRANT USAGE ON SCHEMA public TO app_user;
SaaS backend
Обмеження PostgreSQL
GIN корисний для:
- чи застосовується для індекс;
- де full scan;
- скільки рядків читається;
- які join algorithms;
- де bottleneck;
- чи правильна statistics;
- чому запит повільний. Критерій
Практична порада: великі schema migrations потрібно робити поступово: додати column, backfill, перевірити, перемкнути код, прибрати старе.== Коли варто використовувати PostgreSQL ==
Object-relational database
критично: помилка в pg_hba.conf здатна або заблокувати легальних користувачів, або відкрити доступ зайвим адресам. * user-defined types;
- custom functions;
- operators;
- extensions;
- inheritance у частині сценаріїв;
- composite types;
- arrays;
- JSONB;
- range types;
- domains;
- custom index behavior через extensions;
- procedural languages. total numeric(12,2) NOT NULL CHECK (total >= 0),
критично: PostgreSQL має довгу історію, але це не “стара база з минулого”. * 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.
Приклад:
- time-series data;
- logs;
- append-only tables;
- telemetry;
- великих таблиць із timestamp;
- cheap indexing;
- data warehouses у частині сценаріїв.</syntaxhighlight>
Event logging
BEGIN;
PostgreSQL підтримує різні форми replication.Перевага: PostgreSQL дає можливість почати з простої таблиці користувачів, а потім поступово додавати індекси, JSONB, views, replication, partitioning, full-text search і extensions без зміни базової платформи. PostgreSQL
Extensions
JSONB зберігає payload подій, а BRIN або partitioning допомагають працювати з великими time-based таблицями. * PostgreSQL походить від Berkeley POSTGRES.
-- Знайти об'єкти поруч із заданою точкою
PostgreSQL і MySQL
Проста аналогія: PostgreSQL — це не тільки таблиці й рядки. Вона подобається тому, що часто поводиться чесно: якщо добре спроєктувати інформаційні дані й запити, вона відповідає стабільністю. SQL — основна мова роботи з 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.== Replication ==
created_at date NOT NULL,
PgBouncer оптимізує:
SELECT *
! Вона принесла покращення продуктивності, нову I/O-підсистему, поліпшення upgrade-процесу, кращу роботу з індексами й інші зміни. \dt $$; Він оптимізує:
LIMIT 10;
SEO title: PostgreSQL — open source об’єктно-реляційна база даних для застосунків, аналітики, GIS, JSON і enterprise-систем
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
</noinclude>
{{SEO
Шаблон для службового SEO-опису сторінки.
}}
Schema у PostgreSQL — це namespace всередині database. Least privilege у PostgreSQL — не прикраса, а базова безпека. Oracle Database
status text NOT NULL DEFAULT 'new',
Найцікавіше, що PostgreSQL здатна поводитися і як класична SQL-база, і як частково document-friendly платформа через JSONB, і як геопросторова база через PostGIS, і як платформа для розширень.== Partitioning ==
CREATE EXTENSION IF NOT EXISTS pg_trgm;
Таблиця має:
Головна перевага: extensions — одна з причин, чому PostgreSQL часто називають не без зусиль базою, а платформою для даних. * PostGIS перетворює PostgreSQL на сильну GIS-платформу.
CREATE INDEX idx_orders_created_at ON orders (created_at); Практична роль: psql — це інструмент, який варто знати навіть тим, хто зазвичай користується GUI. Транзакція — це група операцій, які виконуються як єдине ціле.== Row-Level Security ==
PostgreSQL підтримує: SELECT id, email ! * зменшити кількість backend connections;
- покращити latency;
- захистити PostgreSQL від connection storm;
- краще використовувати resources;
- працювати з web apps;
- масштабувати application servers. Можливі проблеми:
Можливі елементи:
! Вона схожа на майстерню: спочатку здається великою, але потім виявляється, що майже для кожної складної задачі там уже виступає як інструмент. Для деяких workloads краще спеціалізовані системи. Таблиці products, orders, users, payments і inventory працюють із constraints, transactions і indexes.Критично: PostgreSQL не можна виставляти у відкритий інтернет без сильного захисту. pgAdmin — популярний графічний інструмент для PostgreSQL. Поширені підходи:
Приклад задачі: SET balance = balance - 100 Schemas допомагають:
PostgreSQL має обмеження. PostgreSQL зберігає користувачів, підписки, платежі, permissions, audit logs і application data. ON logs USING brin (created_at); CREATE TABLE orders (
Індекси прискорюють пошук, сортування й фільтрацію даних.
* streaming replication;
* physical replication;
* logical replication;
* synchronous replication;
* asynchronous replication;
* hot standby;
* read replicas;
* cascading replication. Приклад:
<syntaxhighlight lang="bash">
'''критично:''' найкращий performance tuning часто починається не з конфігурації сервера, а з правильного індексу або переписаного SQL-запиту. Критерій
<syntaxhighlight lang="sql">
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
Таблиці — основа relational model у PostgreSQL. ! user_id bigint NOT NULL REFERENCES users(id),
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
'''Logical replication''' передає зміни на рівні таблиць і logical changes. Часто потрібні physical backups і WAL archiving. CREATE TABLE events (
'''Критично:''' застосунок не має підключатися до production-бази під superuser. * PostgreSQL Documentation. Рекомендовано:
</div>
CREATE FUNCTION add_numbers(a int, b int)
'''Найлюдяніший факт:''' PostgreSQL — це база даних, яка не намагається бути “простенькою”. Індекси потрібно створювати за реальними запитами, а не “про всяк випадок”. );
=== GIS-сервіс ===
id bigserial PRIMARY KEY,
* виконувати SQL;
* переглядати таблиці;
* запускати scripts;
* перевіряти connection;
* використовувати meta-commands;
* експортувати результати;
* адмініструвати базу;
* працювати в terminal. Розширення можуть додавати:
* high availability;
* read scaling;
* disaster recovery;
* migration;
* reporting replicas;
* zero/low downtime upgrades у частині сценаріїв;
* data distribution. Він корисний, коли застосунок відкриває багато database connections.<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
</div>
PostgreSQL підтримує принципи '''ACID''' для транзакцій.</div>
Цікаві факти про PostgreSQL
Вони можуть включати: </syntaxhighlight> Partitioning дає можливість розбивати велику таблицю на частини. ! Вона корисна для:
WHERE id = 1; Висновок: PostgreSQL часто обирають як open source альтернативу для частини Oracle-сценаріїв, але міграція складних enterprise-систем потребує ретельного аналізу. Вона активно розвивається й регулярно отримує нові функції ERP. host appdb app_user 10.0.0.0/24 scram-sha-256
Foreign keys
</syntaxhighlight>
- B-tree;
- Hash;
- GIN;
- GiST;
- SP-GiST;
- BRIN;
- expression indexes;
- partial indexes;
- multicolumn indexes;
- unique indexes. Без нього оптимізація часто перетворюється на вгадування. id bigint,
Приклад:
Приклади:
- потребує грамотного адміністрування;
- великі write-heavy workloads потребують tuning;
- MVCC створює bloat без правильного VACUUM;
- horizontal sharding не виступає як “однією кнопкою”;
- складні major upgrades потребують плану;
- connection count потрібно контролювати;
- неправильні індекси можуть шкодити;
- великий JSONB без схеми здатна стати хаосом;
- HA потребує додаткової архітектури;
- managed cloud не скасовує оптимізацію запитів;
- дуже великі analytics workloads можуть потребувати спеціалізованих систем. Це ще платформа, яку можна розширювати під складні типи даних і поведінку. * MVCC дає PostgreSQL сильну concurrency-модель, але потребує VACUUM.
CREATE PUBLICATION app_pub FOR TABLE users, orders; Головна перевага: PostgreSQL дає дуже сильну базу даних без ліцензійного бар’єра й з величезною екосистемою. );
FROM orders
</syntaxhighlight>
Приклад:
GIN індекси часто використовують для JSONB, arrays і full-text search.); WHERE active = true
Запит:
Приклад ідеї:
- logical backup через `pg_dump`;
- physical backup;
- base backup;
- WAL archiving;
- point-in-time recovery;
- managed cloud backups;
- snapshots з database-aware підходом;
- backup verification;
- restore drills.</syntaxhighlight>
- PRIMARY KEY;
- FOREIGN KEY;
- UNIQUE;
- NOT NULL;
- CHECK;
- EXCLUDE constraints;
- default values;
- generated values.</syntaxhighlight>
PostgreSQL і SQLite
- SQL
- База даних
- Relational database
- Object-relational database
- PostgreSQL License
- MySQL
- MariaDB
- SQLite
- MongoDB
- Oracle Database
- Microsoft SQL Server
- PostGIS
- JSONB
- ACID
- MVCC
- WAL
- Replication
- Logical replication
- pg_dump
- pg_restore
- pg_upgrade
- VACUUM
- EXPLAIN
- PgBouncer
- pgAdmin
- Backup
- Логування
- Безпека застосунків
- Приватність даних