Was ist exklusiver Bogen in der Datenbank und warum ist er böse?

10

Ich habe die häufigsten Fehler beim Datenbankdesign gelesen, die Entwickler- Fragen und Antworten zum Stackoverflow gemacht haben. Bei der ersten Antwort gab es einen Satz über exklusiven Bogen:

Ein exklusiver Bogen ist ein häufiger Fehler, bei dem eine Tabelle mit zwei oder mehr Fremdschlüsseln erstellt wird, wobei einer und nur einer von ihnen ungleich Null sein kann. Großer Fehler. Zum einen wird es umso schwieriger, die Datenintegrität aufrechtzuerhalten. Schließlich hindert auch bei referenzieller Integrität nichts zwei oder mehr dieser Fremdschlüssel daran, gesetzt zu werden (ungeachtet komplexer Überprüfungsbeschränkungen).

Ich verstehe wirklich nicht, warum exklusiver Lichtbogen böse ist. Wahrscheinlich habe ich die Grundlagen nicht verstanden. Gibt es eine gute Erklärung für exklusive Bögen?

Ali Arda Orhan
quelle

Antworten:

8

Soweit ich es vor langer Zeit verstanden habe, enthält eine Tabelle in einem exklusiven Bogen eine Reihe von Spalten, die Fremdschlüssel für andere Tabellen sind, von denen jedoch aufgrund einer logischen Einschränkung in der Domäne jeweils nur eine festgelegt werden kann aus der realen Welt folgen). Da diese Regel in der Datenbank nicht erzwungen werden kann, kann ein beschädigter Datensatz erstellt werden, bei dem mehr als einer dieser Fremdschlüssel einen Wert hat.

Ich werde ein Beispiel machen. Stellen Sie sich eine Anwendung vor, bei der ein Unternehmen die LKWs verfolgt, mit denen es Waren liefert. Ein LKW kann sich nur an einem von drei Orten gleichzeitig befinden: Er kann mit einem Mitarbeiter zusammen sein, er kann sich in einem Parkhaus befinden oder er kann sich in einer Wartungswerkstatt befinden. Dies könnte modelliert werden, indem eine Truck-Tabelle mit EmployeeId, ParkingGarageId und MaintenanceShopId erstellt wird, die auf die Employee-, ParkingGarage- und MaintenanceShop-Tabellen verweist. Es gibt keine Möglichkeit, die Regel durchzusetzen, dass nur eines dieser Felder auf der Ebene der Datenbank ausgefüllt wird. Ein fehlerhafter Code oder jemand mit direktem Zugriff auf die Datenbank könnte einen Datensatz einfügen, in dem zwei oder drei Felder ausgefüllt sind, was einer Datenbeschädigung in der Datenbank gleichkommt.

JDT
quelle
4
Die drei möglichen LKW-Standorte sind Unterklassen einer Oberklasse, "LKW-Standort". Es gibt viele Fälle, in denen sich Unterklassen gegenseitig ausschließen. Die Herausforderung besteht darin, Klassen und Unterklassen in relationalen Tabellen zu modellieren.
Walter Mitty
Ich bin damit einverstanden, dass es Fälle gibt, in denen die Verwendung dieses Designs gerechtfertigt ist. Ich kann jedoch auch dem ursprünglichen Beitrag zustimmen, dass dieses Muster viel häufiger verwendet wird, als es sollte. Es hat auch einige sehr große Nachteile ...
JDT
6
Kann keine Prüfbedingung verwendet werden? Zum Beispiel 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)). Ich mag keine exklusiven Bögen, aber sie können mit einer Prüfbedingung erzwungen werden. Natürlich muss auch die FK-Einschränkung vorhanden sein.
Tulains Córdova
1
Daher die "ungeachtet komplexer Prüfungsbeschränkungen" aus dem oben zitierten Beitrag. Möglicherweise können Sie eine wirklich ausgefeilte Validierung mit Überprüfungsbeschränkungen oder sogar Auslösern durchführen, was es nicht zu einer guten Idee oder einem Zeichen für gutes Design macht. Stellen Sie sich vor, Sie führen Überprüfungsbeschränkungen für exklusive Bögen mit vier oder fünf Spalten durch. Außerdem bin ich mir ziemlich sicher, dass nicht alle Datenbankmodule die CHECK-Einschränkung unterstützen . MySQL gibt in den Dokumenten ausdrücklich an, dass CHECK-Klauseln analysiert, aber ignoriert werden ...
JDT
Diese Quelle empfiehlt exklusiven Lichtbogen. Gedanken?
Alex Moore-Niemi
4

Exklusive Bögen sind nichts Böses. Erzwingen Sie einfach die entsprechende Geschäftsregel mithilfe einer Prüfbedingung. Die meisten gängigen Datenbankverwaltungssysteme unterstützen Überprüfungsbeschränkungen (Oracle, SQL Server, PostgreSQL). Wenn Sie ein Datenmodellierungswerkzeug verwenden, besteht eine gute Chance, dass Ihr Werkzeug automatisch den Code generiert, um die Prüfbeschränkung zu implementieren.

Gary B.
quelle
-1

Der exklusive Bogen ist sehr nützlich im konzeptionellen oder logischen Design. Dies bedeutet nicht, dass Sie auf diese Weise implementieren müssen. Im vorherigen Beispiel kann der Designer entscheiden, das Design mit drei Tabellen zu implementieren. Eine für den Parkplatz, eine für den Mitarbeiter und eine für die Wartungswerkstatt.

Trevor Cummings
quelle