2010-05-05 7 views
9

Ich versuche, kleine Web-System (URL-Verknüpfung) mit Nonsql Cassandra DB zu bauen, das Problem, das ich staple ist ID-Auto-Generierung.ID Autoinkrement/Sequenz Emulation mit CassandraDB/MongoDB etc

Hat jemand bereits mit diesem Problem gestapelt?

Danke.

P.S. UUID funktioniert nicht für mich, ich muss ALLE Zahlen von 0 bis Long.MAX_VALUE (java) verwenden. also ich brauche etwas, das genau funktioniert wie SQL-Sequenz

AKTUALISIERT:

Der Grund, warum ich nicht in Ordnung mit GUID-IDs ist innerhalb des Bereichs meiner Anwendung.

Meine App hat URL-Shortcutting-Teil, und ich muss URL so kurz wie möglich machen. Also folge ich dem nächsten Ansatz: Ich nehme Zahlen beginnend mit 0 und konvertiere die Base64-Zeichenkette. Im Ergebnis habe ich eine URL wie mysite.com/QA (wo QA Base 64 String ist).

Dies war sehr einfach mit SQL-DB zu implementieren, ich nahm nur automatisch inkrementierte ID, konvertieren Sie es in URL und war 100-Prozent sicher, dass URL eindeutig ist.

+0

Bitte erläutern Sie genauer, warum UUIDs nicht verwendet werden können und warum Sie nicht-SQL-Datenbanken verwenden müssen. Vielleicht können wir Ihr Problem auf andere Weise lösen. – Espo

Antwort

3

Autoincrement IDs von Natur aus nicht gut skalieren, da sie eine einzige Quelle benötigen, um die Zahlen zu erzeugen. Aus diesem Grund verwenden shardfähige/replizierbare Datenbanken wie MongoDB längere, GUID-ähnliche Bezeichner für Objekte. Warum brauchst du LANG Werte so schlecht?

Sie könnten es mit atomaren Inkrementen tun, den alten Wert beibehalten, aber ich bin mir nicht sicher. Dies wäre auf einzelne Server-Setups beschränkt.

+0

Danke für das gute Verständnis meiner Problemquelle. Bitte überprüfen Sie die aktualisierte Frage Beschreibung, danke – abovesun

+0

Müssen sie konsekutiv sein? Was ist mit "Wählen Sie eine Zufallszahl in 1..MAX (LONG) und einfügen". Stellen Sie sicher, dass das Feld einen eindeutigen Index hat. Wenn die Einfügung fehlschlägt, versuchen Sie es erneut mit einem anderen Zufallswert. Dies ist atomar und sicher. Und ziemlich effizient, solange Ihre DB-Größe nicht in der Nähe von 2^31 :) – wump

+0

Ja, wahrscheinlich ist dieser Ansatz nicht so schlecht für mich, sagte wahr, ich bin mir nicht sicher, dass Cassandra Analog von SQL einzigartige Einschränkung hat, zumindest ich habe nicht gefunden, wie man es nachahmt. Aber ich habe mich noch nicht angestrengt :) – abovesun

-1

Ich bin nicht sicher, ob ich dir folge. Welche Sprache verwendest du? Sprechen wir über Uuid?

Das folgende ist, wie Sie UUIDs in einigen Sprachen zu generieren:

java.util.UUID.randomUUID(); // (Java) variant 2, version 4 

import uuid // (Python) 
uuid.uuid1() // version 1 
+0

UUID funktioniert nicht für mich, ich muss ALLE Zahlen von 0 bis Long.MAX_VALUE (Java) verwenden. also brauche ich etwas, das genau funktioniert wie SQL-Sequenz – abovesun

4

Ich weiß nichts über Cassandra, aber mit Mongo können Sie eine atomare Sequenz haben (sie skaliert nicht, aber sie funktioniert so, wie sie sollte, sogar in einer Umgebung, in der die Abfrage das Feld hat).

Dies kann mit dem Befehl findandmodify erfolgen.

Wir betrachten wir haben eine spezielle Kollektion namens sequences und wir wollen eine Sequenz für die Post-Nummern haben (mit dem Namen postid), können Sie Code ähnlich wie diese verwenden:

 
> db.runCommand({ "findandmodify" : "sequences", 
        "query" : { "name" : "postid"}, 
        "update" : { $inc : { "id" : 1 }}, 
        "new" : true }); 

Dieser Befehl wird wieder atomar die aktualisierte (new) Dokument zusammen mit Status. Das Feld value enthält das zurückgegebene Dokument, wenn der Befehl erfolgreich ausgeführt wurde.