Найти в Дзене
Vibecode Wiki

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

PostgreSQL — одна из самых популярных реляционных баз данных. Её используют стартапы, крупные компании и open-source проекты. Она мощная, стабильная и хорошо подходит как для небольших приложений, так и для высоконагруженных систем. Но если вы только начинаете работать с базами данных, легко запутаться в базовых понятиях: В этой статье разберём три фундаментальные вещи: Сначала простыми словами, затем на практике. PostgreSQL — это реляционная база данных. Это означает: Пример простого приложения: Сущность Таблица Пользователи users Посты posts Комментарии comments Каждая таблица содержит строки (records) и колонки (columns). Таблица — это основная структура хранения данных. Проще всего представить её как таблицу в Excel. id name email 1 Alex alex@mail.com 2 Ivan ivan@mail.com В базе это будет таблица users. В PostgreSQL таблица создаётся через SQL: CREATE TABLE users ( id SERIAL PRIMARY KEY, name TEXT NOT NULL, email TEXT UNIQUE NOT NULL, created_at TIMESTAMP DEFAULT NOW(
Оглавление

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:

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 значение по умолчанию

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

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

INSERT INTO users (name, email)

VALUES ('Alex', 'alex@mail.com');

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

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

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

SELECT * FROM users;

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

SELECT * FROM users

WHERE id = 1;

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

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

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

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

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

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

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

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

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

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

users

10 000 000 строк

Запрос:

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

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

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

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

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

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

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

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

CREATE INDEX idx_users_email

ON users(email);

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

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

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

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

Пример:

SELECT *

FROM posts

WHERE author_id = 10;

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

CREATE INDEX idx_posts_author

ON posts(author_id);

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

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

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

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

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

индекс на 10 колонок

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

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

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

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

Например:

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

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

ALTER TABLE users ADD COLUMN age INTEGER;

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

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

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

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

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

Пример:

001_create_users_table.sql

002_add_email_index.sql

003_add_age_column.sql

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

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

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

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

CREATE TABLE users (

id SERIAL PRIMARY KEY,

name TEXT NOT NULL

);

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

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

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 для блога.

Таблицы:

users

posts

comments

users

CREATE TABLE users (

id SERIAL PRIMARY KEY,

email TEXT UNIQUE NOT NULL,

created_at TIMESTAMP DEFAULT NOW()

);

posts

CREATE TABLE posts (

id SERIAL PRIMARY KEY,

title TEXT,

author_id INTEGER REFERENCES users(id),

created_at TIMESTAMP DEFAULT NOW()

);

Индекс:

CREATE INDEX idx_posts_author

ON posts(author_id);

comments

CREATE TABLE comments (

id SERIAL PRIMARY KEY,

post_id INTEGER REFERENCES posts(id),

text TEXT

);

Индекс:

CREATE INDEX idx_comments_post

ON comments(post_id);

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

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

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

Например:

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

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

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

Условия:

таблицы:

- users

- posts

- comments

Требования:

- правильные primary keys

- foreign keys

- индексы для основных запросов

- created_at поля

- SQL для миграций

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

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

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

Итог

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

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

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