Heim  >  Artikel  >  Datenbank  >  Strategie zur Generierung der Primärschlüssel-ID der Datenbank

Strategie zur Generierung der Primärschlüssel-ID der Datenbank

藏色散人
藏色散人nach vorne
2019-08-15 14:21:303521Durchsuche

Vorwort:  

Eindeutige System-ID ist ein Problem, auf das wir beim Entwerfen eines Systems häufig stoßen. Hier sind einige gängige Strategien zur ID-Generierung.

● Sequenz-ID

● UUID

● GUID

● COMB

● Schneeflocke

Erste Auto- Inkrement-ID Um den Anforderungen separater Datenbanken gerecht zu werden, werden unter der Voraussetzung der automatischen Inkrementierung unterschiedliche Startpunkte verwendet. Dies ist jedoch äußerst problematisch, wenn eine Datenbankerweiterung erforderlich ist. Wenn wir beispielsweise zum ersten Mal die Datenbank eines bestimmten Systems entwerfen, enthält die Datenbank 10 Tabellen. Dann benötigen wir unterschiedliche IDs für den Inhalt jeder Tabelle. Wir können beispielsweise unterschiedliche nicht zunehmende Formen verwenden ist 1, 11, 21, 31. . . Die zweite Tabelle ist 2, 12, 22, 32. . . Die dritte Tabelle ist 3, 13, 23, 33. . . Die zehnte Tabelle ist 10, 20, 30. . . Das Problem ist jedoch: Wenn ich eines Tages feststelle, dass die 10 Tabellen in diesem System nicht mehr ausreichen und ich eine weitere Tabelle hinzufügen möchte, wie sollen dann die Primärschlüssel zu diesem Zeitpunkt zugewiesen werden? Wenn Sie außerdem Daten aus mehreren Datenbanken zusammenführen möchten, aber diese einfache Methode zum Generieren von IDs verwendet wird, ist die Wahrscheinlichkeit einer Duplizierung sehr hoch, sodass es mit ziemlicher Sicherheit zu Duplikaten kommt. Offensichtlich wird die Skalierbarkeit der vorherigen Methode schlecht sein.

Im Vergleich zur automatischen Inkrementierung von IDs ist die UUID bequemer zum Generieren eines eindeutigen Primärschlüssels (wenn die Datenmenge sehr groß ist, besteht die Möglichkeit einer Duplizierung), aber aufgrund der Störung der UUID ist die Leistung beeinträchtigt ist nicht so gut wie die automatische Inkrementierung von IDs und Zeichenfolgenspeicherung, großer Speicherplatz und geringe Abfrageeffizienz. Schlüssel: Der Nachteil der Verwendung von UUID ist die geringe Abfrageeffizienz!

COMB erhöht die Ordnung generierter IDs im Vergleich zu UUID und die Effizienz beim Einfügen und Abfragen wird verbessert. Dieser Artikel enthält eine einfache Analyse.

Sonwflake ist Twitters Primärschlüsselgenerierungsstrategie, die als Verbesserung von COMB angesehen werden kann und eine 64-Bit lange Ganzzahl anstelle einer 128-Bit-Zeichenfolge verwendet. Die Zusammensetzung der ID ist: das erste 0 + 41-Bit-Zeitpräfix + 10-Bit-Knotenidentifikation + 12-Bit-Sequenznummer, um Parallelität zu vermeiden.

Teil 1: Sequenz-ID


Sequenz oder Feld automatisch inkrementieren, die gebräuchlichste Methode. Es wird von der Datenbank verwaltet und ist für die Datenbank eindeutig.

Vorteile:

Einfacher, praktischer Code, akzeptable Leistung.

Nummern-IDs werden auf natürliche Weise sortiert, was beim Paging oder bei Ergebnissen, die sortiert werden müssen, hilfreich ist.

Nachteile:

Unterschiedliche Datenbanken haben unterschiedliche Syntax und Implementierung, die bei der Datenbankmigration oder bei der Unterstützung mehrerer Datenbankversionen verarbeitet werden müssen.

Bei einer einzelnen Datenbank oder einer Lese-Schreib-Trennung oder einem Master und mehreren Slaves kann nur eine Master-Datenbank generiert werden. Es besteht die Gefahr eines Single Point of Failure.

