Евгений Зайферт базы данных считает одним из самых затратных по времени элементов в backend-разработке. Он говорит, что большинство проблем появляется не на этапе написания кода, а при работе с данными. Запросы начинают тормозить, структура таблиц усложняется, а исправления занимают больше времени, чем сама фича. В разговоре он подробно разобрал, с чем сталкивается чаще всего.
«Самое тяжёлое — это когда база уже работает, а требования меняются. Переделывать структуру под новые запросы всегда дороже, чем кажется вначале.»
Евгений Зайферт базы данных и первые ошибки
Евгений Зайферт базы данных проектирует с запасом по полям и индексам. Он отмечает, что на старте часто добавляют лишние связи, которые потом мешают. Когда таблиц становится много, простые выборки начинают требовать нескольких джойнов. Это сразу отражается на скорости ответа. Он старается заранее продумать, какие данные будут запрашиваться вместе, и держать их ближе друг к другу.

Отдельная проблема — отсутствие нормализации на нужном уровне. Если всё складывать в одну таблицу, потом сложно добавлять новые сущности. Если нормализовать слишком сильно, количество запросов растёт. Евгений Зайферт говорит, что баланс находят только после первых реальных нагрузок.
Нагрузка и медленные запросы
Когда количество записей растёт, даже простые запросы начинают работать медленнее. Евгений Зайферт объясняет, что чаще всего виноваты отсутствующие индексы или неправильный порядок условий. Он регулярно смотрит планы выполнения и убирает лишние поля из SELECT. Это даёт заметный прирост без изменения логики.
Он также отмечает проблему с N+1 запросами. Когда в цикле выполняется отдельный запрос на каждую запись, время ответа увеличивается в разы. В таких случаях он переписывает выборку на один запрос с нужными связями. После этого нагрузка на базу снижается, а код становится проще читать.
Изменение структуры под новые задачи
Самая затратная часть работы — это изменение уже существующей базы. Евгений Зайферт говорит, что добавление нового поля или связи требует миграции, проверки старых данных и тестов. Если в таблице миллионы записей, процесс занимает часы и требует окна на обслуживание. Он старается заранее закладывать возможные изменения, чтобы не трогать структуру позже.
Иногда приходится переносить данные в новую таблицу. Это всегда риск потерять часть информации или нарушить связи. Поэтому он делает бэкап и проверяет результат на копии. После переноса старые запросы нужно переписать под новую схему. На это уходит дополнительное время.
Работа с транзакциями и блокировками
Евгений Зайферт отмечает, что транзакции спасают от части ошибок, но создают свои сложности. Длинные транзакции держат блокировки и мешают другим запросам. Он старается держать их короткими и выполнять только необходимые изменения внутри. Если операция большая, разбивает её на несколько шагов.
При высокой нагрузке появляются дедлоки. В таких случаях он смотрит порядок обращения к таблицам и выравнивает его во всех местах. Это уменьшает количество конфликтов. Он говорит, что полностью избежать блокировок сложно, но их можно сделать предсказуемыми.
Резервное копирование и восстановление
Евгений Зайферт считает резервные копии обязательной частью работы с базой. Он настраивает автоматические бэкапы и проверяет, что из них можно восстановить данные. Один раз в месяц делает тестовое восстановление на отдельном сервере. Это показывает, сколько времени реально уйдёт в случае сбоя.

Он также хранит копии на отдельном диске. Если основной сервер недоступен, данные можно поднять в другом месте. После восстановления проверяет целостность связей и количество записей. Только после этого считает, что база в рабочем состоянии.
Что помогает снизить сложность
Евгений Зайферт советует начинать с простой схемы и добавлять сложность только по мере необходимости. Он ведёт документацию по основным запросам и индексам. Это помогает новым людям быстрее разобраться в проекте. Также он регулярно смотрит медленные запросы и убирает их до того, как они станут проблемой.
В итоге основная сложность работы с базами — это не написание запросов, а поддержка структуры при изменении требований. Евгений Зайферт говорит, что если заложить время на это заранее, проект идёт спокойнее. Иначе правки базы начинают занимать больше времени, чем сама разработка.
Ранее о Евгений Зайферт: Работа над независимыми игровыми проектами
Источник: Практика работы с базами данных в backend-разработке




Обсуждение статьи