Ответ
Это два уровня логической организации:
-
База данных (Database) — это изолированный контейнер верхнего уровня. Подключение (
psql, приложение) всегда происходит к конкретной базе данных. Базы данных между собой изолированы: нельзя выполнить JOIN между таблицами из разных БД в одном запросе без расширений типаdblink. Каждая БД имеет собственный набор системных каталогов, пользователей и прав доступа. -
Схема (Schema) — это пространство имён внутри базы данных. В одной БД может быть множество схем. Схемы содержат объекты: таблицы, представления, функции. Объекты из разных схем одной БД могут взаимодействовать в запросах.
Пример из практики DevOps:
-- Создаем БД для приложения
CREATE DATABASE myapp_prod OWNER app_user;
-- Подключаемся к ней
c myapp_prod
-- Создаем схемы для логического разделения
CREATE SCHEMA IF NOT EXISTS app AUTHORIZATION app_user; -- для основных таблиц приложения
CREATE SCHEMA IF NOT EXISTS logs AUTHORIZATION app_user; -- для таблиц логов
CREATE SCHEMA IF NOT EXISTS extensions AUTHORIZATION app_user; -- для сторонних расширений
-- Устанавливаем путь поиска по умолчанию для пользователя
ALTER ROLE app_user SET search_path TO app, logs, public;
Зачем это нужно в DevOps? Схемы позволяют:
- Разделять доступ (дать аналитикам доступ только к схеме
reporting). - Управлять миграциями для разных модулей приложения.
- Запускать несколько "виртуальных" экземпляров одного приложения в одной БД (мультитенантность).