База данных в PostgreSQL — это фундаментальная структура для хранения и организации данных, которая служит основой для любых приложений и систем. Создание базы данных является первым и одним из самых важных шагов при работе с PostgreSQL. В этом руководстве мы подробно разберем процесс создания базы данных с использованием pgAdmin 4, а также рассмотрим альтернативные способы и лучшие практики.

Что такое база данных в PostgreSQL?

База данных PostgreSQL представляет собой структурированное хранилище, которое содержит:

  • Таблицы (Tables) — для хранения данных в строковом формате

  • Схемы (Schemas) — для организации таблиц в логические группы

  • Индексы (Indexes) — для ускорения поиска данных

  • Функции и процедуры — для бизнес-логики на уровне БД

  • Триггеры (Triggers) — для автоматического выполнения действий

  • Последовательности (Sequences) — для генерации уникальных идентификаторов

  • Представления (Views) — для виртуальных таблиц

Каждая база данных в PostgreSQL является изолированной средой со своими пользователями, привилегиями и настройками.

Подготовка к созданию базы данных
Требования перед началом
  1. Установленная СУБД PostgreSQL — версия 10 или выше

  2. Установленный pgAdmin 4 — версия 4 или выше

  3. Права администратора или права на создание баз данных

  4. Достаточно места на диске — минимум 100 МБ для пустой базы

Проверка установки PostgreSQL
bash
# Проверка версии PostgreSQL
psql --version

# Проверка статуса службы (Linux)
sudo systemctl status postgresql

# Проверка статуса службы (Windows)
services.msc → Поиск "PostgreSQL"
Пошаговое создание базы данных через pgAdmin 4
Шаг 1: Запуск pgAdmin 4

Для Windows:

  1. Откройте меню "Пуск"

  2. Найдите "pgAdmin 4" в списке программ

  3. Нажмите на значок приложения

  4. При первом запуске введите мастер-пароль (если настроен)

Для macOS:

  1. Откройте Launchpad или Applications

  2. Найдите pgAdmin 4

  3. Запустите приложение

Для Linux:

bash
# Запуск из терминала
pgadmin4

# Или через ярлык в меню приложений

Веб-версия через браузер:

  1. Откройте браузер

  2. Перейдите по адресу: http://localhost:5050 (порт по умолчанию)

  3. Войдите с учетными данными

Шаг 2: Подключение к серверу PostgreSQL
  1. В левой панели (Object Browser) найдите раздел Servers

  2. Разверните список серверов (щелкните на треугольник рядом)

  3. Найдите нужный сервер (обычно "PostgreSQL" или пользовательское имя)

  4. Подключитесь одним из способов:

    • Двойной щелчок по имени сервера

    • Правой кнопкой → Connect Server

  5. При необходимости введите пароль пользователя PostgreSQL

Если сервер не отображается:

  1. Правой кнопкой на Servers → Register → Server

  2. Заполните параметры подключения:

    • General → Name: Любое имя (например, "Local PostgreSQL")

    • Connection → Host: localhost или IP-адрес

    • Connection → Port: 5432 (стандартный)

    • Connection → Username: postgres (или другой пользователь)

    • Connection → Password: Пароль пользователя

  3. Нажмите Save

Шаг 3: Создание новой базы данных
  1. В дереве объектов разверните подключенный сервер

  2. Найдите раздел Databases

  3. Правой кнопкой на Databases → Create → Database...

  4. Откроется диалоговое окно "Create - Database"

Детальная настройка параметров базы данных
Вкладка "General" (Общие настройки)

Database (Имя базы данных):

  • Используйте только латинские буквы, цифры и подчеркивания

  • Начинайте с буквы (не с цифры)

  • Избегайте специальных символов и пробелов

  • Примеры правильных имен:

    • company_db

    • online_store

    • analytics_2024

    • test_environment

