it-swarm.com.de

Guid vs INT - Was ist besser als Primärschlüssel?

Ich habe über Gründe gelesen, Guid und int zu verwenden oder nicht.

int ist kleiner, schneller, leicht zu merken, behält eine chronologische Reihenfolge bei. Und was Guid betrifft, so ist der einzige Vorteil, den ich gefunden habe, dass es einzigartig ist. In welchem ​​Fall wäre ein Guid besser als und int und warum?

Nach allem, was ich gesehen habe, weist int keine Mängel auf, außer durch die Anzahlbegrenzung, die in vielen Fällen irrelevant ist.

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. (Gibt es ein Beispiel für eine echte Anwendung, die Guid für etwas verwendet?)

(Guid = UniqueIdentifier) ​​Typ auf SQL Server

107
BrunoLM

Dies wurde in Stack Overflow hier und hier abgefragt.

Jeffs Beitrag erklärt viel über die Vor- und Nachteile der Verwendung von GUID.

GUID-Profis

  • Einzigartig in jeder Tabelle, jeder Datenbank und jedem Server
  • Ermöglicht das einfache Zusammenführen von Datensätzen aus verschiedenen Datenbanken
  • Ermöglicht die einfache Verteilung von Datenbanken auf mehrere Server
  • Sie können überall IDs generieren, anstatt einen Roundtrip zur Datenbank durchführen zu müssen
  • Die meisten Replikationsszenarien erfordern ohnehin GUID Spalten

GUID Cons

  • Es ist satte viermal größer als der herkömmliche 4-Byte-Indexwert. Dies kann schwerwiegende Auswirkungen auf die Leistung und den Speicher haben, wenn Sie nicht vorsichtig sind
  • Umständlich zu debuggen (where userid='{BAE7DF4-DDF-3RG-5TY3E3RF456AS10}')
  • Die generierten GUIDs sollten teilweise sequentiell sein, um die beste Leistung zu erzielen (z. B. newsequentialid() unter SQL Server 2005+) und die Verwendung von Clustered-Indizes zu ermöglichen

Wenn Sie sich hinsichtlich der Leistung sicher sind und nicht vorhaben, Datensätze zu replizieren oder zusammenzuführen, verwenden Sie int und legen Sie das automatische Inkrement fest ( Identitäts-Seed in SQL Server).

94
CoderHawk

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 Durchforsten Sie ihr Netzwerk und führen Sie bestimmte Klassen der automatischen Erkennung durch, speichern Sie die gefundenen Datensätze, und dann werden alle Kundendatensätze wieder in eine zentrale Datenbank integriert. 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.

19
TML

Ich habe einen hybriden Ansatz mit Erfolg verwendet. Tabellen enthalten BEIDE eine automatisch inkrementierte Primärschlüssel-Ganzzahl-Spalte id UND eine guid-Spalte. Das guid kann nach Bedarf verwendet werden, um die Zeile global eindeutig zu identifizieren, und id kann zum Abfragen, Sortieren und zur menschlichen Identifizierung der Zeile verwendet werden.

18
rmirabelle

In einigen bewährten Methoden wird immer noch erwähnt, dass Sie einen Datentyp verwenden sollten, der mit dem geringstmöglichen Arbeitsspeicher den gesamten Wertesatz berücksichtigt, den Sie verwenden werden. Wenn Sie zum Beispiel damit die Anzahl der Arbeitgeber in einem kleinen Unternehmen speichern und es unwahrscheinlich ist, dass Sie 100 erreichen, würde niemand vorschlagen, einen Bigint-Wert zu verwenden, während int (sogar Smallint) dies tun würde.

Der Nachteil dabei ist natürlich: "Sag Nein zur Skalierbarkeit!"


Ich weiß auch, dass dies nicht vollständig 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, wenn dies sinnvoll ist. Wenn Sie beispielsweise Treiberinformationen speichern, müssen Sie keine neue automatisch generierte Spalte für "ID" erstellen. Verwenden Sie einfach die Lizenznummer.

Ich weiß, das klingt wirklich offensichtlich, aber ich sehe, dass das ziemlich oft vergessen wird.

Zum Kontext: Dieser Teil der Antwort wurde anhand eines datentheoretischen Ansatzes behandelt, bei dem Ihre PK die eindeutige Datenkennung für einen Datensatz sein soll. Meistens erstellen wir diese, wenn sie bereits existieren, daher die vorherige Antwort.

Es ist jedoch sehr selten, dass Sie diese Datenpunkte genau kontrollieren können. Daher müssen Sie möglicherweise Korrekturen oder Anpassungen vornehmen. Sie können das nicht mit Primärschlüsseln tun (gut, Sie können, aber es kann ein Schmerz sein).

Danke @VahiD für die Klarstellungen.

1
Alpha

Durch die Verwendung von IDs für die automatische Inkrementierung können Informationen über Ihre Geschäftsaktivität verloren gehen. Wenn Sie einen Shop betreiben und order_id Um einen Kauf öffentlich zu identifizieren, kann jeder Ihre monatliche Umsatzzahl durch einfache Arithmetik ermitteln.

1
golopot

@ rmirrabelle Antwort oben - https://dba.stackexchange.com/a/96990/118371 ist was ich tue. Für größere Projekte gibt es jedoch ein ultimatives Design.

Verwenden Sie: eine Schlüsselzuordnungstabelle

TableA

- ID int (PK)
- Data varchar(100)

TableAMap

- ID int (PK)
- UniversalID GUID (Indexed - nonclustered)

Wie andere in diesem Thread erläutert haben, werden GUIDs für die Datenbankreplikation/-import/-ausdruck selten benötigt. Anstatt also die GUID in der Haupttabelle zu haben, wo zusätzliche 8 Bytes pro Zeile benötigt werden und wo ein GUID Index ist) Standardmäßig) auf demselben Volume gespeichert, wird eine separate Tabelle (auch als Normalisierung bezeichnet) zur Rettung bereitgestellt.

Mit einer separaten Tabelle können Ihre Datenbankadministratoren diese auf einer anderen langsameren Festplatte speichern. Wenn die GUID NUR für bestimmte Stapeljobs benötigt wird, können Sie den Index GUID) kurz vor der Verwendung erstellen und anschließend löschen.

0
Todd

Eine andere Sache, wie GUIDs generiert werden. mrdenny hat richtig darauf hingewiesen, dass selbst wenn newsequentialid () verwendet wird, beim Neustart der Instanzen neue Werte mit den "Löchern" beginnen, die bei der vorherigen Verarbeitung zurückgelassen wurden. Eine andere Sache, die "sequentielle" GUIDs beeinflusst, ist die Netzwerkkarte. Wenn ich mich richtig erinnere, wird die UID von NIC als Teil des Algorithmus GUID) verwendet. Wenn a NIC ist) ersetzt, gibt es keine Garantie dafür, dass die UID ein höherer Wert ist, 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!

0
bobo8734