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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top