2016-03-30 2 views
1

Кажется рациональным, чтобы я запретил пользователям или плохим кодам вставлять неверные данные, но я не помню, чтобы видеть это где угодно!сложные ограничения mysql над внешними ключами

Рассмотрим следующие таблицы enter image description here

  • Как я могу убедиться, что порядок всегда ссылается адрес, который создается тем же пользователем?
  • Является ли такое ограничение обычным и рекомендуемым? Я имею в виду, мне даже нужно заботиться об этом в дизайне?
+1

Пользователь может ввести несколько адресов? –

+0

@Sougata, yup, просто exmaple! но давайте рассмотрим, что вы можете заказать заказы на рабочее место или дома или ... – azerafati

+0

Комплексная «бизнес-логика» должна быть закодирована в слое кода между пользователем и базой данных. –

ответ

1

Поскольку я не ожидал, что пользователь сможет разместить заказ без действительного адреса, поэтому я просто удалю отдельный 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. В этом случае строка (дочерняя таблица), содержащая такой внешний ключ, имеет значение , разрешенное для вставки, и не соответствует ни одной строке в таблице (родительской). Можно реализовать другую семантику с использованием триггеров .

+0

приятное предложение! спасибо, но у меня есть неполные заказы, где адрес еще не установлен, и что произойдет, если пользователь решит удалить один из своих адресов в любое время? – azerafati

+0

Заказ не следует изменять после его завершения. Таким образом, если пользователь хочет изменить или удалить адрес, который уже находится в завершенном порядке, вам необходимо создать новую запись адреса или пометить адрес, удаленный в таблице адресов yor, но фактически не удалить адрес. Другое решение - не использовать адрес в качестве внешнего ключа, а копировать его содержимое в заказ. В этом случае даже не будет иметь внешнего ключа в адресной таблице. Вы можете использовать триггеры для этого сценария для обеспечения целостности данных. – Shadow

+0

получил, спасибо. – azerafati

Смежные вопросы