Как создавать новые сущности и связи в базе данных
Что проверяют
Умеете ли вы перейти от бизнес-требования к модели данных: выделить сущности, атрибуты и связи и объяснить их разработчикам. Следом обычно дают задачу на доске, например спроектировать заказы и товары, и смотрят, появится ли у вас таблица-связка.
Как отвечать
Идите от предметной области, а не от SQL:
- сущности: существительные из требований, у которых есть свой жизненный цикл и идентификатор: клиент, заказ, товар. Если у атрибута появились свои атрибуты (адрес с городом и индексом), это кандидат в отдельную сущность;
- ключи: первичный ключ, чаще суррогатный (
bigintилиuuid), плюс естественные уникальные поля под ограничениеUNIQUE, например ИНН или email; - связи и кардинальность: один-к-одному, один-ко-многим, многие-ко-многим. Один-ко-многим делается внешним ключом на стороне «многих». Многие-ко-многим требует таблицы-связки, например
order_itemsсorder_id,product_id, количеством и ценой на момент покупки; - обязательность: может ли заказ существовать без клиента. От этого зависят
NOT NULLу внешнего ключа и поведение при удалении:ON DELETE RESTRICT,CASCADEилиSET NULL; - нормализация: до третьей нормальной формы, чтобы каждый факт хранился в одном месте. Денормализация допустима, если вы можете объяснить, ради каких отчётов;
- история: цена в заказе хранится копией, а не ссылкой на текущую цену товара.
Результат работы аналитика это ER-диаграмма (нотация Crow's Foot или IDEF1X, инструменты draw.io, dbdiagram.io, PlantUML) и спецификация: таблицы, поля, типы, ограничения. Изменения схемы в коде оформляют миграциями через Liquibase, Flyway или средства ORM, и новую колонку в большой таблице стоит согласовать с разработкой заранее.
Где спотыкаются
Делают многие-ко-многим списком идентификаторов через запятую в одном поле. Такое поле плохо индексируется и не защищено внешним ключом.
Не различают кардинальность и обязательность. Сказать «один-ко-многим» мало, нужно добавить, может ли сторона быть пустой.
Ссылаются из заказа на текущую цену товара. Через месяц цена изменится, и старые заказы задним числом подорожают.