Owner (Владелец базы данных):

  • По умолчанию: пользователь, от имени которого создается база

  • Рекомендуется создать отдельного пользователя для приложения

  • Выбор из списка существующих пользователей

  • Владелец имеет полные права на базу данных

Комментарий (Comment):

  • Необязательное поле

  • Рекомендуется заполнять для документации

  • Пример: "База данных для системы учета сотрудников компании"

Вкладка "Definition" (Определение)

Template (Шаблон):

  • template1 (по умолчанию) — стандартная база-шаблон

  • template0 — "чистая" база без изменений

  • Рекомендации:

    • Используйте template1 для большинства случаев

    • Используйте template0 при проблемах с кодировкой

    • Не используйте пользовательские базы как шаблоны без необходимости

Encoding (Кодировка):

  • UTF8 (рекомендуется) — поддерживает все языки

  • WIN1251 — для русского языка в Windows

  • LATIN1 — для западноевропейских языков

  • Важно: кодировка влияет на хранение текстовых данных

Таблица сравнения кодировок:

Кодировка Поддержка языков Размер символа Рекомендация
UTF8 Все языки мира 1-4 байта ✅ Рекомендуется
WIN1251 Русский, английский 1 байт Для legacy-систем
LATIN1 Западная Европа 1 байт Специфичные случаи
SQL_ASCII Без преобразования 1 байт ❌ Не рекомендуется

Tablespace (Табличное пространство):

  • pg_default (по умолчанию) — основное пространство

  • pg_global — для системных каталогов

  • Пользовательские табличные пространства для распределения данных

Collation (Сортировка):

  • Определяет правила сравнения и сортировки строк

  • Примеры:

    • C или POSIX — сортировка по коду символа

    • en_US.UTF-8 — для английского языка

    • ru_RU.UTF-8 — для русского языка

  • По умолчанию: наследуется от шаблона

Character Type (Тип символов):

  • Определяет классификацию символов

  • Обычно оставляется по умолчанию

  • Влияет на функции работы со строками

Connection limit (Ограничение подключений):

  • -1 — без ограничений (по умолчанию)

  • Конкретное число — для контроля нагрузки

  • Пример: 100 для ограничения одновременных подключений

Вкладка "Security" (Безопасность)

Privileges (Привилегии):

  • Настройка прав доступа для разных пользователей

  • Можно добавить после создания базы

  • Примеры привилегий:

    • CONNECT — право на подключение

    • CREATE — право создавать объекты

    • TEMPORARY — право создавать временные таблицы

Security Labels (Метки безопасности):

  • Для систем с многоуровневой безопасностью

  • Обычно не используется в стандартных приложениях

Вкладка "Parameters" (Параметры)

Search Path (Путь поиска):

  • Порядок поиска схем по умолчанию

  • Пример: "$user", public

  • Указывает, в каких схемах искать объекты

Другие параметры:

  • Можно настроить специфичные параметры БД

  • Переопределяют глобальные настройки сервера

  • Примеры:

    • work_mem = '64MB' — память для операций

    • maintenance_work_mem = '256MB' — память для обслуживания

Вкладка "Advanced" (Расширенные настройки)

Tablespace для системных каталогов:

  • Обычно pg_default

  • Можно указать другое пространство

Allow connections (Разрешить подключения):

  • По умолчанию Yes

  • Можно временно отключить доступ к базе

Is template (Является шаблоном):

  • По умолчанию No

  • Если Yes — базу можно использовать как шаблон

Пример создания реальной базы данных
Сценарий: Создание базы для интернет-магазина

Параметры:

  • Имя: online_store

  • Владелец: store_admin

  • Шаблон: template1

  • Кодировка: UTF8

  • Сортировка: ru_RU.UTF-8

  • Ограничение подключений: 50

