Если я правильно понимаю вашу проблему,
- Мощность отношения ЗАКАЗА к ДОСТАВКЕ составляет 1 ---> (0, 1)
- Кардинальность отношения ORDER к PICKUP равна 1 ---> (0, 1)
- ЗАКАЗ ДОЛЖЕН иметь либо ДОСТАВКУ, либо ПИКАП, но не оба.
Чтобы применить ограничение (# 3), вы можете определить функциональное ограничение в базе данных. Это входит в интересные вещи.
В любом случае, как вы говорите, вы можете сделать в ORDER столбцы, которые являются FK для таблиц SHIPPING или PICKUP, но оба из них могут иметь значение null. Я не думаю, что нулевые FK - это зло или что-то в этом роде, но они становятся грязными, особенно если у вас есть целая куча способов доставки, а не только два.
Если вам не нравятся пустые значения, вы можете иметь отдельные таблицы ассоциаций: (1) ORDER_DELIVERY, который имеет только order_id и delivery_id, каждый из которых является FK для соответствующих таблиц, и (2) ORDER_PICKUP, также с двумя столбцами Таблица. В каждом случае первичный ключ будет order_id
. Теперь нет нулевых значений: заказы с доставкой находятся в таблице ORDER_DELIVERY, а заказы с доставкой - в ORDER_PICKUP.
Конечно, есть компромисс, поскольку поддержание ограничения на наличие только одного и только одного метода доставки не является проверкой согласованности между таблицами.
Другая идея заключается в том, чтобы детали доставки и доставки были полями JSON. Здесь вы выполняете больше работы на стороне приложения, программно устанавливая ограничения, но у вас не будет нулевых значений.
Хотелось бы сказать, что здесь был шаблон дизайна для глухих, но я его не вижу. Лично с двумя типами доставки я бы не стеснялся иметь нулевые значения (так как я не пурист). Но я люблю, когда база данных работает, так что ...
(О, ответ на вопрос «ты слишком много думаешь?» - нет, это мышление действительно хорошо!)