vibecode.wiki
RU EN
~/wiki / dannye-i-khranenie / postgresql-tables-indexes-migrations

PostgreSQL для новичка: таблицы, индексы, миграции

◷ 7 мин чтения 05.03.2026

Следующий шаг

Открой бота или продолжай маршрут внутри раздела.

$ cd раздел/ $ open @mmorecil_bot

Статья -> план в ИИ

Отправь ссылку на эту статью в любой ИИ и получи план внедрения под свой проект.

Прочитай эту статью: https://vibecode.morecil.ru/ru/dannye-i-khranenie/postgresql-tables-indexes-migrations/ Работай в контексте моего текущего проекта. Сделай план внедрения под мой стек: 1) что изменить 2) в каких файлах 3) риски и типичные ошибки 4) как проверить, что всё работает Если есть варианты, дай "быстрый" и "production-ready".
Как использовать
  1. Скопируй этот промпт и отправь в чат с ИИ.
  2. Прикрепи проект или открой папку репозитория в ИИ-инструменте.
  3. Попроси изменения по файлам, риски и короткий чеклист проверки.

PostgreSQL — одна из самых популярных реляционных баз данных. Её используют стартапы, крупные компании и open-source проекты. Она мощная, стабильная и хорошо подходит как для небольших приложений, так и для высоконагруженных систем.

Но если вы только начинаете работать с базами данных, легко запутаться в базовых понятиях:

  • что такое таблица
  • зачем нужны индексы
  • почему разработчики используют миграции
  • как вообще правильно менять структуру базы

В этой статье разберём три фундаментальные вещи:

  • таблицы — где хранятся данные
  • индексы — как ускоряется поиск
  • миграции — как безопасно менять структуру базы

Сначала простыми словами, затем на практике.


Что такое PostgreSQL

PostgreSQL — это реляционная база данных.

Это означает:

  • данные хранятся в таблицах
  • таблицы связаны между собой
  • доступ к данным происходит через SQL

Пример простого приложения:

Сущность Таблица
Пользователи users
Посты posts
Комментарии comments

Каждая таблица содержит строки (records) и колонки (columns).


Таблицы в PostgreSQL

Таблица — это основная структура хранения данных.

Проще всего представить её как таблицу в Excel.

id name email
1 Alex alex@mail.com
2 Ivan ivan@mail.com

В базе это будет таблица users.

Создание таблицы

В PostgreSQL таблица создаётся через SQL:

sql
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    email TEXT UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);

Разберём, что здесь происходит.

Поле Значение
id уникальный идентификатор
SERIAL автоинкремент
PRIMARY KEY главный ключ таблицы
TEXT тип данных
UNIQUE уникальное значение
DEFAULT значение по умолчанию

Добавление данных

Добавим пользователя.

sql
INSERT INTO users (name, email)
VALUES ('Alex', 'alex@mail.com');

Теперь в таблице появилась запись.


Чтение данных

Получить всех пользователей:

sql
SELECT * FROM users;

Получить одного пользователя:

sql
SELECT * FROM users
WHERE id = 1;

Это базовый способ работы с таблицами.

Но есть проблема.

Когда таблица маленькая — всё работает быстро.

Когда в ней миллионы строк — запросы начинают тормозить.

Здесь появляются индексы.


Индексы: зачем они нужны

Индекс — это структура данных, которая ускоряет поиск в таблице.

Без индекса PostgreSQL делает полное сканирование таблицы.

То есть читает каждую строку.

Представьте таблицу:

code
users
10 000 000 строк

Запрос:

sql
SELECT * FROM users WHERE email = 'alex@mail.com';

Без индекса база проверит 10 миллионов строк.

С индексом — она найдёт строку почти мгновенно.


Как работает индекс

Индекс похож на оглавление в книге.

Вместо того чтобы листать книгу, вы смотрите в оглавление и переходите на нужную страницу.

PostgreSQL использует структуры вроде B-tree.


Создание индекса

sql
CREATE INDEX idx_users_email
ON users(email);

Теперь поиск по email будет быстрым.


Когда нужно добавлять индексы

Обычно индекс создают для:

