Как обеспечить соблюдение отношения 1:M в M:M?

#sql-server #database #database-design #entity-framework-core #database-schema

Вопрос:

Я разрабатываю схему базы данных.

В настоящее время существует 2 таблицы:

  1. Задача (идентификатор задачи, имя задачи)
  2. Описание (Идентификатор описания, Описание)

Задача может иметь несколько описаний, но одно и то же описание не должно быть общим для нескольких задач. Описание может содержать 0 или 1 задачу (пользователь должен иметь возможность добавлять описание без задачи и иметь возможность связать задачу позже).

Вариант 1:

Добавьте идентификатор задачи в качестве внешнего ключа, допускающего обнуление, в таблицу описания.

Вариант 2

Вместо этого я могу создать другую таблицу под названием TaskDescription(RowID, TaskId, DescriptionID). Но теперь это М:М. Задача может иметь несколько описаний, и описание может быть общим для нескольких задач. В этом случае, как предотвратить совместное использование одного и того же описания более чем 1 задачей?

Комментарии:

1. В варианте 2 вы можете создать описание независимо от задачи, даже если задача не существует. Имеет ли это смысл? Используйте опцию 1 все столбцы НЕ РАВНЫ НУЛЮ, это делает описание необязательным. Также не забывайте УНИКАЛЬНЫЙ по описанию текст.

2. Вариант 1 также позволяет создавать описание независимо от задачи, делая внешний ключ недействительным.

3. Привет, ты здесь?

Ответ №1:

Вариант 2

Вместо этого я могу создать другую таблицу под названием TaskDescription(RowID, TaskId, DescriptionID). Но теперь это М:М. Задача может иметь несколько описаний, и описание может быть общим для нескольких задач. В этом случае, как предотвратить совместное использование одного и того же описания более чем 1 задачей?

Только двух столбцов с составным первичным ключом (очевидно, в обоих столбцах) будет достаточно для другой таблицы, а также уникального индекса, для descriptionID которого будет применяться

но одно и то же описание не должно быть общим для нескольких задач

Что-то вроде этого (синтаксис Oracle; не обращайте на это внимания. Я надеюсь, что легче понять, что я имею в виду, посмотрев на какой-то код, а не читая мое описание, говорящее на неродном английском языке):

 create table taskDescription  (taskID number constraint fk_td_task references task (task_id),  descriptionID number constriant fk_td_desc references description (descriptionID),  --  constraint pk_td primary key (taskID, descriptionID)  );  create unique index ui1_td on taskDescription (descriptionID);  

При этом база данных обработает все и выдаст ошибку, если вы попытаетесь нарушить какое-либо из принудительных ограничений.