Eine Erweiterung ist schwierig, wenn die Leistung den Anforderungen nicht gerecht wird.

Es wird ziemlich schmerzhaft, wenn mehrere Systeme zusammengeführt werden müssen oder eine Datenmigration beteiligt ist.

Beim Teilen von Tabellen und Datenbanken wird es Probleme geben.

Optimierungsplan:

Wenn für den einzelnen Punkt der Hauptbibliothek mehrere Masterbibliotheken vorhanden sind, ist die für jede Masterbibliothek festgelegte Startnummer und der Schritt unterschiedlich Die Größe ist gleich, was der Anzahl der Master entsprechen kann.

Zum Beispiel: Master1 generiert 1, 4, 7, 10, Master2 generiert 2,5,8,11 und Master3 generiert 3,6,9,12. Dadurch werden effektiv eindeutige IDs im Cluster generiert und die Belastung der Datenbankoperationen zur ID-Generierung erheblich reduziert.

Teil 2: UUID


npm-Management https://www.npmjs.com/package/uuid

Gemeinsame Methoden, 128 Bits. Es kann mithilfe einer Datenbank oder eines Programms generiert werden und ist in der Regel weltweit einzigartig.

Eine UUID ist eine global eindeutige 128-Bit-Kennung, die normalerweise durch eine 32-Byte-Zeichenfolge dargestellt wird. Es kann die Einzigartigkeit von Zeit und Raum sicherstellen, auch GUID genannt. Der vollständige Name lautet: UUID - Universally Unique IDentifier, in Python UUID genannt.

Es gewährleistet die Einzigartigkeit der generierten ID durch MAC-Adresse, Zeitstempel, Namespace, Zufallszahl und Pseudozufallszahl.

UUID verfügt hauptsächlich über fünf Algorithmen, dh fünf Methoden zu seiner Implementierung.

(1), uuid1()

– basierend auf Zeitstempel. Wird aus MAC-Adresse, aktuellem Zeitstempel und Zufallszahl generiert. Globale Einzigartigkeit kann gewährleistet werden, die Verwendung von MAC bringt jedoch auch Sicherheitsprobleme mit sich. Im lokalen Netzwerk kann IP anstelle von MAC verwendet werden.

(2), uuid2()

Basierend auf der verteilten Computerumgebung DCE (diese Funktion existiert in Python nicht). Der Algorithmus ist derselbe wie bei uuid1, außer dass die ersten 4 Positionen des Zeitstempels durch die POSIX-UID ersetzt werden. Diese Methode wird in der Praxis selten angewendet.

(3), uuid3()

Namensbasierter MD5-Hashwert. Es wird durch Berechnen des MD5-Hashwerts des Namens und des Namespace erhalten, um die Einzigartigkeit verschiedener Namen im selben Namespace und die Einzigartigkeit verschiedener Namespaces sicherzustellen, aber derselbe Name im selben Namespace generiert dieselbe UUID.

(4), uuid4()

basierend auf Zufallszahlen. Aus Pseudozufallszahlen gewonnen, besteht eine gewisse Wiederholungswahrscheinlichkeit, und diese Wahrscheinlichkeit kann berechnet werden.

(5), uuid5()

Namensbasierter SHA-1-Hashwert. Der Algorithmus ist derselbe wie uuid3, außer dass der Secure Hash Algorithm 1-Algorithmus verwendet wird.

Vorteile:

Einfacher und praktischer Code.

Als Einziges auf der Welt kann es problemlos mit Datenmigrationen, Zusammenführungen von Systemdaten oder Datenbankänderungen umgehen.

Nachteile:

Es gibt keine Sortierung und es kann nicht garantiert werden, dass der Trend zunimmt.

UUID wird häufig mithilfe von Zeichenfolgen gespeichert und die Abfrageeffizienz ist relativ gering.

Der Speicherplatz ist relativ groß. Wenn es sich um eine riesige Datenbank handelt, müssen Sie die Speichermenge berücksichtigen.

Die Menge der übertragenen Daten ist groß

Nicht lesbar.

Optimierungslösung:

