.. seealso:: * `RU документация <https://postgrespro.ru/docs/>`_ * https://ru.wikipedia.org/wiki/PostgreSQL * `Восхитительная книга "Работа с PostgreSQL" <http://postgresql.leopard.in.ua/>`_ * `Книга рецептов для СУБД PostgreSQL <http://pgcookbook.ru>`_
PostgreSQL -- свободная объектно-реляционная система управления базами данных (СУБД).
PostgreSQL базируется на языке SQL и поддерживает многие из возможностей стандарта SQL:2011.
На данный момент PostgreSQL имеются следующие ограничения:
- Максимальный размер базы данных: нет ограничений
- Максимальный размер таблицы: 32 Тбайт
- Максимальный размер записи: 1,6 Тбайт
- Максимальный размер поля: 1 Гбайт
- Максимум записей в таблице: нет ограничений
- Максимум полей в записи: 250 - 1600, в зависимости от типов полей
- Максимум индексов в таблице: нет ограничений
Важнейшие ТТХ PostgreSQL
- Надежность и устойчивость. Надежность PostgreSQL является известным фактом, доказанным на примере многих проектов, в которых PostgreSQL работает без сбоев под высокими нагрузками на протяжении нескольких лет. * Превосходная поддержка. Сообщество PostgreSQL предоставляет квалифицированную и быструю помощь. Коммерческие компании предлагают свои услуги по всему миру.
- Конкурентная работа при большой нагрузке. PostgreSQL использует многоверсионность (MVCC) для обеспечения надежной и быстрой работы в конкурентных условиях под высокой нагрузкой. * Масштабируемость. PostgreSQL отлично использует современную архитектуру многоядерных процессоров -- его производительность растет линейно вплоть до 64-х ядер. Кластерные решения на основе Postgres-XC, Postgres-XL помогают с горизонтальной масштабируемостью.
- Кроссплатформенность. PostgreSQL работает под всеми видами UNIX-подобных систем, включая Linux, FreeBSD, Solaris, HP/UX, Mac OS X, а также под MS Windows. * Расширяемость. Доступны исходные коды PostgreSQL, что делает возможным добавление новой функциональности для вашего проекта без дополнительных проблем. Расширяемость PostgreSQL позволяет создавать новые типы данных и методы доступа.
- Доступность. PostgreSQL распространяется под лицензией, близкой к BSD, которая не накладывает никаких ограничений на коммерческое использование и не требует лицензионных выплат.
- Высокий уровень соответствия ANSI SQL 92, ANSI SQL 99 и ANSI SQL 2003, 2011.
- Интерфейсы для Tcl, Perl, C, C++, PHP, JSON, ODBC, JDBC, Embedded SQL in C, Python, Ruby, Java и других. * Интеграция защиты данных с операционной системой (SE-Linux).
- Представления, последовательности, наследование, outer joins, подзапросы, ссылочная целостность, оконные функции, CTE (рекурсивные запросы).
- Пользовательские функции, хранимые процедуры, триггеры.
- Процедурные языки PL/PgSQL, PL/Perl, PL/Python, PL/Java и другие.
- Расширяемый набор типов данных с поддержкой индексов (GiST, GIN, SP-GiST).
- Встроенная система полнотекстового поиска с поддержкой всех европейских языков.
- Встроенная поддержка слабоструктурированных данных (xml, json, jsonb) с поддержкой индексов.
- Горячее резервирование и репликация (синхронная, асинхронная, каскадная), PITR, двунаправленная (BDR).
- Полная поддержка ACID, уровни изоляции, эффективная сериализация транзакций.
- Функциональные и частичные индексы.
- Интернационализация, поддержка Unicode и locale.
- Загружаемые расширения, например, PostGIS, hstore.
- Поддержка SSL и Kerberos-аутентификации.
- Foreign Data Wrappers (writable), поддержка всех основных баз данных.
Функции являются блоками кода, исполняемыми на сервере, а не на клиенте БД. Хотя они могут писаться на чистом SQL, реализация дополнительной логики, например, условных переходов и циклов, выходит за рамки собственно SQL и требует использования некоторых языковых расширений. Функции могут писаться с использованием одного из следующих языков:
- Встроенный процедурный язык PL/pgSQL, во многом аналогичный языку PL/SQL, используемому в СУБД Oracle;
- Скриптовые языки -- PL/Lua, PL/LOLCODE, PL/Perl, PL/PHP, PL/Python, PL/Ruby, PL/sh, PL/Tcl и PL/Scheme;
- Классические языки -- C, C++, Java (через модуль PL/Java);
- Статистический язык R (через модуль PL/R).
PostgreSQL допускает использование функций, возвращающих набор записей, который далее можно использовать так же, как и результат выполнения обычного запроса.
Функции могут выполняться как с правами их создателя, так и с правами текущего пользователя.
Иногда функции отождествляются с хранимыми процедурами, однако между этими понятиями есть различие. С девятой версии возможно написание автономных блоков, которые позволяют выполнять код на процедурных языках без написания функций, непосредственно в клиенте.
Триггеры определяются как функции, инициируемые DML-операциями. Например, операция INSERT может запускать триггер, проверяющий добавленную запись на соответствия определённым условиям. При написании функций для триггеров могут использоваться различные языки программирования.
Триггеры ассоциируются с таблицами. Множественные триггеры выполняются в алфавитном порядке.
Механизм правил (rules) представляет собой механизм создания пользовательских обработчиков не только DML-операций, но и операции выборки. Основное отличие от механизма триггеров заключается в том, что правила срабатывают на этапе разбора запроса, до выбора оптимального плана выполнения и самого процесса выполнения. Правила позволяют переопределять поведение системы при выполнении SQL-операции к таблице.
Хорошим примером является реализация механизма представлений (views). При создании представления создается правило, которое определяет, что вместо выполнения операции выборки к представлению система должна выполнять операцию выборки к базовой таблице/таблицам с учетом условий выборки, лежащих в основе определения представления. Для создания представлений, поддерживающих операции обновления, правила для операций вставки, изменения и удаления строк должны быть определены пользователем.
В PostgreSQL имеется поддержка индексов следующих типов: B-дерево, хэш, R-дерево, GiST, GIN. При необходимости можно создавать новые типы индексов, хотя это далеко не тривиальный процесс.
Индексы в PostgreSQL обладают следующими свойствами:
- возможен просмотр индекса не только в прямом, но и в обратном порядке --
создание отдельного индекса для работы конструкции
ORDER BY ... DESC
не нужно; - возможно создание индекса над несколькими столбцами таблицы, в том числе над столбцами различных типов данных;
- индексы могут быть функциональными, т.е. строиться не на базе набора значений некоего столбца(ов), а на базе набора значений функции от набора значений;
- индексы могут быть частичными, то есть строиться только по части таблицы (по некоторой её проекции); в некоторых случаях это помогает создавать намного более компактные индексы или достигать улучшения производительности за счёт использования разных типов индексов для разных (например, с точки зрения частоты обновления) частей таблицы;
- планировщик запросов может использовать несколько индексов одновременно для выполнения сложных запросов.
PostgreSQL поддерживает одновременную модификацию БД несколькими пользователями с помощью механизма Multiversion Concurrency Control (MVCC). Благодаря этому соблюдаются требования ACID, и практически отпадает нужда в блокировках чтения.
PostgreSQL поддерживает большой набор встроенных типов данных:
- Численные типы
- Целые
- С фиксированной точкой
- С плавающей точкой
- Денежный тип (отличается специальным форматом вывода, а в остальном аналогичен числам с фиксированной точкой с двумя знаками после запятой)
- Символьные типы произвольной длины
- Двоичные типы (включая BLOB)
- Типы «дата/время» (полностью поддерживающие различные форматы, точность, форматы вывода, включая последние изменения в часовых поясах)
- Булев тип
- Перечисление
- Геометрические примитивы
- Сетевые типы
- IP и IPv6-адреса
- CIDR-формат
- MAC-адрес
- UUID-идентификатор
- XML-данные
- Массивы
- JSON
- Идентификаторы объектов БД
- Псевдотипы
- Типы для текстового поиска
- Диапазонные типы
Более того, пользователь может самостоятельно создавать новые требуемые ему типы и программировать для них механизмы индексирования с помощью GiST.
PostgreSQL может быть расширен пользователем для собственных нужд практически в любом аспекте. Есть возможность добавлять собственные:
- Преобразования типов
- Типы данных
- Домены (пользовательские типы с изначально наложенными ограничениями)
- Функции (включая агрегатные)
- Индексы
- Операторы (включая переопределение уже существующих)
- Процедурные языки
Таблицы могут наследовать характеристики и наборы полей от других таблиц (родительских). При этом данные, добавленные в порождённую таблицу, автоматически будут участвовать (если это не указано отдельно) в запросах к родительской таблице.
На базе PostgreSQL компанией EnterpriseDB созданы более мощные варианты этой СУБД, являющиеся платными для коммерческого использования -- Postgres Plus (состоит целиком только из продуктов с открытыми исходными кодами; плата требуется только при необходимости приобретения коммерческой поддержки продукта) и Postgres Plus Advanced Server (расширение PostgreSQL специальными возможностями для обеспечения совместимости с Oracle Database). В комплекте поставки данных продуктов содержится большой набор ПО для разработчиков и DBA:
- Postgres Studio -- более мощный аналог pgAdmin;
- Postgres Plus Debugger -- отладчик для кода на PL/pgSQL, интегрированный с предыдущим пакетом;
- Migration Studio -- инструмент для автоматического преобразования баз данных из MySQL / Oracle в PostgreSQL
PostgreSQL на данный момент является одной из самых (если не самой-самой) перспективных СУБД в мире. Благодаря великолепной архитектуре, бесплатности, отличному сообществу и огромнейшим возможностям.
Обычно PostgreSQL сравнивают с MySQL. Но на данный момент PostgreSQL далеко обходит по возможностям MySQL. И, благодаря своим возможностям по аналитике данных и манипулированию ими, зачастую может конкурировать с признанными лидерами рынка enterprise-СУБД: Oracle и MS SQL.
А благодаря своим возможностям в области хранения нереляционных данных (JSON, text search types, HStore) PostgreSQL напрямую конкурирует с NoSQL-решениями (например, MongoDB).
.. todo:: Описать процесс установки и нормального запуска