Применить внешний ключ и проверить ограничение к таблице MySQL - PullRequest
0 голосов
/ 16 января 2020

Мой вопрос сводится к чему-то вроде «Может ли присоединиться к таблице 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.

1 Ответ

0 голосов
/ 16 января 2020

Как я вижу, ваше заявление MYSQL вроде работает, поэтому все, что вам нужно сделать, это добавить внешний ключ таким же образом, как и вы, в модель. Хотя на этот раз вы установите «null = True», и если у вас есть уникальные значения, то «unique = True» позаботится о пустых столбцах. Теперь вам нужно реализовать отдых в логике приложения c при добавлении данных, вы должны знать критерии «тип заболевания» и т. Д. c. Но когда вы читаете из базы данных, Django будет автоматически выполнять предварительную выборку. Пример запроса для чтения данных.

data=Diseasesyndromelink.objects.filter(disease__feild="query")
print(data.disease) #your foreign key object is prefetched here already.

Ознакомьтесь с документацией для получения дополнительных примеров. https://docs.djangoproject.com/en/3.0/topics/db/models/

...