Недавно я столкнулся с этим сценарием несколько раз в разных проектах. Вот схема из четырех таблиц, помеченная буквы:Конструкция отношений с четырьмя таблицами
A
1/\ 1
/ \
*/ \ *
B C
1 \ /1
\ /
* \/*
D
В этом случае, возможно, для данных, чтобы стать противоречивыми, если ключи от B
к A
и C
к A
не совпадают для данный D
.
для конкретного (составленного), например, представить себе A
является Company
, B
является Employee
, C
является Project
и D
является WorkItem
. В этом случае нет ничего, что могло бы остановить создание рабочего элемента, который утверждает, что его назначают человеку, который даже не работает для компании, которая владеет проектом.
Мне в основном просто любопытно, есть ли дизайн решение этой проблемы? Я знаю, что в реальных приложениях, когда это имеет значение, вы можете использовать триггеры или какую-либо другую защиту. Я не нашел способа изменить таблицы, чтобы сделать такую несостоятельность невозможной. Есть ли способ?
Обратите внимание, что только отделяя одно из соединений, как от C
к A
не работает, потому что если нет D
«s существуют для этого C
вы не имели бы никакого способа отслеживания соединений обратно A
.
Хороший вопрос. Я всегда ставил меры предосторожности для предотвращения такого рода вещей на прикладном уровне. Будет интересно посмотреть, что другие скажут. –
Я использую для ограничения такого рода ограничений в бизнес-правилах, а не триггерах. –
Переопределите свои сущности: employee - >> person (помните: бывший сотрудник emplyee был сотрудником один раз) Возможно, потребуется временная ось (и несколько других дополнительных измерений, найдите скрытые размеры). – wildplasser