Что такое эксклюзивная дуга в базе данных и почему это зло?

10

Я читал наиболее распространенные ошибки проектирования баз данных, сделанные разработчиками Q & A в stackoverflow. При первом ответе была фраза об эксклюзивной дуге:

Исключительная дуга является распространенной ошибкой, когда таблица создается с двумя или более внешними ключами, где один и только один из них может быть ненулевым. Большая ошибка. С одной стороны, становится намного сложнее поддерживать целостность данных. В конце концов, даже при ссылочной целостности ничто не препятствует установке двух или более этих внешних ключей (несмотря на сложные ограничения проверки).

Я действительно не понимаю, почему исключительная дуга - это зло. Вероятно, я не понял основы этого. Есть ли хорошее объяснение эксклюзивных дуг?

Али Арда Орхан
источник

Ответы:

8

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

Я приведу пример. Рассмотрим приложение, в котором компания отслеживает грузовики, которые она использует для доставки товаров. Грузовик может находиться только в одном из трех мест одновременно: он может быть с работником, он может находиться в гараже или в магазине технического обслуживания. Это может быть смоделировано с помощью таблицы Truck с employeeId, parkingGarageId и maintenanceShopId, ссылающейся на таблицы Employee, ParkingGarage и MaintenanceShop. Невозможно применить правило, согласно которому только одно из этих полей заполняется на уровне базы данных. Неверный код или кто-то с прямым доступом к базе данных может вставить запись, заполненную двумя или тремя полями, что равносильно повреждению данных в базе данных.

JDT
источник
4
Три возможных местоположения грузовика - подкласс суперкласса, "местоположение грузовика". Есть много случаев, когда подклассы являются взаимоисключающими. Задача состоит в том, как моделировать классы и подклассы в реляционных таблицах.
Уолтер Митти
Я согласен, что есть случаи, когда использование этого дизайна оправдано. Однако я также могу согласиться с оригинальным постом, что этот шаблон используется намного больше, чем следовало бы. У него тоже есть очень большие недостатки ...
JDT
6
Не может быть использовано ограничение проверки? Например alter table mytable add constraint myconstraint check ((col1 is not null and col2 is null and col3 is null) or (col1 is null and col2 is not null and col3 is null) or (col1 is null and col2 is null and col3 is not null)). Я не люблю эксклюзивные дуги, но их можно применять с помощью ограничения проверки. Конечно, ограничение FK также должно присутствовать.
Тулаинс Кордова
1
Отсюда и «сложные ограничения проверки» из приведенного выше поста. Возможно, вам удастся выполнить действительно сложную проверку с проверочными ограничениями или хеком, даже триггерами, что не делает его хорошей идеей или знаком хорошего дизайна. Представьте себе, что вы делаете проверочные ограничения для исключительных дуг с четырьмя или пятью столбцами ... Кроме того, я вполне уверен, что не все движки баз данных поддерживают ограничение CHECK . MySQL прямо указывает в документах, что предложения CHECK анализируются, но игнорируются ...
JDT
Этот источник рекомендует эксклюзивную дугу. Мысли?
Алекс Мур-Ниеми
4

В эксклюзивных дугах нет ничего плохого. Просто примените соответствующее бизнес-правило, используя проверочное ограничение. Большинство основных систем управления базами данных поддерживают проверочные ограничения (Oracle, SQL Server, PostgreSQL). Если вы используете инструмент моделирования данных, то есть большая вероятность, что ваш инструмент автоматически сгенерирует код для реализации проверочного ограничения.

Гари Б
источник
-1

Эксклюзивная дуга очень полезна в концептуальном или логическом дизайне. Это не значит, что вы должны реализовать этот способ. В более раннем примере дизайнер может решить реализовать дизайн с тремя таблицами. Один для парковки, один для работника и один для технического обслуживания.

Тревор Каммингс
источник