2009-04-03 6 views
8

Ich untersuche die Verwendung von GUIDs als Primärschlüssel in Datenbanken. Bis jetzt scheinen die Profis die Nachteile zu überwiegen. Allerdings sehe ich einen Punkt, wo GUIDs möglicherweise nicht das sind, was ich will.Verwendung einer GUID und einer automatisch inkrementierenden Ganzzahl

In meiner Anwendung sollten Benutzer in der Lage sein, Objekte anhand einer benutzerfreundlichen ID zu identifizieren. Wenn sie beispielsweise ein bestimmtes Produkt erhalten möchten, ohne den vollständigen Namen einzugeben, können sie die Produkt-ID verwenden. GUIDs sind für so etwas nicht leicht zu merken.

Die Lösung, an die ich gedacht habe, ist die Verwendung einer GUID und einer automatisch inkrementierenden Ganzzahl. Die GUID wäre der Primärschlüssel der Zeile, während die automatisch inkrementierende Ganzzahl ein Index wäre, der von den Filterfunktionen der Anwendung verwendet wird. Alle SQL-SELECT-, UPDATE-, DELETE-Anweisungen würden jedoch die GUID verwenden.

Der Hauptgrund, warum ich GUIDs verwenden möchte, ist die Vermeidung von Konflikten beim Zusammenführen zweier Datenbanken. Wenn Datenbank # 1 und Datenbank # 2 beide ein Produkt # 2 haben, müsste das Importeurscript die ID und alle darauf bezogenen Fremdschlüssel ändern. Mit GUIDs muss ich nur die benutzerfreundliche ID in der Tabelle selbst ändern, während Fremdschlüssel die GUID für jeden importierten Datensatz verwenden und daher ohne Änderung funktionieren.

Meine Frage ist also: gibt es irgendwelche größeren Probleme (neben der Größe des GUID-Felds und der einfachen Seitenfragmentierung) mit einem automatisch inkrementierenden Integer-Index und einem GUID-Primärschlüssel?

Antwort

13

Ich neige immer dazu, Ersatz-Primärschlüssel in meiner Datenbank zu verwenden. Das heißt: Diese Primärschlüssel haben keine tatsächliche Bedeutung in der Problemdomäne und daher sind diese Primärschlüssel niemals Benutzern zugänglich. (Wenn dieser Surrogat-Primärschlüssel vom Typ GUID oder einer Identität ist, ist es mir egal; das hängt von den Anforderungen ab).

Wenn Sie sagen, dass Benutzer Objekte basierend auf einer benutzerfreundlichen ID identifizieren können, dann denke ich, dass diese benutzerfreundliche ID ein Wert ist, der zu Ihrer "Problemdomäne" gehört. Dies bedeutet, dass diese ID in der Tat ein Attribut in Ihrer Tabelle sein sollte, aber es sollte nicht als Primärschlüssel in Ihrer Tabelle verwendet werden.

Damit können Sie auch einfach den Wert einer solchen benutzerfreundlichen ID ändern (falls dies erforderlich sein sollte), ohne dass Sie sich auch um die Änderung von verwandten Fremdschlüsseln kümmern müssen.

0

In MySQL, müssen Sie Ihre numerische ID als eine PRIMARY KEY setzen, als AUTO_INCREMENT nur die PRIMARY KEY sein kann, was bedeutet, es auch NOT NULL sein sollte.

Sie können immer noch ein UNIQUE INDEX auf GUID Spalt definieren und es überall benutzen, obwohl eine InnoDB Tabelle auf den numerischen id wird geclustert werden, nicht auf den GUID.

+0

Sorry, ich habe vergessen zu erwähnen, dass ich SQL Server 2008 verwende. –

0

Es gibt eine Schule des Gedankens da draußen, die besagt, dass Sie Ihre Surrogat-IDs niemals der Außenwelt aussetzen sollten. Sie würden also sagen, wenn Sie eine Geschäfts-ID möchten, sollten Sie etwas anderes dafür verwenden.

This Wikipedia article zum Beispiel sagt dieses:

Disassociation

Die Werte der erzeugten Ersatzschlüssel - weil sie erzeugt werden und willkürlich - keine Beziehung zu haben die reale Bedeutung der Daten in einer Reihe gehalten. Bei der Überprüfung einer anderen Zeile mit einem Fremdschlüssel Verweis auf ein Ersatzschlüssel ist es nicht möglich, herauszufinden, die Bedeutung von dieser Verweis einfach durch Blick auf die Daten in der Zeile selbst. Eine Schicht ist dieser Umleitung für jede Fremdschlüssel Join hinzugefügt, die navigieren müssen, während Sie versuchen, Sinn eines Datenelements zu machen. Dies kann auch Auditing schwieriger machen, als falsche Daten sind nicht offensichtlich auf Inspektion.

Ersatzschlüssel sind auch nicht natürlich für Daten, die exportiert und freigegeben werden. Eine besondere Schwierigkeit besteht darin, dass zwei Instanzen eines Schemas Datensätze enthalten können, die logisch die gleiche bedeuten (das ist - sie ist gleich in einem Geschäftssinn), die aber ein verschiedenen Schlüssel zur Geschichte aufgrund von wie die Schlüssel zugewiesen wurden. Ein Ansatz, dies zu tun ist, um die Regel annehmen, dass Ersatzschlüssel werden nie exportiert oder importiert werden: sie sind nie außer als transiente Daten außerhalb der Datenbank ausgesetzt (die meisten offensichtlich, bei der Ausführung von Anwendungen , die eine „live haben "Verbindung zur Datenbank".

1

„Warum‚Benutzer sollten Objekte der Lage sein, auf eine benutzerfreundliche ID basiert identifizieren‘?

Meiner Meinung nach, sollten Sie Ihre Benutzer Datensätze itentify Codes.

der Datenbank Lassen Sie sagen, enthält Produkte (wie Sie es in Frage erwähnt). Wäre es nicht besser, wenn sie Codes zur Darstellung von Produkten hätten, die die Benutzer eingeben könnten.

Nehmen wir an, Sie haben Tische und Stühle, als Benutzer würde ich bevorzugen tbl und chr als 1 und 2 verwenden, um zu identifizieren, worüber ich spreche

+0

Nachschlagen Funktionen werden in jedem Modul durchgeführt.Wenn also ein Benutzer versucht, im Modul "Produkte" nach einer ID zu suchen, weiß die Anwendung bereits, dass sie ein Produkt haben möchte. –

0

über Ihre Frage genauer zu sein, ja, es gibt auch andere Probleme mit GUIDs als Primärschlüssel in Datenbanken: nicht so sehr

Das Problem, eine GUID als Primärschlüssel mit der Verwendung seines Verwenden einer nicht sequenziellen GUID als Clustered-Index für eine Tabelle.

Hier können Sie entweder andere Felder als Clustered-Index verwenden oder eine sequenzielle GUID verwenden, um diese Fragmentierung zu vermeiden.