Що таке ексклюзивна дуга в базі даних і чому це зло?


10

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

Ексклюзивна дуга є поширеною помилкою, коли створюється таблиця з двома або більше сторонніми ключами, де один і лише один з них може бути ненульовим. Велика помилка. З одного боку, набагато складніше підтримувати цілісність даних. Зрештою, навіть з референтною цілісністю, ніщо не заважає встановити два чи більше цих зовнішніх ключів (незважаючи на складні обмеження перевірки).

Я дійсно не розумію, чому ексклюзивна дуга - це зло. Напевно, я не зрозумів основ цього. Чи є якісь хороші пояснення щодо ексклюзивних дуг?

Відповіді:


8

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

Я зроблю приклад. Розгляньте додаток, коли компанія відслідковує вантажівки, які використовує для доставки товарів. Вантажівка може знаходитися одночасно в одному з трьох місць: вона може бути з працівником, може бути в гаражі для стоянки або в магазині технічного обслуговування. Це можна змоделювати за допомогою столу вантажних автомобілів із службовим ідентифікатором, паркуванняГаражІд та обслуговуванняСхопІд, посилаючись на таблиці «Співробітник», «ПаркінгГараж» та «Технічне обслуговування». Неможливо застосувати правило про те, що на рівні бази даних заповнюється лише одне з цих полів. Неправильний код або особа, що має прямий доступ до бази даних, може вставити запис із заповненими двома-трьома полями, що означає пошкодження даних у базі даних.


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)). Мені не подобаються ексклюзивні дуги, але їх можна застосовувати з обмеженням перевірки. Звичайно, обмеження ФК також повинно бути присутнім.
Tulains Córdova

1
Звідси "незважаючи на складні обмеження перевірки" з цитованої вище посади. Можливо, вам вдасться зробити справді складну перевірку з обмеженнями перевірки або чортви, навіть тригерами, що не робить це гарною ідеєю чи знаком хорошого дизайну. Уявіть, що ви перевіряєте обмеження на ексклюзивних дугах з чотирма чи п’ятьма колонками ... Крім того, я цілком впевнений, що не всі двигуни бази даних підтримують обмеження CHECK . MySQL прямо в документах стверджує, що пропозиції CHECK проаналізовані, але проігноровані ...
JDT

Це джерело рекомендує ексклюзивну дугу. Думки?
Алекс Мур-Ніємі

4

У ексклюзивних дугах немає нічого зла. Просто застосуйте відповідне правило бізнесу, використовуючи обмеження чека. Більшість основних систем управління базами даних підтримують обмеження перевірки (Oracle, SQL Server, PostgreSQL). Якщо ви використовуєте інструмент моделювання даних, то є велика ймовірність того, що ваш інструмент автоматично генерує код для реалізації обмеження перевірки.


-1

Ексклюзивна дуга дуже корисна в концептуальному чи логічному дизайні. Це не означає, що вам доведеться реалізувати саме так. У попередньому прикладі дизайнер може вирішити реалізувати дизайн за допомогою трьох таблиць. Одне для місця стоянки, одне для працівника та одне для технічного обслуговування.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.