Процесс в pgAdmin 4:

  1. Заполните вкладку General:

    • Database: online_store

    • Owner: store_admin (предварительно созданный пользователь)

    • Comment: "База данных интернет-магазина электроники"

  2. Заполните вкладку Definition:

    • Template: template1

    • Encoding: UTF8

    • Tablespace: pg_default

    • Collation: ru_RU.UTF-8

    • Character type: C

    • Connection limit: 50

  3. Нажмите Save

Создание базы данных через SQL-запрос
Базовый синтаксис
sql
-- Простейшая команда создания базы
CREATE DATABASE database_name;

-- Пример с основными параметрами
CREATE DATABASE company_db
    WITH 
    OWNER = postgres
    ENCODING = 'UTF8'
    LC_COLLATE = 'ru_RU.UTF-8'
    LC_CTYPE = 'ru_RU.UTF-8'
    TABLESPACE = pg_default
    CONNECTION LIMIT = -1
    IS_TEMPLATE = False;
Продвинутые примеры SQL

Создание базы с наследованием от template0:

sql
CREATE DATABASE analytics_platform
    WITH 
    TEMPLATE = template0
    ENCODING = 'UTF8'
    LC_COLLATE = 'C'
    LC_CTYPE = 'C'
    ALLOW_CONNECTIONS = true
    CONNECTION LIMIT = 100
    IS_TEMPLATE = false;

Создание базы для тестирования:

sql
-- Специальная база для тестов
CREATE DATABASE test_db
    WITH 
    OWNER = test_user
    ENCODING = 'UTF8'
    LC_COLLATE = 'en_US.UTF-8'
    LC_CTYPE = 'en_US.UTF-8'
    CONNECTION LIMIT = 10
    IS_TEMPLATE = false
    COMMENT = 'Тестовая база для разработки';

Создание базы с пользовательским табличным пространством:

sql
-- Сначала создаем табличное пространство
CREATE TABLESPACE fast_ssd
    LOCATION = '/ssd/postgresql/data';

-- Затем создаем базу в этом пространстве
CREATE DATABASE high_performance_db
    WITH 
    OWNER = performance_user
    ENCODING = 'UTF8'
    TABLESPACE = fast_ssd
    CONNECTION LIMIT = -1;
Проверка созданной базы данных
Проверка через pgAdmin
  1. В дереве объектов обновите список (правой кнопкой → Refresh)

  2. Новая база появится в разделе Databases

  3. Разверните базу → Schemas → public

  4. Убедитесь, что база создана успешно

Проверка через SQL
sql
-- Подключитесь к серверу
\c postgres  -- или другая системная база

-- Посмотреть список всех баз данных
SELECT 
    datname as database_name,
    pg_size_pretty(pg_database_size(datname)) as size,
    datcollate as collation,
    datconnlimit as connection_limit
FROM pg_database
WHERE datistemplate = false
ORDER BY datname;

-- Детальная информация о конкретной базе
SELECT 
    datname,
    pg_encoding_to_char(encoding) as encoding,
    datcollate,
    datctype,
    datconnlimit,
    pg_database_size(datname) as size_bytes,
    pg_size_pretty(pg_database_size(datname)) as size_human
FROM pg_database
WHERE datname = 'online_store';
Проверка через командную строку
bash
# Подключение к PostgreSQL
psql -U postgres -h localhost

# Список баз данных
\l

# Детальная информация о базе
\l+ online_store

# Подключение к созданной базе
\c online_store

# Проверка текущей базы
SELECT current_database();
Пост-создательные действия
Создание схем (Schemas)
sql
-- Создание схемы для пользовательских данных
CREATE SCHEMA app_data AUTHORIZATION store_admin;

-- Создание схемы для отчетности
CREATE SCHEMA reports AUTHORIZATION report_user;

-- Настройка пути поиска
ALTER DATABASE online_store SET search_path TO app_data, public;
Создание пользователей и назначение прав
sql
-- Создание пользователя приложения
CREATE USER app_user WITH 
    PASSWORD 'secure_password123'
    NOSUPERUSER
    NOCREATEDB
    NOCREATEROLE
    NOREPLICATION
    CONNECTION LIMIT 20
    VALID UNTIL '2025-12-31';

