Какие сложности возникают при проектировании базы данных с большим количеством таблиц
Что проверяют
Умеете ли вы держать схему в порядке, когда таблиц уже не десять, а двести, и над ней работает несколько человек. Следом обычно просят рассказать, как вы меняете схему живой базы без простоя.
Как отвечать
Сгруппируйте сложности по тому, что болит в Python-проекте:
- границы модулей: при сотне таблиц важнее нормальных форм понятное деление по предметным областям (в PostgreSQL их можно разнести по схемам) и явные внешние ключи между ними, а не «поле с id на всякий случай»;
- целостность в базе, а не только в коде:
NOT NULL,UNIQUE,CHECK,FOREIGN KEYс продуманнымON DELETE. Валидация в Pydantic или формах Django не спасает от второго сервиса и ручного скрипта. У полиморфных связей вродеGenericForeignKeyвнешнего ключа нет, и мусор копится незаметно; - N+1 в ORM: чем больше связей, тем проще получить сотни запросов на одну страницу. В Django это лечат
select_relatedиprefetch_related, в SQLAlchemyjoinedloadиselectinload, а число запросов проверяют в тестах; - миграции: в команде Alembic регулярно ловит несколько голов, а Django конфликт двух миграций с одним родителем. На больших таблицах опасны операции, которые переписывают таблицу или долго держат блокировку; индекс создают через
CREATE INDEX CONCURRENTLY, в Django этоAddIndexConcurrentlyв неатомарной миграции; - транзакции и блокировки: когда операция задевает пять таблиц, нужен единый порядок блокировок, иначе появляются дедлоки. Границу транзакции задают явно:
transaction.atomic()илиsession.begin(); - денормализация: счётчики и таблицы для чтения вводят осознанно и сразу решают, кто и когда их обновляет.
Хорошо, если опишете свою схему: сколько было таблиц и что оказалось самым хрупким.
Где спотыкаются
Отвечают учебником про третью нормальную форму и не упоминают ORM, миграции и работу в команде. На практике болит именно это.
Предлагают шардирование как ответ на «много таблиц». Число таблиц к объёму данных почти не относится.
Держат всю целостность в Python-коде и считают внешние ключи лишним тормозом. Первый же ручной DELETE или соседний сервис оставит висячие ссылки.