Czym jest wyłączny łuk w bazie danych i dlaczego jest zły?


10

Czytałem najczęściej popełniane błędy w projektowaniu baz danych popełniane przez deweloperów pytania i odpowiedzi dotyczące przepływu stosu. Przy pierwszej odpowiedzi padło zdanie na temat łuku wyłącznego:

Łuk wyłączny jest częstym błędem, gdy tabela jest tworzona z dwoma lub więcej kluczami obcymi, przy czym jeden i tylko jeden z nich może mieć wartość inną niż null. Duży błąd. Z jednej strony utrzymanie integralności danych jest o wiele trudniejsze. W końcu, nawet przy integralności referencyjnej, nic nie stoi na przeszkodzie, aby ustawić dwa lub więcej z tych kluczy obcych (pomimo złożonych ograniczeń sprawdzania).

Naprawdę nie rozumiem, dlaczego ekskluzywny łuk jest zły. Prawdopodobnie nie zrozumiałem jego podstaw. Czy jest jakieś dobre wytłumaczenie na temat ekskluzywnych łuków?

Odpowiedzi:


8

O ile rozumiałem to dawno temu, w ekskluzywnym łuku tabela zawiera wiele kolumn, które są kluczami obcymi do innych tabel, ale tylko jedną z nich można ustawić na raz (z powodu pewnych logicznych ograniczeń w domenie wynikające z prawdziwego świata). Ponieważ reguły tej nie można wymusić w bazie danych, można utworzyć uszkodzony rekord, w którym więcej niż jeden z tych kluczy obcych ma wartość.

Dam przykład. Rozważ aplikację, w której firma śledzi ciężarówki, których używa do dostarczania towarów. Ciężarówka może znajdować się tylko w jednym z trzech miejsc jednocześnie: może być z pracownikiem, może znajdować się w garażu lub w warsztacie serwisowym. Można to modelować, tworząc tabelę ciężarówek z pracownikami, parkingGarageId i MaintenanceShopId, odwołując się do tabel Employee, ParkingGarage i MaintenanceShop. Nie ma sposobu na wymuszenie reguły, że tylko jedno z tych pól jest wypełniane na poziomie bazy danych. Zły kod lub ktoś mający bezpośredni dostęp do bazy danych może wstawić rekord, który ma dwa lub trzy pola wypełnione, co oznacza uszkodzenie danych w bazie danych.


4
Trzy możliwe lokalizacje ciężarówek to podklasy nadklasy „lokalizacja ciężarówek”. W wielu przypadkach podklasy wykluczają się wzajemnie. Wyzwaniem staje się sposób modelowania klas i podklas w tabelach relacyjnych.
Walter Mitty,

Zgadzam się, że istnieją przypadki, w których użycie tego projektu jest uzasadnione. Mogę jednak zgodzić się również z oryginalnym postem, że ten wzór jest używany dużo DUŻO niż powinien. Ma też bardzo duże wady ...
JDT,

6
Czy nie można zastosować ograniczenia sprawdzającego? Na przykład 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)). Nie lubię ekskluzywnych łuków, ale można je egzekwować ograniczeniem sprawdzania. Oczywiście ograniczenie FK musi być również obecne.
Tulains Córdova

1
Stąd „pomimo złożonych ograniczeń kontroli” z cytowanego powyżej postu. Możesz być w stanie przeprowadzić naprawdę skomplikowaną walidację z ograniczeniami sprawdzania lub do cholery, a nawet wyzwalaczami, co nie czyni z tego dobrego pomysłu ani dowodu dobrego projektu. Wyobraź sobie, że wykonujesz ograniczenia kontrolne dla wyłącznych łuków z czterema lub pięcioma kolumnami ... Jestem też całkiem pewien, że nie wszystkie silniki baz danych obsługują ograniczenie CHECK . MySQL wyraźnie stwierdza w dokumentach, że klauzule CHECK są parsowane, ale ignorowane ...
JDT

To źródło zaleca ekskluzywny łuk. Myśli?
Alex Moore-Niemi

4

W ekskluzywnych łukach nie ma nic złego. Po prostu egzekwuj odpowiednią regułę biznesową, używając ograniczenia sprawdzania. Większość głównych systemów zarządzania bazami danych obsługuje ograniczenia sprawdzania (Oracle, SQL Server, PostgreSQL). Jeśli używasz narzędzia do modelowania danych, istnieje duże prawdopodobieństwo, że Twoje narzędzie automatycznie wygeneruje kod w celu wdrożenia ograniczenia sprawdzania.


-1

Ekskluzywny łuk jest bardzo przydatny w projektowaniu koncepcyjnym lub logicznym. Nie oznacza to, że musisz to wdrożyć. We wcześniejszym przykładzie projektant może zdecydować się na wdrożenie projektu z trzema tabelami. Jeden dla miejsca parkingowego, jeden dla pracownika i jeden dla serwisu technicznego.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.