2012-01-24 8 views
28

È possibile ottenere DynamoDB per generare automaticamente ID univoci quando si aggiungono nuovi articoli in una tabella?UUID per DynamoDB?

Ho notato che l'API Java menziona @DynamoDBAutoGeneratedKey quindi presumo che ci sia un modo per farlo funzionare anche con PHP.

In tal caso, il codice dell'applicazione genera questi ID o è fatto sul lato DynamoDB?

risposta

19

Buona domanda: sebbene concettualmente possibile, questo non sembra attualmente disponibile come funzionalità di livello API DynamoDB, in quanto né CreateTablePutItem si riferiscono a tale funzionalità.

Il @DynamoDBAutoGeneratedKey notazione avete notato è un Java annotation, cioè zucchero sintattico offerto dal Java SDK anzi:

Un'annotazione, nel linguaggio di programmazione Java, è una speciale forma di metadati sintattica che possono essere aggiunto al codice sorgente Java.

Come tale @DynamoDBAutoGeneratedKey è uno dei Amazon DynamoDB NOTE offerti come parte del Object Persistence Modello entro API di alto livello del Java SDK (vedi Using the Object Persistence Model with Amazon DynamoDB):

segna un hash chiave o gamma di proprietà chiave come auto-generate. Il modello di persistenza degli oggetti genera un UUID casuale durante il salvataggio di questi attributi . Solo le proprietà di stringa possono essere contrassegnate come chiavi generate automaticamente .

+1

Grazie Non ho dimestichezza con Java in modo dalla vostra risposta è stato davvero utile. Quindi @DynamoDBAutoGeneratedKey sta semplicemente ottenendo l'API Java per generare un UUID, non la stessa Dynamo, giusto? Sarebbe davvero grandioso se Dynamo avesse un tipo di attributo UUID che genererebbe gli ID dalla loro parte e li restituirà quando aggiungerà nuovi elementi. – Adam

+1

@Adam: Infatti, '@ DynamoDBAutoGeneratedKey' è semplicemente un'annotazione personalizzata fornita dall'SDK Java, che genera il codice generato in fase di compilazione e a sua volta eseguito all'interno dell'applicazione Java per generare l'UUID in fase di runtime - questo non ha nulla a che fare con DynamoDB come tale. E sono d'accordo, un tipo di dati UUID DynamoDB nativo sarebbe abbastanza conveniente - speriamo che il team di AWS possa espandere la funzionalità di DynamoDB nel tempo, sono ben noti per rispondere alla domanda dei clienti e innovare di conseguenza! –

-4

L'approccio che sto prendendo è quello di utilizzare il timestamp corrente per il tasto hash (o il tasto di intervallo, se si utilizza anche un intervallo). Memorizza il timestamp come un numero intero, che rappresenta il numero di millisecondi dall'inizio di "UNIX epoch" (nel fuso orario UTC). Molte librerie di data/ora possono produrre questo numero per te.

Questo ha il vantaggio che se si desidera avere un campo "tempo di creazione" nella tabella, l'UUID memorizza già queste informazioni. Basta chiamare un altro metodo nella libreria data/ora per convertire il timestamp in un formato leggibile.

(Assicurati di gestire l'eccezione che si verificherà se un secondo elemento viene creato nella stessa tabella con lo stesso timestamp in millisecondi, è sufficiente ricorrere e riprovare l'operazione in quel caso, con un timestamp corrente leggermente successivo).

Ad esempio:

User table 

hash-chiave solo: userID (timestamp della creazione di questo utente).

WidgetAttributes table 

tasto hash più tasto di selezione.
chiave hash: userID (utilizzare l'ID utente dalla tabella Utente dell'utente a cui appartiene il widget). range-key: attribID (usa il timestamp della creazione di questo attributo-widget).

Ora è possibile eseguire operazioni di "query" sulla tabella WidgetAttributes per ottenere tutti gli attributi del widget per un determinato utente; utilizzando "maggiore di zero" come parametro di query per la chiave di intervallo.

+7

non è garantito che la data e l'ora siano univoci, specialmente se più client sono in esecuzione in parallelo. – Jason

+0

timestamp_userID? – shle2821

+3

@ shle2821 Sarebbe meglio solo generare un UUID per l'id e memorizzare il timestamp in un campo separato rispetto a questo suggerimento. –

0

Mentre si lavora con DynamoDB in javascript con nodejs. Uso il modulo npm uuid per generare una chiave univoca.

Es:

id = uuid.v1();

riferiscono: uuid npm

0

Utilizzando biblioteca dati AWS DynamoDB mapper base dello schema in Node.js, tasto cancelletto (id) sarà generato automaticamente. Gli ID generati automaticamente sono basati su uuid v4.

Per ulteriori dettagli, dare un'occhiata al seguente pacchetto aws.

Data Mapper with annotation

Data Mapper package for Javascript

Esempio snipet

@table('my_table') 
class MyDomainClass { 
    @autoGeneratedHashKey() 
    id: string; 

    @rangeKey({defaultProvider:() => new Date()}) 
    createdAt: Date; 
}