2009-03-07 3 views
1

Wir erstellen eine Anwendung, die auf vielen Servern repliziert werden muss (ich hoffe nicht, aber es gibt keine Möglichkeit zu wissen, ob Clients benötigen eine eigene Client/Server-Kopie, bis wir das Online-Produkt freigegeben haben)."None" oder "Not Used" Fremdschlüssel bei der Verwendung von GUIDs als Primärschlüssel

Da die Anzahl der Server unbekannt ist, habe ich entschieden, GUIDs für alle Transaktions-IDs zu verwenden. Da jeder Client seine eigene Datenbank hat, beabsichtige ich, den NEWSEQUENTIALID() Standard zu verwenden, und die größte Tabelle wird nicht mehr als 1,5 Mio. Zeilen pro Jahr hinzufügen (aber im Durchschnitt 15 K Zeilen), erwarte ich nicht viel von einem Leistungsproblem .

Ich bin mir jedoch nicht sicher, wie mit Fällen umzugehen ist, in denen der Fremdschlüssel "nicht ausgewählt" anzeigen soll. Zum Beispiel hat ein Client einen einzelnen Admin-Benutzer. Dies wird als Fremdschlüssel (login_id) für login.id (eine GUID) eingerichtet. Wenn ein Client jedoch noch keinen Admin-Benutzer hat, wie würden wir dann einfach einen "Keine ausgewählt" -Schlüssel einrichten?

In früheren Anwendungen verwendeten wir IDENTITY-Spalten und fügten in den meisten Tabellen einen Dummy-Eintrag mit der ID 0 ein. Gibt es einen akzeptierten Ansatz zur Bereitstellung ähnlicher Funktionalität mit einer GUID?

Antwort

2

Sie haben 3 Optionen:

1) In Ihrer referenzierten Tabelle, mit einer GUID aller Nullen des Leerwert Zeile hinzufügen, dann Link zu diesem Datensatz

2) speichern Sie einfach eine Null für den Rohling Referenzen

3) Die leeren Datensätze in der Referenztabelle nicht enthalten, sondern eine reine Null-GUID speichern. Dies kann zu Problemen führen, wenn Joins in der Datenbank oder mit Berichten ausgeführt werden. Sie müssen für diesen Spezialfall codieren.

Ich würde sagen, 1 und 2 sind die einzigen guten Möglichkeiten.

+0

Ich stimme nicht mit Option 1, Sonderfall ist ein Sonderfall und Probleme warten auf auftreten. Option 2 ist weit verbreitet und bewährt. –

1

Ich könnte etwas wirklich offensichtlich hier fehlen, aber können Sie nicht einfach auf NULL setzen?

+0

Ich bin froh, dass ich nicht der Einzige bin, der das für trivial hielt. Vielleicht fehlt etwas. –

+0

Für uns war es immer viel einfacher, mit Nullen umzugehen, als mit NULL-Werten umzugehen. –

+0

Was ist falsch mit Null? Ich benutze null FKs und ich hatte keine Probleme – Sruly

1

Machen Sie das Fremdschlüsselfeld in der Kindtabelle NULLable und behalten Sie das Feld NULL, wenn es keinen Admin-Benutzer gibt. Magische Werte wie "0" Identitätsspalten warten auf eine Katastrophe.

+0

Wie? Ist es nicht einfacher, im Code Nullen zu behandeln? Vor Jahren haben wir versucht, eine App zu schreiben, in der ausländische Schlüssel NULL sein könnten, und es war ein Bär.Seitdem haben wir viele Apps geschrieben, die 0 als Fremdschlüsselbeschränkung verwenden und hatten nie ein einziges Problem. –

+0

Gefälschte Zeilen sind VIEL schwieriger zu behandeln als! = NULL. Mit dem Erscheinen von Nullable gibt es kein Problem mehr. –

4

Der einzige sichere Weg, dies zu tun, ist der FK-Wert auf NULL gesetzt. Wenn Sie Daten zwischen mehreren Servern replizieren müssen, stellen Sie sicher, dass jede replizierte Tabelle über GUIDs als Primärschlüssel verfügt. Fremdschlüsselbeziehungen sind auf diese Weise nie ein Problem.

Replikation kann sehr einfach auf diese Weise arbeiten: replizieren Inserts und Updates zuerst in der Reihenfolge von Eltern zu Kind Tabelle, danach replizieren die gelöschten Datensätze von Kind zu Eltern. (umgekehrte Reihenfolge.)

Hoffe, das hilft.