In meiner Datenbankstruktur in SQL Server gibt es drei Arten von Produkten, für die unterschiedliche Informationen zur Bestellung erforderlich sind. Also, habe ich einen Customers
Tisch und drei verschiedene Aufträge Tabellen: OrdersForProductAs
, OrdersForProductBs
, OrdersForProductCs
. Die Tabelle mit allen Bestellungen hat eine bis viele Beziehungen auf dem Customers
Tisch.
Ich habe auch eine andere Tabelle, die Payments
die Zahlungsdetails enthält und enthalten wird. Aber ich habe hier Zweifel, wie ich es strukturieren soll.
Da ich mehrere Produkttypen habe und ein Kunde möglicherweise gleichzeitig mehrere Produkte bestellt, muss ich diese drei Auftragstabellen mit Tabellen verknüpfen Payments
.
Das andere Problem ist, dass ein Kunde möglicherweise nur eine Produktart bestellt. Also müssen die FK-Spalten auf dem Payments
Tisch sein nullable
.
Meine Frage ist, ob nullable
mir diese FK-Säulen auf lange Sicht Kopfzerbrechen bereiten würden oder nicht. Wäre es im Allgemeinen eine schlechte Praxis, nullfähige FK-Spalten in einer Tabelle zu haben?
Antworten:
Ich würde fragen, warum Sie überhaupt
OrdersForProductX
Tische haben.Möglicherweise kann das FK-Problem, das Sie gefragt haben, herausgearbeitet werden ...
Wenn diese Tabellen dieselbe Struktur haben, benötigen Sie lediglich eine
ProductType
Spalte in einerOrderProduct
Tabelle. DannPayment
einfach mit einem FK darauf verlinkenWenn die Tabelle unterschiedliche Strukturen hat, gehe ich davon aus, dass sie einige gemeinsame Attribute haben. Sie können also eine gemeinsame
OrderProduct
Tabelle und dann eine bestimmtePayment
untergeordnete Tabelle pro Produkttyp haben (siehe unten). Auch hier müssen Sie nur mit einer FK auf die gemeinsame Tabelle verweisenDies ist das "Superkey / Subtyp-Muster"
(OrderID, ProductType)
OrderProduct
OrderProductA
OrderProductB
quelle
NULL
bei diesem Ansatz keine FK-Spalten haben .Vermeiden Sie nullfähige "Fremdschlüssel". Sie haben mehrere Nachteile.
Die Einschränkung für eine referenzierende Zeile wird nicht immer erzwungen, wenn der Fremdschlüssel eine Null enthält. Dieses Standardverhalten ist jedoch zwischen verschiedenen DBMS nicht konsistent. Einige DBMS unterstützen Konfigurationsoptionen zum Ändern des Verhaltens nullfähiger Fremdschlüssel, andere nicht. SQL-Entwickler und -Nutzer sind sich daher möglicherweise nicht sicher, was eine nullbare Fremdschlüsseleinschränkung aus Sicht der Datenintegrität tatsächlich bedeutet. Das Portieren der Datenbank zwischen DBMS-Produkten oder sogar zwischen verschiedenen Servern, die dasselbe Produkt verwenden, kann zu inkonsistenten Ergebnissen führen.
Datenbank-Design-Tools, Integrationstools und andere Software unterstützen sie nicht immer richtig und die Ergebnisse, die sie produzieren, können falsch sein.
Fremdschlüssel werden häufig in Verknüpfungen und anderen Abfragelogiken verwendet, was die Probleme für Benutzer verschärft, die glauben, dass die Einschränkung wirksam ist, wenn sie nicht vorhanden ist oder die von Ihrem bestimmten DBMS angewendete Logik nicht kennt.
Einige Funktionen zur Abfrageoptimierung, die das Umschreiben von Abfragen und andere Optimierungen ermöglichen, sind möglicherweise nicht verfügbar, wenn ein Fremdschlüssel auf Null gesetzt werden kann.
In logischen Begriffen macht eine nullbare "Fremdschlüssel" -Beschränkung nicht viel logischen Sinn. Gemäß dem SQL-Standard darf eine solche Einschränkung nicht verletzt werden, auch wenn die Tabelle, auf die verwiesen wird, leer ist. Dies widerspricht einer der häufigsten angeblichen Rechtfertigungen für die Verwendung einer Null - dass es sich um den "unbekannten" Fall handelt. Wenn es keine gültigen Werte für X gibt, kann jedes "unbekannte" X mit Sicherheit kein gültiger Wert sein - und SQL wird dies dennoch zulassen.
Nullable Fremdschlüssel sind völlig unnötig. Sie können den Fremdschlüssel immer entweder in eine neue Tabelle zerlegen oder ein Supertyp / Subtyp-Muster verwenden, sodass keine Nullen erforderlich sind. Aus Gründen der Einfachheit und Genauigkeit ist es daher besser, Nullen wegzulassen, als sie einzugeben.
quelle
Ich habe noch nie gehört, dass die Verwendung nullwertfähiger FK-Spalten als schlechte Praxis angesehen wird. Sie passen ideal zu einer Spalte, die auf eine andere Tabelle verweist, jedoch möglicherweise nicht ausgefüllt ist (dh es handelt sich um optionale Daten).
(Warum denkst du, wäre es ein Problem?)
quelle