2010-05-05 10 views
9

Sto provando a costruire un piccolo web-system (shortcut dell'URL) usando il DB Cassandra nonsl, il problema che ho accumulato è la generazione automatica dell'ID.id autoincremento/emulazione sequenza con CassandraDB/MongoDB ecc.

Qualcuno ha già stack con questo problema?

Grazie.

P.S. UUID non funziona per me, ho bisogno di usare TUTTI i numeri da 0 a Long.MAX_VALUE (java). quindi ho bisogno di qualcosa che funziona esattamente come sequenza di sql

AGGIORNAMENTO:

Il motivo per cui io non sto bene con gli ID GUID è all'interno del campo di applicazione della mia candidatura.

La mia app ha una scorciatoia di parte, e ho bisogno di rendere l'URL il più breve possibile. Quindi seguo il prossimo approccio: sto prendendo i numeri a partire da 0 e lo converto in stringa base64. Quindi nel risultato ho url come mysite.com/QA (dove QA è una stringa 64 di base).

Questo è stato molto facile da implementare utilizzando SQL DB, ho appena preso l'ID auto incrementato, lo converto in URL ed ero sicuro di 100 percento, quell'URL è unico.

+0

Spiegare in maggior dettaglio perché gli UUID non possono essere utilizzati e perché è necessario utilizzare database non sql. Forse possiamo risolvere il tuo problema in un altro modo. – Espo

risposta

3

autoincremento ID intrinsecamente non scala bene come hanno bisogno di una singola fonte per generare i numeri. Questo è il motivo per cui i database condivisibili/replicabili come MongoDB usano identificatori più lunghi e GUID per gli oggetti. Perché hai bisogno di valori LONG così male?

Potrebbe essere possibile farlo utilizzando incrementi atomici, mantenendo il vecchio valore, ma non sono sicuro. Questo sarebbe limitato alle sole configurazioni del singolo server.

+0

Grazie per la buona comprensione della mia fonte di problemi. Si prega di controllare descrizione della domanda aggiornata, grazie – abovesun

+0

Devono essere consecutivi? Che dire "scegli un numero casuale in 1..MAX (LUNGO) e inserisci". Assicurati che il campo abbia un indice univoco. Se l'inserimento fallisce, riprova con un diverso valore casuale. Questo è atomico e sicuro. E abbastanza efficiente finché la dimensione del DB non si avvicina a 2^31 :) – wump

+0

Sì, probabilmente questo approccio non è poi così male per me, dicendo vero non sono sicuro che Cassandra abbia analogia del vincolo univoco di SQL, almeno io non ha trovato come emularlo. Ma non ci ho provato ancora :) – abovesun

-1

Non sono sicuro di seguirti. Che lingua stai usando? Stiamo parlando di uuid?

Quello che segue è come generare UUID in alcune lingue:

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

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

UUID non funziona per me, ho bisogno di utilizzare TUTTI i numeri da 0 a Long.MAX_VALUE (java). quindi ho bisogno di qualcosa che funzioni esattamente come sequenza sql – abovesun

4

Non so nulla di Cassandra, ma con mongo è possibile avere una sequenza atomica (non verrà ridimensionata, ma funzionerà come dovrebbe, anche in ambienti pieni se la query ha il campo più chiaro).

È possibile utilizzare il comando findandmodify.

Consideriamo abbiamo una collezione speciale di nome sequences e vogliamo avere una sequenza di numeri postali (denominate postid), è possibile utilizzare codice simile a questo:

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

Questo comando restituirà atomicamente l'aggiornamento (new) insieme allo stato. Il campo value contiene il documento restituito se il comando è stato completato correttamente.