Was Daten-Typ empfohlen für den ID-Spalten?
Erkenne ich diese Frage sehr wahrscheinlich schon vorher gefragt, aber ich habe gesucht, um ein wenig bei Fragen auf StackOverflow, und ich habe nicht wirklich eine Antwort finden zu mir, so hier geht. Wenn Sie einen doppelten, bitte link, um es.
Aus irgendeinem Grund bevorzuge ich Guid
s (uniqueidentifier
MsSql) für meinen primären Schlüssel Felder, aber ich weiß wirklich nicht, warum das besser wäre. In vielen tutorials, die ich habe, ging mir in letzter Zeit durch eine automatisch inkrementiert int
verwendet wurde. Ich sehe vor-und Nachteile mit beiden:
- Eine
Guid
ist immer die gleiche Größe und Länge, und es gibt keinen Grund sich sorgen zu machen über die Ausführung von Ihnen, in der Erwägung, dass gibt es ein limit, wie viele Datensätze, die Sie haben könnten, bevor Sie Sie ausführen würden, aus zahlen, die passen in eineint
. int
ist (zumindest in C#) eine nullable-Typ, die öffnet für ein paar Verknüpfungen, wenn-Abfragen für die Daten.- Und
int
ist einfacher zu Lesen. - Ich Wette, Sie konnte zumindest ein paar mehr Dinge hier.
So, so einfach wie der Titel sagt es: Was ist der empfohlene Datentyp für die ID (primary key) - Spalten in einer Datenbank?
EDIT: Nach Erhalt ein paar kurze Antwort, ich muss auch hinzufügen das follow-up-Frage. Ohne Sie, Ihre Antwort ist weder überzeugend, noch die Aufklärung... 😉 Warum denken Sie so, und was sind die Nachteile der anderen option, die machen Sie nicht wählen Sie diese statt?
- es sollte darauf hingewiesen werden, dass eine GUID und ein integer-sind nur verschiedene Arten der Anzeige und das erzeugen einer Sequenz von bytes. Wo die int-Werte werden sequenziell generiert, die GUIDs generiert werden, sind "zufällig" und es sind mehr bytes in Ihnen. das bedeutet, dass Sie nicht brauchen, um zu sehen, den bestehenden Zustand der Datenbank zu generieren. alles kann null sein in C# mit ? auf es.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Jeder integer-Typ, die groß genug zum speichern von erwarteten Daten-Bereiche. In der Regel 32-bit-Ganzzahlen angesehen werden, als zu klein (zu Recht oder zu Unrecht) für Tabellen mit einer Menge von Zeilen oder änderungen. Ein 64 bit int ist viel. Viele Datenbanken nicht haben oder nicht nutzen, dass integer-Typ, aber ein Typ ZAHL mit dem angegebenen Maßstab und Genauigkeit. 10-15 Ziffern ist eine ziemlich häufige Größe.
Der Grund für die Wahl integer-Typen ist eine doppelte:
Die Größe eines integer ist:
Vergleichen, dass ein GUID, die 128-bit-oder eine normale Zeichenfolge, die mindestens ein byte pro Zeichen (mehr in bestimmte Zeichensätze) sowie ein overhead, der sein könnte, so wenig als ein byte (terminierenden) oder könnte viel mehr in einigen Fällen.
Sortieren von ganzen zahlen ist trivial und, vorausgesetzt, Sie sind einzigartig und die Auswahl ist ausreichend klein ist, kann tatsächlich durchgeführt werden in O(n) Zeit, im Vergleich zu bestenfalls O(n log n).
auch-genauso wichtig-die meisten Datenbanken können generieren eindeutiger IDs die per auto-increment Spalten-und/oder Sequenzen. Gewährleistung der Eindeutigkeit in eine Anwendung ist sonst eigentlich ziemlich hart und neigt in der Folge der aufgeblähten Tasten.
Plus auto-generierten integer-Schlüssel sind in der Regel entweder lose oder absolut bestellt (abhängig von der Datenbank und Konfiguration), das ist ein brauchbarer Qualität. Zufällig generierten GUIDs sind prinzipiell ungeordnet, die weit weniger nützlich.
Gängigen Datenbanken lassen sich größere autoincrement-Felder für Jahre jetzt, so ist es viel weniger ein Problem.
Als für was zu verwenden, es ist immer eine Wahl. Man ist nicht eindeutig besser als die anderen, Sie haben unterschiedliche Eigenschaften und jeder ist gut in verschiedenen Szenarien. Ich habe beide im Laufe der Zeit, und Sie das nächste schema-ich arbeite, werde ich berücksichtigen.
Profis für GUID:
Profis für autoincrement:
Einen großen Nachteil der Verwendung von GUID-Schlüssel ist, dass es schwierig ist zu führen "ad-hoc" - Abfragen per hand. Manchmal ist es sehr nützlich, dass Sie dies tun können:
SELECT * FROM Benutzer where UserID=452245
Mit GUID-Schlüssel dieses kann sehr ärgerlich.
Ich würde empfehlen, die 64-bit-Ganzzahlen
Mir sagen, welche Kriterien Sie als wichtig erachten.
Was erforderlich ist innerhalb der Tabelle eindeutig sein.
Eine GUID ist eine global probabilistisch eindeutige Kennung. Es ist auch groß. Falls Sie in Ihren Indizes eindeutig sein, um innerhalb von epsilon gegenüber jeder anderen Datenbank-installation im Universum, es ist eine gute Wahl. Ansonsten, es ist mit viel Platz unnötig.
Einen autoincrement-Anzahl ist gut, es ist klein, und sicher innerhalb der Tabelle eindeutig sein. Auf der anderen Seite, es gibt Ihnen keinen Schutz gegen die Vervielfältigung, zwei Beiträge, identisch, außer für die Magische Zahl, sind einfach zu erstellen.
Verwendung einigen Wert, ist gebunden an die Person wird beschrieben, verhindert, dass, aber Sie haben das problem des Umgangs mit der Einzigartigkeit.
Wenn Sie verwenden eine lange, man konnte über 1000 eine zweite und nicht der Primärschlüssel für 29 Millionen Jahren.
Andere haben bereits erwähnt, dass einige der Vorteile der Verwendung eines integer-Typs anstelle einer UUID/GUID. Einer der großen Vorteile ist die Geschwindigkeit und Kompaktheit der Indizes.
Einer Anwendung, die ich kürzlich verwickelt war, wo habe ich das Datenbank-design, die ich brauchte, UUIDs, aber er wollte nicht aufgeben, die Vorteile der Verwendung von longs für primäre Schlüssel, also musste ich ein "allIds" - Tabelle abgebildet, dass jeder Primärschlüssel in das system, um eine UUID. Alle meine Primärschlüssel generiert wurden, aus einer einzigen Sequenz, so waren Sie alle eindeutig über alle Tabellen.
Wenn die Datenbank verteilt ist, wo können Sie Datensätze aus anderen Datenbanken die Primärschlüssel muss eindeutig sein innerhalb einer Tabelle über alle Datenbanken. GUID löst dieses Problem, allerdings auf Kosten von Speicherplatz. Eine Kombination von Autoinkrement-und namespace-wäre ein guter Kompromiss.
Wäre es schön, wenn die Datenbanken bieten könnte, bereits eingebaut-Unterstützung für autoincrements mit "Präfixen". Also in einer Datenbank, bekomme ich die IDs wie X1,X2,X3, ... und so weiter, während in der anderen Datenbank, könnte es sein, Y1,Y2,Y3, ... und so weiter.
Fragte ich eine ähnliche Frage, die hat ein paar Antworten, die helfen könnten. Replikation zu sein scheint, der größte Vorteil bei der Verwendung von GUIDs.
Gründe, nicht zu verwenden ein auto-increment Nummer für eine primary key
Folgen Cletus Beratung,
mit dem zusätzlichen Nachteil, es hängt weitgehend davon ab, was Ihr storting. Nie, nie, verwenden Sie eine GUID. GUID ' s haben ein ganzes Bündel von Nachteilen, und nur ein oder zwei Oberseiten.
Mochte ich nie Ganzzahlen und erhöht Bezeichner. Macht es ein problem, wenn Sie möchten: kopieren von Daten in verschiedenen Tabellen (zwei Tabellen gleiche ID) oder in unterschiedlichen Datenbanken. Guid ist groß wie ein string-Vertreter und kommt es auch zu problem beim einbinden von ids in Ihrem web-Anwendungs-urls. So entschied ich mich für einen kurzen string-version, Guid, die in der db ist wie varchar(16). Siehe code-FALTENBALG (Methode WebHash()):
Der einzige Nachteil ist, wenn Sie neue Zeilen in SQL. So haben Sie, um Kiste ein ähnliches sql-Funktion.
Nehmen gerne jede Kritik in meinem Adressbuch.