Мой вопрос сводится к чему-то вроде «Может ли присоединиться к таблице B ограничение проверки для значения в таблице A, которое не является внешним ключом?». Ситуация может быть дополнительно осложнена несколькими ссылками на один и тот же внешний ключ. Конкретный сценарий c, с которым я борюсь, подробно описан ниже с некоторым сокращенным кодом MySQL.
База данных MySQL содержит таблицу «Нарушение» (показано ниже):
CREATE TABLE `Disorder` (
disorder_name VARCHAR(255),
disorder_type VARCHAR(10),
PRIMARY KEY(`disorder_name`)
)
Тип расстройства может быть «синдромом» или «болезнью». Заболевания и синдромы могут быть связаны многими ко многим (например, один и тот же синдром может вызывать несколько заболеваний, а разные синдромы могут вызывать одно и то же заболевание).
I sh для создания таблицы соединения называется «DiseaseSyndromeLink», показывающий взаимосвязь между расстройствами, которые являются «заболеваниями», и расстройствами, которые являются «синдромами».
CREATE TABLE `DiseaseSyndromeLink` (
`ds_id` int NOT NULL AUTO_INCREMENT,
`disease` VARCHAR(255) NOT NULL,
`syndrome` VARCHAR(255) NOT NULL,
PRIMARY KEY (`ds_id`),
FOREIGN KEY (disease) REFERENCES disorder(disorder_name),
FOREIGN KEY (syndrome) REFERENCES disorder(disorder_name)
)
В этой таблице необходимо создать ограничения, которые сложно спроектировать:
-
Первый столбец представляет собой целочисленный идентификатор соединения
Второй столбец «Болезнь» - это внешний ключ, ссылающийся на Disorder.disorder_name. Здесь разрешается вводить только неоправданные имена, где Disorder.disorder_type = 'Болезнь'.
Третий столбец "Синдром" - это внешний ключ, ссылающийся на Disorder.disorder_name. Здесь разрешено вводить только неоправданные имена, где Disorder.disorder_type = 'Syndrome'.
Мне кажется, что синтаксис должен выглядеть примерно так:
CREATE TABLE `DiseaseSyndromeLink` (
`ds_id` int NOT NULL AUTO_INCREMENT,
`disease` VARCHAR(255) NOT NULL,
`syndrome` VARCHAR(255) NOT NULL,
PRIMARY KEY (`ds_id`),
FOREIGN KEY (disease) REFERENCES disorder(disorder_name) WHERE (Disorder.disorder_type='Disease'),
FOREIGN KEY (syndrome) REFERENCES disorder(disorder_name) WHERE (Disorder.disorder_type='Syndrome')
)
Мое понимание в том, что для проверки значений (например, = 'заболевание') требуется проверочное ограничение, тогда как для ссылки на исходную таблицу требуется ограничение внешнего ключа. Я не могу найти какие-либо документы или руководства YouTube, подробно описывающие эти ограничения одновременно. Поскольку было очень трудно найти какие-либо примеры этого кода, я задался вопросом, допустил ли я ошибку в отношении проектирования базы данных, но не могу придумать хорошую альтернативу.
Могут ли проверки и ограничения внешнего ключа использоваться вместе, как это?
Спасибо за ваше время!
ВОПРОС, РЕДАКТИРОВАННЫЙ В КАЧЕСТВЕ ОРИГИНАЛЬНО СОДЕРЖАННОЙ ИНФОРМАЦИИ О ПЫТОКЕ ОБЕСПЕЧЕНИЯ ЭТОГО ОТНОШЕНИЯ НА СТОРОНЕ DJANGO.