Ich lese gerade über Gründe, warum ich etwas benutze oder nicht Guid
und int
.
int
ist kleiner, schneller, leicht zu merken, behält eine chronologische Reihenfolge. Und Guid
der einzige Vorteil, den ich gefunden habe, ist, dass es einzigartig ist. In welchem Fall Guid
wäre a besser als und int
und warum?
Von dem, was ich gesehen habe, int
hat es keine Mängel außer durch die Anzahlbegrenzung, die in vielen Fällen irrelevant sind.
Warum genau wurde Guid
erstellt? Ich denke tatsächlich, dass es einen anderen Zweck hat, als als Primärschlüssel einer einfachen Tabelle zu dienen. (Irgendein Beispiel einer echten Anwendung, die Guid
für etwas verwendet wird?)
Typ (Guid = UniqueIdentifier) unter SQL Server
int
hat keine Fehler, außer durch die in vielen Fällen irrelevante Anzahl.": In diesem Kontext von INT vs GUID ist die Obergrenze eines vorzeichenbehafteten 32-BitINT
völlig irrelevant, da die Obergrenze eines vorzeichenbehafteten 64-BitBIGINT
ist weit über alle Verwendungszwecke hinaus (noch mehr, wenn Sie mit der Nummerierung an der unteren Grenze beginnen und dies gilt auch fürINT
) und hat immer noch die halbe Größe einer GUID (8 Bytes statt 16) und ist sequentiell.Antworten:
Dies wurde in Stack Overflow hier und hier gefragt .
In Jeffs Beitrag wird viel über die Vor- und Nachteile der Verwendung von GUID erklärt.
Wenn Sie sich hinsichtlich der Leistung sicher sind und keine Replikation oder Zusammenführung von Datensätzen planen, verwenden Sie
int
und legen Sie das automatische Inkrement fest ( Identitäts-Seed in SQL Server ).quelle
UNIQUEIDENTIFIER
über ,INT
daINT
eine obere Grenze hat , ist eher schlecht Argumentation da grenzenlos zu sein, während wahr genug, nicht um eine praktische Nutzen. Sie können die effektive Kapazität von a leicht verdoppeln,INT
indem Sie es an der unteren Grenze (-2,14 Milliarden) anstelle von 1 starten. Wenn die vollen 4,3 Milliarden nicht ausreichen, beginnen Sie mit aBIGINT
, das sind immer noch nur 8 Bytes im Vergleich zu 16 für die GUID, und es ist sequentiell.Wenn Sie Ihre Daten mit einer externen Quelle synchronisieren, kann eine dauerhafte GUID viel besser sein. Ein kurzes Beispiel für die Verwendung von GUIDs ist ein Tool, das an den Kunden gesendet wird, um sein Netzwerk zu crawlen und bestimmte Klassen der automatischen Erkennung durchzuführen, die gefundenen Datensätze zu speichern und dann alle Kundendatensätze in eine zentrale Datenbank zu integrieren zurück zu unserem Ende. Wenn wir eine Ganzzahl verwenden würden, hätten wir 7.398 "1", und es wäre viel schwieriger zu verfolgen, welche "1" welche war.
quelle
Ich habe einen hybriden Ansatz mit Erfolg verwendet. Tabellen enthalten sowohl eine Auto-Inkrement-Primärschlüssel-Ganzzahl-
id
Spalte als auch eineguid
Spalte. Dasguid
kann nach Bedarf verwendet werden, um die Zeile global eindeutig zu identifizieren, undid
kann für Abfragen, Sortieren und menschliche Identifizierung der Zeile verwendet werden.quelle
id
bereits für Menschen ausreicht, um eine Zeile zu identifizieren?INT
PK verknüpft . Ich finde es seltsam, dass dieser Ansatz nicht viel verbreiteter ist, da er das Beste aus beiden Welten ist. Es scheint, als ob die meisten Leute es vorziehen, Probleme in absolutistischen Begriffen zu lösen, ohne zu wissen, dass die PK keine GUID sein muss, damit die App weiterhin GUIDs für globale Eindeutigkeit und / oder Portabilität verwendet.In einigen Best Practices wird immer noch erwähnt, dass Sie einen Datentyp verwenden sollten, der den gesamten Wertesatz, den Sie verwenden möchten, so wenig Speicher wie möglich belegt. Wenn Sie beispielsweise damit die Anzahl der Arbeitgeber in einem kleinen Unternehmen speichern und es unwahrscheinlich ist, dass Sie eine 100 erreichen, würde niemand vorschlagen, einen Bigint-Wert zu verwenden, während Int (auch Smallint) dies tun würde.
Der Nachteil dabei ist natürlich "Sag nein zur Skalierbarkeit!"
Ich weiß auch, dass dies nicht völlig verwandt ist, aber es gibt noch einen weiteren Faktor. Wenn es nicht übermäßig ist, versuche ich normalerweise, die Verwendung eines nicht automatisch generierten Primärschlüssels zu empfehlen, falls dies sinnvoll ist. Wenn Sie beispielsweise die Fahrerinformationen speichern, müssen Sie keine neue automatisch generierte Spalte für "ID" erstellen. Verwenden Sie einfach die Lizenznummer.Ich weiß, das hört sich sehr offensichtlich an, aber ich sehe, dass es ziemlich oft vergessen wird.Zum Kontext: Dieser Teil der Antwort wurde von einem datentheoretischen Ansatz aus angesprochen, bei dem Ihre PK die eindeutige Datenkennung für einen Datensatz sein soll. In den meisten Fällen erstellen wir diese, wenn sie bereits vorhanden sind, daher die vorherige Antwort.
Es kommt jedoch sehr selten vor, dass Sie die Kontrolle über diese Datenpunkte behalten. Daher müssen Sie möglicherweise Korrekturen oder Anpassungen vornehmen. Sie können das nicht mit Primärschlüsseln machen (nun, Sie können, aber es kann ein Schmerz sein).
Danke @VahiD für die Klarstellungen.
quelle
Durch die Verwendung von Auto-Inkrement-IDs können Informationen zu Ihrer Geschäftsaktivität verloren gehen. Wenn Sie einen Shop betreiben und
order_id
damit einen Einkauf öffentlich identifizieren, kann jeder Ihre monatliche Anzahl von Verkäufen durch einfache Arithmetik herausfinden.quelle
Eine andere Sache, wie GUIDs generiert werden. mrdenny wies richtig darauf hin, dass ein Neustart der Instanzen, selbst wenn newsequentialid () verwendet wird, dazu führt, dass neue Werte mit den "Löchern" beginnen, die bei der vorherigen Verarbeitung zurückgelassen wurden. Eine andere Sache, die "sequentielle" GUIDs betrifft, ist die Netzwerkkarte. Wenn ich mich richtig erinnere, wird die UID der Netzwerkkarte als Teil des GUID-Algorithmus verwendet. Wenn eine Netzwerkkarte ersetzt wird, gibt es keine Garantie dafür, dass die UID einen höheren Wert aufweist, um den sequentiellen Aspekt der Dinge beizubehalten. Ich bin mir auch nicht sicher, wie sich mehrere Netzwerkkarten auf die Zuweisung von Werten mithilfe des Algorithmus auswirken könnten.
Nur ein Gedanke und ich hoffe, ich erinnere mich richtig. Ich wünsche ihnen einen wunderbaren Tag!
quelle
Verwende beide
Verwenden Sie int / Bigint für Primärschlüssel, da es einfach zu pflegen und als Fremdschlüsselbeziehungen zu verwenden ist.
Binden Sie jedoch eine Spalte an die GUID, sodass jede Zeile auch eine eindeutige Spalte hat
quelle
int
und verwenden sollteguid
, wie Sie in Ihrer Antwort vorschlagen. Außerdem ging es mir nicht darum, Ihren Vorschlag nur mir zu erklären. Mein Punkt war, dass Sie Ihre Antwort möglicherweise aktualisieren möchten . Ist Ihnen übrigens bewusst, dass ein anderer Antwortender bereits dasselbe (mehr oder weniger) vorgeschlagen hat wie Sie ?