Jedes Beispiel für einen notwendigen Nullable-Fremdschlüssel?
-
06-09-2019 - |
Frage
Customers
customer_id
Orders
order_id
customer_id fk
Wenn ich zwei Tabellen haben und einen Fremdschlüssel auf customer_id in der Orders-Tabelle definieren, indem man es null sein Ich sage, dass ich einen Auftrag haben, die einen Kunden nicht mit ihm verbunden. Als solche scheint die Vorstellung von einem Nullable-Fremdschlüssel im Widerspruch mit dem Ziel, einen Fremdschlüssel, die diese Einschränkung zu erzwingen ist.
Gibt es ein einfaches Beispiel für eine Situation, in der ein Nullable-Fremdschlüssel notwendig wäre? Oder ein Argument für sich zuzulassen?
Lösung
Stellen Sie sich eine Tabelle, die die TODOs eines Teams hält. Wenn ein TODO noch nicht an ein Mitglied des Teams zugeordnet, wird seine user_id
NULL
. Wenn es nicht NULL
es ein Fremdschlüssel für die users
Tabelle ist.
Andere Tipps
Nein, Nullable-Fremdschlüssel nie notwendig .
Sie können jederzeit eine optionale 1-Beziehung normalisieren. Unter Ihrem Beispiel können Sie die folgenden Tabellen haben:
Customers: customer_id, ...
Orders: order_id, ...
OrdersCustomers: order_id, customer_id
UNIQUE(order_id)
Die beiden einzigartigen Einschränkungen dafür sorgen, dass eine um nur einen Kunden gehören kann, und nie an den gleichen Kunden zweimal.
Ob Sie immer eine solche Beziehung normalisieren sollte, ist eine andere Geschichte. In einigen Fällen Denormalisierung zu einfacheren Implementierungen führen kann.
Als solche die Vorstellung von einem nullable Fremdschlüssel scheint im Widerspruch zu dem Zweck eines Fremdschlüssels, der ist erzwingen diese Einschränkung.
Der Zweck eines Fremdschlüssel ist das Make explizit das Konzept der Zufallszahl in der Tabelle Bestellungen bezieht sich eigentlich auf ein Element in der Tabelle Kunden. Eigentlich Durchsetzung, dass als eine Einschränkung nebensächlich ist.
Um einen Fremdschlüssel NULL-Werte zulässt oder null Verwendung unter SQL-Skript gesetzt
ALTER TABLE Return_COMMENTS MODIFY order_ID Number NULL;
da ist, machen einige Baumstruktur, eine Tabelle, die auf sich selbst bezogen. Bedenken Sie:
table_node(node_id, parent_node_id, name)
Für die Wurzel, parent_node_id sollte Null sein, nicht wahr?
Ein gemeinsames Design-Szenario eine Spalte auf null für die Einstellung ist, wenn Sie eine Eins-zu viele Eltern-Kind-Beziehung haben, aber die Kinder müssen nicht anwesend sein.
Wenn ein Elternteil Satz (wie ein Konto) hat Kinder, die (wie Hilfeanfragen) gelöscht werden kann dies eine gute Nutzung.
Sie können eine Spalte für MostRecentRequest haben, die die ID des neuesten Hilfeanforderung umfasst. Wenn die Anforderung aus dem System entfernt wird die MostRecentRequest Spalte gesetzt wird, was bedeutet auf NULL gibt es keine vorhanden.
Ein weiteres Beispiel ist, wenn Sie NULL bedeuten sollen, dass eine Zeile einen Elternteil noch zugewiesen wird nicht. Vielleicht haben Sie Hilfeanfragen, die in und ein NULL auf dem Techniker Feld kommen bedeutet, dass keine tech auf die Anforderung zugeordnet ist. Wenn Sie diesen Techniker löschen Sie alle seine unvollendete Arbeit wollen den Pool gehen zurück, indem Sie den Wert auf NULL zurückgesetzt wird.
Es gibt eine andere Situation, die ich mir vorstellen kann:
Innerhalb einer Tabelle haben Sie ein ID-Feld, das eindeutig, dass Datensatz identifiziert. Am selben Datensatz einen einzelnen Elternteil haben (oder auch nicht) können.
Tabelle mit den folgenden Spalten:
- id als Integer, Autoinkrement, nicht auf NULL festlegbare
- parentid als Integer, nullable.
Mit einem Fremdschlüssel, können Sie sicherstellen, dass, wenn das Feld nicht null ist, dann ist es auf einen gültigen Elternteil bezieht. Außerdem, wenn Sie den übergeordneten Datensatz zu löschen versuchen, ohne die Kinder Fixierung, so kann der Elternteil nicht gelöscht werden.
Wir haben viele dieser Dinge wie unsere Anwendung etwas, das mit einigen grundlegenden Informationen für eine Veranstaltung und im Laufe der Zeit beginnt, ist, wie die Veranstaltung voll ist geplant, weitere Informationen hinzugefügt wird. Aber wenn die Information hinzugefügt wir sicherstellen wollen, dass es die FK-Einschränkung erfüllt. FKs ist für die Datenintegrität, aber alle Daten nicht immer zu der Zeit bekannt, dass die Anfangsdaten eingefügt werden, so NULL-Werte zulässig sind.