Поскольку я не ожидал, что пользователь сможет разместить заказ без действительного адреса, поэтому я просто удалю отдельный FK в таблицу пользователя и с помощью комбинированных полей идентификатора id идентификатора пользователя адресную таблицу как внешний ключ.
CREATE TABLE orders AS (
--[COLUMN DEFINITIONS]
address_id BIGINT NOT NULL,
user_id BIGINT NOT NULL,
CONSTRAINT fk_usr_addr FOREIGN KEY (user_id, address_id)
REFERENCES address(user_id, id)
) ENGINE=InnoDB;
Если заказ является неполным и не имеет адрес еще, то это не должно быть проблемой для мульти столбца внешнего ключа, так как в соответствии с тузда документацией на using foreign keys:
Состязание в стандарте SQL контролирует, как значения NULL в составном (несколько столбцах) внешних ключах обрабатываются по сравнению с первичным ключом. MySQL по существу реализует семантику, определенную MATCH SIMPLE, которые позволяют внешнему ключу быть полностью или частично NULL. В этом случае строка (дочерняя таблица), содержащая такой внешний ключ, имеет значение , разрешенное для вставки, и не соответствует ни одной строке в таблице (родительской). Можно реализовать другую семантику с использованием триггеров .
Пользователь может ввести несколько адресов? –
@Sougata, yup, просто exmaple! но давайте рассмотрим, что вы можете заказать заказы на рабочее место или дома или ... – azerafati
Комплексная «бизнес-логика» должна быть закодирована в слое кода между пользователем и базой данных. –