В чем разница между схемой и базой данных в PostgreSQL?

«В чем разница между схемой и базой данных в PostgreSQL?» — вопрос из категории Базы данных, который задают на 24% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Это два уровня логической организации:

  • База данных (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).
  • Управлять миграциями для разных модулей приложения.
  • Запускать несколько "виртуальных" экземпляров одного приложения в одной БД (мультитенантность).