Ich möchte ein verteiltes System aufbauen. Ich muss Daten in Datenbanken speichern und es wäre hilfreich, eine UUID oder eine GUID als Primärschlüssel für einige Tabellen zu verwenden. Ich nehme an, es ist ein Nachteil bei diesem Design, da die UUID / GUID ziemlich groß ist und sie fast zufällig sind. Die Alternative ist die Verwendung eines automatisch inkrementierten INT oder LONG.
Was sind die Nachteile bei der Verwendung von UUID oder GUID als Primärschlüssel für meine Tabellen?
Ich werde wahrscheinlich Derby / JavaDB (auf den Clients) und PostgreSQL (auf dem Server) als DBMS verwenden.
Antworten:
Dies hängt von Ihrer Generierungsfunktion und der Größe der Final Tables ab
GUIDs sollen global eindeutige Bezeichner sein. Wie in der Dokumentation zu Postgres 8.3 erläutert, gibt es keine allgemein geeigneten Methoden zum Generieren dieser Bezeichner. PostgreSQL wird jedoch mit einigen weiteren nützlichen Kandidaten ausgeliefert.
Aufgrund des Umfangs Ihres Problems und der Notwendigkeit von Offline- Schreibvorgängen haben Sie die Verwendung von etwas anderem als einer GUID ordentlich ausgeschlossen, und daher gibt es keine kompensatorischen Vorteile anderer Schemata.
Unter funktionalen Gesichtspunkten spielt die Schlüssellänge in modernen Systemen in der Regel keine Rolle, abhängig von der Anzahl der Lesevorgänge und der Größe der Tabelle. Als alternative Methode können Offline-Clients neue Datensätze ohne Primärschlüssel stapeln und sie beim erneuten Herstellen der Verbindung einfach einfügen. Da PostgreSQL den Datentyp "Serial" anbietet, müssen Clients die ID nie ermitteln, wenn sie einfach in die Datenbank schreiben können.
quelle
{Node_ID, Item_ID}
denen jeder Knoten ein hatNode_ID
, und einItem_ID
, das pro Knoten automatisch inkrementiert wird.Noch ein Hinweis: Verwenden Sie GUIDs niemals als Teil eines Clustered-Index. GUIDs sind nicht sequenziell. Wenn sie also Teil des Clustered-Index sind, müsste die Datenbank jedes Mal, wenn Sie einen neuen Datensatz einfügen, alle Speicherseiten neu anordnen, um die richtige Stelle für das Einfügen zu finden wäre nur die letzte Seite.
Wenn wir uns nun einige Datenbankrealisierungen ansehen: 1.) MySQL - Primärschlüssel werden geclustert, ohne die Möglichkeit, das Verhalten zu ändern. - Die Empfehlung lautet, hier überhaupt keine GUIDs zu verwenden Primärschlüssel nicht gruppiert, und verwenden Sie ein anderes Feld als gruppierten Index, z. B. autoincrement int.
quelle
database would need to rearrange all its memory pages to find the right place for insertion
=> Ich glaube nicht, dass dies bei Postgres der Fall ist, da das Clustering optional ist und neue Zeilen ungeordnet gespeichert werden.Es hängt davon ab, ob.
Im Ernst, mit allem, was Sie bisher gegeben haben, ist dies ungefähr so weit wie Sie gehen können.
Warum wäre es hilfreich, UUIDs zu verwenden? Warum werden Sie keine INTs verwenden? Warum können Sie später nicht einfach nach UUIDs indizieren? Verstehen Sie, was es bedeutet, eine sortierte Liste mit dem Schlüssel einer UUID zu haben und nach einigen Millionen Zeilen eine zufällige (nicht sequentielle) UUID einzufügen?
Auf welcher Plattform läuft das? Wie viele Festplatten? Wie viele Benutzer? Wie viele Datensätze?
quelle