Домой Edit me on GitHub

2019-06-19

Каналы передачи данных | Сетевое программирование | Базы данных | Основы Веб-программирования

PostgreSQL

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 не нужно;
  • возможно создание индекса над несколькими столбцами таблицы, в том числе над столбцами различных типов данных;
  • индексы могут быть функциональными, т.е. строиться не на базе набора значений некоего столбца(ов), а на базе набора значений функции от набора значений;
  • индексы могут быть частичными, то есть строиться только по части таблицы (по некоторой её проекции); в некоторых случаях это помогает создавать намного более компактные индексы или достигать улучшения производительности за счёт использования разных типов индексов для разных (например, с точки зрения частоты обновления) частей таблицы;
  • планировщик запросов может использовать несколько индексов одновременно для выполнения сложных запросов.

Многоверсионность (MVCC)

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).

Практика

Настройка окружения

Previous: Redis