Um das Problem der unlesbaren UUID zu lösen, können Sie die UUID-zu-Int64-Methode verwenden.

Teil 3: GUID


GUID: Es handelt sich um die Implementierung des UUID-Standards durch Microsoft. Es gibt verschiedene andere Implementierungen von UUID, nicht nur von GUID. Die Vor- und Nachteile sind die gleichen wie bei UUID.

Teil 4: COMB


Der Typ COMB (Kombinieren) ist eine für die Datenbank einzigartige Designidee und kann als verbesserte GUID verstanden werden. Dies kombiniert GUID und Systemzeit, um eine bessere Leistung bei der Indizierung und beim Abrufen zu erzielen.

Es gibt keinen COMB-Typ in der Datenbank, er wurde von Jimmy Nilsson in seinem Artikel „The Cost of GUIDs as Primary Keys“ entworfen.

Die grundlegende Entwurfsidee des COMB-Datentyps lautet wie folgt: Da die UniqueIdentifier-Daten aufgrund ihrer Unregelmäßigkeit eine geringe Indizierungseffizienz aufweisen, was sich auf die Leistung des Systems auswirkt, können wir das Präfix des UniqueIdentifier beibehalten durch Kombination? 10 Bytes, und die letzten 6 Bytes werden verwendet, um die Zeit (DateTime) darzustellen, zu der die GUID generiert wurde. Auf diese Weise kombinieren wir die Zeitinformationen mit dem UniqueIdentifier, was die Ordnung erhöht und gleichzeitig die Einzigartigkeit des UniqueIdentifiers beibehält , wodurch die Indexeffizienz verbessert wird.

Vorteile:

Lösen Sie das Problem der UUID-Störung und stellen Sie einen Comb-Algorithmus (kombinierte Guid/Zeitstempel) in seiner Methode zur Primärschlüsselgenerierung bereit. Reservieren Sie 10 Bytes der GUID und verwenden Sie die anderen 6 Bytes, um den Zeitpunkt darzustellen, zu dem die GUID generiert wurde (DateTime).

Leistung ist besser als UUID.

Teil 5: Twitters Snowflake-Algorithmus


Snowflake ist Twitters Open-Source-Algorithmus zur verteilten ID-Generierung, und das Ergebnis ist eine lange ID. Die Kernidee besteht darin, 41 Bit als Anzahl der Millisekunden, 10 Bit als Maschinen-ID (5 Bit sind das Rechenzentrum, 5 Bit die Maschinen-ID) und 12 Bit als Seriennummer innerhalb von Millisekunden zu verwenden (was bedeutet, dass jeder Knoten dies tun kann). generiert 4096 IDs) und am Ende steht ein Vorzeichenbit, das immer 0 ist. Der Schneeflocken-Algorithmus kann entsprechend den Anforderungen Ihres eigenen Projekts geändert werden. Schätzen Sie beispielsweise die Anzahl zukünftiger Rechenzentren, die Anzahl der Maschinen in jedem Rechenzentrum und die Anzahl möglicher Parallelitäten in einer einheitlichen Millisekunde, um die Anzahl der im Algorithmus erforderlichen Bits anzupassen.

Vorteile:

Hängt nicht von der Datenbank ab, ist flexibel und bequem und bietet eine bessere Leistung als die Datenbank.

Die ID erhöht sich mit der Zeit auf einer einzelnen Maschine.

Nachteile:

ist inkrementell auf einer einzelnen Maschine, aber aufgrund der verteilten Umgebung können die Uhren auf jeder Maschine nicht vollständig synchronisiert werden, und das kann manchmal der Fall sein Situationen, in denen kein globales Inkrement erreicht wird.

6. Verwenden Sie

Das ist wirklich bequem zu verwenden:

npm install uuid --save

Dann können Sie es verwenden!

  const uuidv1 = require(‘uuid/v1‘);
  console.log(‘随机uuid字符串‘, uuidv1());

Auf diese Weise können wir die UUID-Zeichenfolge ausdrucken. Es ist jedes Mal anders.

Das obige ist der detaillierte Inhalt vonStrategie zur Generierung der Primärschlüssel-ID der Datenbank. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen