#sql-server #database #database-design #entity-framework-core #database-schema
Вопрос:
Я разрабатываю схему базы данных.
В настоящее время существует 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);
При этом база данных обработает все и выдаст ошибку, если вы попытаетесь нарушить какое-либо из принудительных ограничений.