Какие виды связей существуют: многие ко многим, один ко многим, один к одному
Что проверяют
Умеете ли вы по описанию предметной области определить кардинальность и не ошибиться на границах. Следом обычно дают пример из жизни («заказ и адрес доставки», «сотрудник и отдел») и просят нарисовать модель.
Как отвечать
Назовите три вида и сразу покажите, как их реализуют в реляционной модели:
- один к одному: одной записи соответствует не больше одной записи с другой стороны. Реализуют внешним ключом с ограничением уникальности. Отдельную таблицу заводят, когда часть атрибутов редкая, тяжёлая или требует особого доступа;
- один ко многим: у родителя много потомков, у потомка один родитель. Внешний ключ живёт на стороне «многих»: у книги ссылка на издательство, а не наоборот;
- многие ко многим: напрямую в таблицах не выражается, нужна связующая таблица. Часто у неё появляются свои атрибуты, и она становится полноценной сущностью, например «запись на курс» с датой и оценкой.
Хороший ответ добавляет обязательность. Кардинальность говорит, сколько максимум, обязательность говорит, может ли быть ноль. В UML это кратности 0..1, 1, 0..*, 1..*, в нотации «вороньей лапки» кружок и черта на концах линии.
Покажите, как вы уточняете кардинальность у бизнеса. Не «какая тут связь?», а конкретные вопросы: может ли у заказа быть несколько адресов? А у клиента несколько договоров? Нужна ли история изменений? Последний вопрос особенно важен: как только нужна история, один к одному почти всегда превращается в один ко многим.
Где спотыкаются
Приводят «человек и паспорт» как пример один к одному. У человека бывает внутренний и заграничный паспорт, старый меняется на новый, и системе часто нужна вся цепочка.
Хранят многие ко многим списком идентификаторов в одной колонке. Целостность не проверяется, а поиск и отчёты превращаются в мучение.
Ставят ссылку на стороне «одного» в связи один ко многим. Тогда клиент может сослаться только на один заказ, и модель ломается на втором же.