Сценарий Нужен индекс
поиск по email да
поиск по id уже есть
фильтр WHERE часто
JOIN таблиц почти всегда

Пример:

sql
SELECT *
FROM posts
WHERE author_id = 10;

Лучше создать индекс:

sql
CREATE INDEX idx_posts_author
ON posts(author_id);

Когда индексы вредны

Индексы ускоряют чтение, но замедляют запись.

Каждый INSERT и UPDATE обновляет индекс.

Поэтому нельзя создавать индексы на всё подряд.

Плохой пример:

code
индекс на 10 колонок
которые почти не используются

Это замедляет базу.


Миграции: управление схемой базы

Когда проект развивается, структура базы постоянно меняется.

Например:

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

Можно делать это вручную:

sql
ALTER TABLE users ADD COLUMN age INTEGER;

Но в реальных проектах так не делают.

Используют миграции.


Что такое миграция

Миграция — это версионированное изменение структуры базы данных.

Каждое изменение хранится как отдельный файл.

Пример:

code
001_create_users_table.sql
002_add_email_index.sql
003_add_age_column.sql

Это позволяет:

  • повторить структуру базы
  • откатить изменения
  • синхронизировать команду

Пример миграции

Создание таблицы:

sql
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL
);

Следующая миграция:

sql
ALTER TABLE users
ADD COLUMN email TEXT;

Каждая миграция применяется один раз.

PostgreSQL или фреймворк хранит информацию о выполненных миграциях.


Таблица миграций

Обычно создаётся служебная таблица.

version executed_at
001 2026-01-01
002 2026-01-02

Это помогает системе понять:

какие миграции уже применены.


Миграции во фреймворках

Почти все backend-фреймворки имеют систему миграций.

Фреймворк Инструмент
Node.js Prisma / Knex
Django Django migrations
Laravel Laravel migrations
Ruby on Rails ActiveRecord migrations

Пример миграции в Node (Knex):

javascript
exports.up = function(knex) {
  return knex.schema.createTable('users', table => {
    table.increments('id').primary()
    table.string('email').unique()
    table.timestamps(true, true)
  })
}

Типичные ошибки новичков

Нет первичного ключа

Каждая таблица должна иметь PRIMARY KEY.

Обычно это id.


Нет индексов

Большие таблицы без индексов быстро начинают тормозить.


Ручные изменения базы

Если разработчик изменяет базу вручную, а не через миграции:

  • окружения начинают отличаться
  • появляется хаос

Изменение существующих миграций

Нельзя менять старые миграции.

Нужно создавать новую.


Практический пример структуры базы

Представим API для блога.

Таблицы:

code
users
posts
comments

users

sql
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    email TEXT UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);

posts

sql
CREATE TABLE posts (
    id SERIAL PRIMARY KEY,
    title TEXT,
    author_id INTEGER REFERENCES users(id),
    created_at TIMESTAMP DEFAULT NOW()
);

Индекс:

sql
CREATE INDEX idx_posts_author
ON posts(author_id);

comments

sql
CREATE TABLE comments (
    id SERIAL PRIMARY KEY,
    post_id INTEGER REFERENCES posts(id),
    text TEXT
);

Индекс:

sql
CREATE INDEX idx_comments_post
ON comments(post_id);

Такая схема уже подходит для реального приложения.


Как применять это через ИИ

ИИ-ассистенты могут значительно ускорить работу с базой данных.

Например:

  • проектирование схемы
  • создание миграций
  • оптимизация индексов
  • анализ медленных запросов

Пример универсального промпта:

code
Спроектируй PostgreSQL схему для приложения блога.

Условия:

таблицы:
- users
- posts
- comments

Требования:
- правильные primary keys
- foreign keys
- индексы для основных запросов
- created_at поля
- SQL для миграций

Также объясни, почему выбраны эти индексы.

ИИ может сгенерировать:

  • структуру таблиц
  • SQL-миграции
  • рекомендации по индексам.

Итог

Если упростить, PostgreSQL держится на трёх фундаментальных вещах:

Компонент Назначение
Таблицы хранение данных
Индексы ускорение поиска
Миграции управление схемой базы

Понимание этих трёх элементов — база для любой backend-разработки.