Ich habe die häufigsten Fehler beim Datenbankdesign gelesen, die vom Entwickler Q & A beim Stapelüberlauf. 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 darf nicht null sein. Großer Fehler. Zum einen wird es umso schwieriger, die Datenintegrität aufrechtzuerhalten. Schließlich hindert auch bei referenzieller Integrität nichts das Setzen von zwei oder mehr dieser Fremdschlüssel (ungeachtet komplexer Überprüfungsbeschränkungen).
Ich mache das wirklich nicht Ich verstehe 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?
Antwort
Soweit ich es vor langer Zeit verstanden habe, in einer exklusiven arc Eine Tabelle enthält eine Reihe von Spalten, die Fremdschlüssel für andere Tabellen sind. Es kann jedoch immer nur eine davon festgelegt werden (aufgrund einer logischen Einschränkung der Domäne, die sich aus der realen Welt ergibt). Da diese Regel in der Datenbank nicht durchgesetzt werden kann, kann ein beschädigter Datensatz erstellt werden, bei dem mehr als einer dieser Fremdschlüssel einen Wert hat.
Ich werde ein Beispiel anführen. Betrachten Sie eine Anwendung, bei der ein Unternehmen den Überblick behält Die LKWs, mit denen Waren geliefert werden. Ein LKW kann sich nur an einem von drei Orten gleichzeitig befinden: Er kann sich mit einem Mitarbeiter, in einem Parkhaus oder in einer Wartungswerkstatt befinden. Dies kann modelliert werden Es gibt keine Möglichkeit, die Regel durchzusetzen, dass nur eines dieser Felder auf Datenbankebene ausgefüllt wird. Ungültiger Code oder. Es gibt keine Möglichkeit, die Regel durchzusetzen, dass nur eines dieser Felder auf Datenbankebene ausgefüllt wird. Ungültiger 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.
Kommentare
- 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.
- Ich stimme zu, dass es Fälle gibt, in denen die Verwendung dieses Entwurfs 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 …
- 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. - Daher die " komplexen Überprüfungsbeschränkungen ungeachtet " aus dem Beitrag oben zitiert. Möglicherweise können Sie eine wirklich ausgefeilte Validierung mit Überprüfungsbeschränkungen oder sogar Auslösern durchführen, die ' nicht zu einer guten Idee oder einem Zeichen für gutes Design machen. Stellen Sie sich vor, Sie überprüfen exklusive Bögen mit vier oder fünf Spalten auf Einschränkungen. Außerdem bin ich ' ziemlich sicher, dass nicht alle Datenbankmodule sind Unterstützen Sie die CHECK-Einschränkung . MySQL gibt in den Dokumenten ausdrücklich an, dass CHECK-Klauseln analysiert, aber ignoriert werden …
- Diese Quelle empfiehlt exklusiven Bogen. Gedanken?
Antwort
Exklusive Bögen haben 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.
Antwort
Der exklusive Bogen ist sehr nützlich für das konzeptionelle oder logische 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 zum Parken Standort, einer für den Mitarbeiter und einer für die Wartungswerkstatt.