Sonntag, Mai 31, 2020

Bei der Verwendung von UUIDs, sollte ich auch mit AUTO_INCREMENT?

Wir bauen eine neue web-app, die eine offline-iPad – /Android-app-version auf einer Reihe von lokalen Geräten, die Einsätze mit neuen Daten. Als solche benötigen wir die Verwendung von UUIDs zu ermöglichen, für die notwendige zwei-Wege-Synchronisierung mit der master-Datenbank. Für diese werden wir speichern die UUID als BINARY(16) Primärschlüssel.

Das problem, das ich gelernt habe, nach einiger recherche ist, dass der Zeitaufwand für nicht-sequenzielle Primärschlüssel fügt Laufe der Zeit zu erhöhen, und dass diese Einsätze führen zu einer Fragmentierung (als beantwortet hier). Der Vorteil für AUTO_INCREMENT ist, dass die neuen Zeilen werden in der Regel nur Hinzugefügt, um das Ende der Tabelle und so wird es nicht laufen in der Geschwindigkeit Probleme mit UUIDs.

Meine Frage ist, ob oder nicht es ist eine bessere Idee zur Verwendung eines AUTO_INCREMENT – Spalte als Primärschlüssel und dann haben die UUID Spalte als nicht null eindeutiger index? Vermutlich wird dies die Geschwindigkeit Vorteile der sequentiellen inserts unter Beibehaltung der notwendigen UUIDs erforderlich für die Synchronisation von verteilten Datenbanken.

Die einzige Frage, die ich sehen kann ist, dass die UUID muss als Referenz verwendet werden (mit foreign key-Einschränkungen) zu anderen Tabellen (d.h. eine Liste der Probleme, an eine Prüfung, die wiederum an einer Seite, alle, die beteiligt sind in den Beilagen und so alle UUIDs). Semantisch macht es mehr Sinn, für die Primärschlüssel der Referenz, sondern als ein verteiltes system, wir können nicht AUTO_INCREMENTS für diese. Gibt es Nachteile mit einem (nicht-null) unique-index, eher als Primärschlüssel für diese Referenzen (und, natürlich, die JOINs, die kommen mit Ihnen)?

Es ist vielleicht auch erwähnenswert, dass die master – (online) – Datenbank verwendet MySQL (InnoDB) und der dezentralen (offline -) Datenbanken verwenden SQLite.

Edit:

Bedenkt, dass es ist vielleicht besser, die UUID als Primärschlüssel (als das ist semantisch, was es ist), würde ich den Vorteil der sequentiellen inserts, wenn ich die UUID als Primärschlüssel und die AUTO_INCREMENT Spalte als nicht null eindeutiger index? Oder ist es nur der primäre Schlüssel ist von Bedeutung bei der Bestimmung, wo eine neue Zeile eingefügt werden?

2 Kommentare

  1. 13

    Mit autoincrements als primäre plus eine uuid Spalte ist ein gültiges Modell, aber Sie würden immer noch mit einigen Problemen zu kämpfen, die autoincrements bringt, es hängt alles davon ab, wie das mit synchros.

    Sowieso arbeite ich mit der uuid als Primärschlüssel (meine aktuelle Datenbank haben eine halbe million Einträge) und es ist immer noch ziemlich schnell, nur langsam downs ein bisschen auf die Einsätze, aber es sei denn, Sie haben eine sehr hohe Volumen der Einsätze täglich sollte es nicht erschrecken Sie.

    Wenn Sie Sql-Server eine andere Lösung haben, könnten Sie einen Blick auf das Sequenzielle UUIDs, die haben eine etwas größere Kollision Chancen als normalen UUID ‚ s, aber der absolute Kollision Chancen sind immer noch ziemlich niedrig sind, und wie Sie teilweise sequentielle, deckt die Probleme mit der Fragmentierung.

  2. 4

    Sobald Sie haben eine große verteilte data-warehouse, wenn Sie die UUID oder GUID als eindeutige Schlüssel und verwenden Sie es in einem späteren Zeitpunkt beitreten, ist es nicht gut.

    Statt mit UUID oder GUID, bitte erstellen Sie sequenzielle Ersatzschlüssel in der master-Datenbank oder in Ihren Daten-pipeline.

    Teilen Sie unsere Projekt-Erfahrung als Referenz. Wir haben 300 Milliarden Datensätze gespeichert, parallel data warehouse, in unserem system, automatische inkrementelle Schlüssel noch nicht unterstützt. Wir verwenden 8 Byte bigint als primary key (eigentlich eindeutigen Schlüssel in unserem system nicht unterstützt, aber das ist nicht auf logische Eindeutigkeit), wenn wir die processing-Datei und laden Sie die Datei, die wir verwenden 3 bytes zu erzeugen, Datei-ID, die ist 2^24 Dateien haben wir über 2.000 Dateien laden müssen pro Tag also 2^24 kann die Unterstützung über 25 Jahre, wenn es nicht falsch ist.

    Wir nutzen die restlichen 4 bytes als row-id, die 4 Milliarden Zeilen, die wir nicht haben 4 Milliarden Zeilen in jeder Datei. Wir behalten uns vor 1 byte. Während der ETL-Verarbeitung, wir brauchen nur zu verfolgen die Datei-ID in der master-Datenbank, das unterstützen die auto-inkrementelle ID, wenn wir brauchen, um zu generieren, Datensatz-ID bei der Verarbeitung von Datei, kombinieren wir die FileID+reserve 1 byte+4 Byte rowID.

Kostenlose Online-Tests