-- Назначение прав на базу
GRANT CONNECT ON DATABASE online_store TO app_user;

-- Назначение прав на схему
GRANT USAGE ON SCHEMA app_data TO app_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA app_data TO app_user;
GRANT USAGE ON ALL SEQUENCES IN SCHEMA app_data TO app_user;
Настройка расширений (Extensions)
sql
-- Подключение к целевой базе
\c online_store

-- Установка полезных расширений
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";  -- Генерация UUID
CREATE EXTENSION IF NOT EXISTS "pgcrypto";   -- Криптография
CREATE EXTENSION IF NOT EXISTS "postgis";    -- Геопространственные данные
CREATE EXTENSION IF NOT EXISTS "pg_stat_statements";  -- Статистика запросов
Решение распространенных проблем
Проблема 1: Ошибка "permission denied"

Симптомы:

text
ERROR: permission denied to create database

Решение:

sql
-- Проверка текущих прав
SELECT usename, usecreatedb FROM pg_user WHERE usename = CURRENT_USER;

-- Предоставление прав (от имени суперпользователя)
ALTER USER ваш_пользователь CREATEDB;

-- Или создание базы от имени postgres
sudo -u postgres psql
CREATE DATABASE your_db OWNER ваш_пользователь;
Проблема 2: Ошибка кодировки

Симптомы:

text
ERROR: new encoding (UTF8) is incompatible with the encoding of the template database (WIN1251)

Решение:

sql
-- Использование template0 вместо template1
CREATE DATABASE новая_база
    WITH TEMPLATE = template0
    ENCODING = 'UTF8'
    LC_COLLATE = 'ru_RU.UTF-8'
    LC_CTYPE = 'ru_RU.UTF-8';
Проблема 3: Недостаточно места на диске

Решение:

bash
# Проверка свободного места
df -h /var/lib/postgresql

# Очистка старых данных
psql -U postgres -c "DROP DATABASE IF EXISTS old_db;"

# Настройка табличного пространства на другом диске
CREATE TABLESPACE big_disk LOCATION '/mnt/big_disk/postgres';
CREATE DATABASE big_db TABLESPACE big_disk;
Проблема 4: База не отображается в pgAdmin

Решение:

  1. Нажмите Refresh в дереве объектов

  2. Проверьте подключение к правильному серверу

  3. Убедитесь, что у пользователя есть права на просмотр базы

  4. Перезапустите pgAdmin

Лучшие практики создания баз данных
1. Именование баз данных

Рекомендуется:

  • Использовать snake_case: company_db, user_analytics

  • Добавлять суффиксы: _dev, _test, _prod

  • Избегать зарезервированных слов

  • Использовать осмысленные имена

Не рекомендуется:

  • test, temp, db1 — слишком общие

  • my-company-db — дефисы не поддерживаются

  • 123database — начинать с цифры

2. Безопасность
sql
-- Создание отдельного пользователя для каждой базы
CREATE USER app_user WITH PASSWORD 'StrongPassword!2024';

-- Ограничение подключений
ALTER DATABASE production_db CONNECTION LIMIT 100;

-- Отключение публичного доступа
REVOKE CONNECT ON DATABASE sensitive_db FROM PUBLIC;

-- Регулярная смена паролей
ALTER USER app_user WITH PASSWORD 'NewStrongPassword!2025';
3. Производительность
sql
-- Настройка параметров при создании
CREATE DATABASE high_perf_db
    WITH 
    CONNECTION LIMIT = 50
    ALLOW_CONNECTIONS = true;

-- Дополнительные настройки после создания
ALTER DATABASE high_perf_db SET work_mem = '64MB';
ALTER DATABASE high_perf_db SET maintenance_work_mem = '256MB';
ALTER DATABASE high_perf_db SET shared_buffers = '128MB';
4. Документация
sql
-- Добавление комментариев
COMMENT ON DATABASE online_store IS 'Основная база данных интернет-магазина. 
Создана: 2024-01-15. 
Ответственный: отдел разработки.';

-- Хранение метаданных
CREATE TABLE database_metadata (
    db_name VARCHAR(100) PRIMARY KEY,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    created_by VARCHAR(100),
    purpose TEXT,
    version VARCHAR(20),
    backup_schedule TEXT
);

INSERT INTO database_metadata (db_name, created_by, purpose) 
VALUES ('online_store', 'postgres', 'Хранение данных интернет-магазина');
Создание базы для различных сценариев
Для веб-приложения
sql
CREATE DATABASE web_app_db
    WITH 
    OWNER = web_app_user
    ENCODING = 'UTF8'
    LC_COLLATE = 'en_US.UTF-8'
    CONNECTION LIMIT = 200
    IS_TEMPLATE = false
    COMMENT = 'База для веб-приложения на Django/Node.js';
Для аналитики и отчетности
sql
CREATE DATABASE analytics_db
    WITH 
    OWNER = analyst_user
    ENCODING = 'UTF8'
    TABLESPACE = fast_ssd
    CONNECTION LIMIT = 50
    ALLOW_CONNECTIONS = true;
Для разработки и тестирования
sql
-- Тестовая база
CREATE DATABASE test_app_db
    WITH 
    OWNER = developer
    ENCODING = 'UTF8'
    CONNECTION LIMIT = 10
    IS_TEMPLATE = false
    COMMENT = 'Тестовая среда для разработки';
Для геопространственных данных
sql
CREATE DATABASE gis_db
    WITH 
    OWNER = gis_admin
    ENCODING = 'UTF8'
    TEMPLATE = template0;

-- После создания установите PostGIS
\c gis_db
CREATE EXTENSION postgis;
CREATE EXTENSION postgis_topology;
Управление жизненным циклом базы данных
Резервное копирование
bash
# Создание резервной копии через pg_dump
pg_dump -U postgres -d online_store -F c -b -v -f "/backups/online_store_$(date +%Y%m%d).backup"

# Восстановление из резервной копии
pg_restore -U postgres -d online_store_restored "/backups/online_store_20240115.backup"
Мониторинг
sql
-- Мониторинг размера базы
SELECT 
    datname,
    pg_size_pretty(pg_database_size(datname)) as size,
    age(datfrozenxid) as transaction_age,
    numbackends as active_connections
FROM pg_database
WHERE datistemplate = false;
Очистка и обслуживание
sql
-- Анализ и очистка
VACUUM ANALYZE;

-- Перестроение индексов
REINDEX DATABASE online_store;

-- Обновление статистики
ANALYZE;
Заключение

Создание базы данных в PostgreSQL — это фундаментальный процесс, который определяет будущую архитектуру вашего приложения. Ключевые моменты для успешного создания:

  1. Планирование — определите требования к именованию, безопасности и производительности

  2. Использование pgAdmin 4 — удобный графический интерфейс для настройки всех параметров

  3. Правильная настройка — кодировка UTF8, адекватные лимиты подключений

  4. Безопасность — отдельные пользователи, ограничение прав

  5. Документация — комментарии и метаданные для будущего сопровождения

Созданная база данных — это только начало. Следующие шаги включают создание таблиц, настройку индексов, определение бизнес-логики через функции и триггеры, а также настройку репликации для отказоустойчивости.

Помните, что хорошо спроектированная база данных — это основа стабильной и производительной системы. Начните с малого, следуйте лучшим практикам, и ваша база данных будет служить надежной основой для любых приложений.


База данных создана успешно? Переходите к следующему шагу — проектированию таблиц и созданию структуры данных для вашего приложения!

Picture background

Статья подготовлена по материалам обучающего видео для вашего удобства.