Как подходить к проектированию схем баз данных для новых задач
Что проверяют
Умеете ли вы идти от задачи и запросов к таблицам, а не от таблиц к задаче. Python-разработчику обычно дают бизнес-сценарий, например заказы или бронирования, и просят набросать схему вслух. Следом спрашивают про нормализацию, про деньги и время в типах и про то, как схема будет меняться через миграции.
Как отвечать
Покажите последовательность и на каждом шаге решение, а не пункт из учебника:
- сценарии и запросы: какие операции будут частыми, какие чтения тяжёлые, какой объём данных через год. От этого зависят и индексы, и степень денормализации;
- сущности и связи: один ко многим через внешний ключ, многие ко многим через отдельную таблицу связи, у которой часто есть свои поля (количество, цена на момент заказа);
- нормализация до 3НФ: каждое поле зависит от ключа целиком и только от него. Денормализация допустима, но осознанно и с понятным способом держать данные согласованными;
- типы на примере PostgreSQL: деньги в
numeric, не воfloat; время вtimestamptz; ключиbigint generated always as identityилиuuid;jsonbтолько для действительно гибких атрибутов; - ограничения:
NOT NULL,UNIQUE,CHECK, внешние ключи с продуманнымON DELETE. Целостность, которую держит база, не сломает ни один скрипт в обход ORM; - индексы от запросов: на внешние ключи, на поля фильтров и сортировки, составные в правильном порядке колонок;
- миграции: схема живёт в Alembic для SQLAlchemy или во встроенных миграциях Django. Большие изменения идут в несколько шагов: добавить колонку, заполнить пачками, потом сделать обязательной.
Где спотыкаются
Хранят суммы во float и получают копеечные расхождения, которые потом ищут неделями.
Не знают, что PostgreSQL не создаёт индекс на колонку внешнего ключа автоматически. Django для ForeignKey индекс добавляет сам, а в SQLAlchemy его нужно объявить явно, иначе соединения и удаление родительской строки замедляются.
Складывают всё в jsonb, «чтобы не делать миграции». Через полгода нет ни ограничений, ни нормальных индексов, а запросы обрастают разбором JSON.