Как устроены базы данных: PostgreSQL, SQL, индексы и транзакции на примере Go
Почему AI-код и наивные in-memory хранилища теряют данные после рестарта? Чтобы ответить на этот вопрос, недостаточно просто подключить PostgreSQL: нужно понимать, как устроены реляционная модель, SQL, индексы и транзакции.
В этом уроке пройдём путь от хранения данных в JSON-файле и Excel до полноценной схемы PostgreSQL. На практике подключим базу к Go через pgx и sqlc, настроим миграции с goose и разберём решения, которые не теряют данные в продакшене.
В этом уроке:
- Почему in-memory хранилища теряют данные: разберём рестарты, выкладку новых версий, ограничения оперативной памяти и хранение на диске.
- Как развивались базы данных: от JSON, Excel, иерархических и сетевых моделей до реляционных и нереляционных СУБД.
- На чём основана реляционная модель: реляционная алгебра, реляционное исчисление, SQL и понятие реляционно полного языка.
- Как проектировать схему PostgreSQL: таблицы, кортежи, атрибуты, домены, UUIDv7, NULL, TIMESTAMP и TIMESTAMPTZ.
- Как защищать инварианты данных: PRIMARY KEY, FOREIGN KEY, CHECK CONSTRAINT и нормальные формы.
- Как управлять миграциями: goose, Up и Down, StatementBegin, go:embed и таблица goose_db_version.
- Как работать с PostgreSQL из Go: pgx, sqlc и реализация repository без лишней магии ORM.
- Как писать SQL-запросы: UPDATE, DELETE, JOIN, GROUP BY, ORDER BY, LIMIT и важные граничные случаи.
- Как выбирать индексы: селективность, B-Tree, Hash, GiST, GIN, BRIN, покрывающие и кластерные индексы.
- Что происходит под капотом СУБД: хранение строк, bloat, VACUUM, внутренние оптимизации и отличие TRUNCATE от DELETE.
- Как строить транзакционную бизнес-логику: SELECT FOR UPDATE, конкурентные изменения и паттерн outbox.
В итоге ты получишь цельную инженерную модель работы с базами данных: от математического фундамента и проектирования схемы до индексов и транзакций в Go. Это поможет находить ошибки в AI-сгенерированном коде и принимать осознанные решения для продакшена.