2012-04-19 23 views
8

Login Utente Ho costruito un programma ed attualmente ha un tavolo abbastanza standard dell'utente, come così:DynamoDB e tavolo

int id, email varchar, varchar la password

Se dovessi cambiare questo per DynamoDB allora come potrei creare questo tavolo?

Se uso una chiave hash con l'indirizzo e-mail, non sarei in grado di offrire la possibilità di aggiornare la tua e-mail e se ho usato un hash per memorizzare l'ID, allora avrei bisogno di usare una scansione che è costoso e limitato da un limite di 1 Mb.

Qualche consiglio, per favore? Grazie, Mark

+0

Questo sembra essere un duplicato di http://stackoverflow.com/q/12920884/268898 –

risposta

5

Dire che sarebbe costoso usare ID come hash perché è necessario filtrare dal campo di posta elettronica?

Se è necessario filtrare le query da una colonna non chiave, spesso si termina la creazione di un indice .

DynamoDB non ha built-in indice secundary, ma è abbastanza semplice da implementare la propria soluzione.

La tabella principale potrebbe utilizzare ID come hash, come lei ha, e un tavolo differente servirebbe come indice, potrebbe essere:

varchar email, int id 

Essere email il tasto cancelletto per la tavolo secondario. Se è consentito avere più utenti con la stessa e-mail, è possibile utilizzare ID come intervallo per semplificare le cose, altrimenti si adatterebbe una colonna semplice.

+1

È vero che è possibile creare il proprio indice secondario in questo modo, ma tenere presente che ** il codice è responsabile per tenerlo sincronizzato con la tabella principale **. Inoltre, le operazioni di aggiornamento della tabella e della tabella di indice non saranno atomiche. Questo può o non può essere un problema a seconda di come sono concomitanti i tuoi schemi di accesso. – bkirkbri

+4

DynamoDB ora ha indici secondari globali che possono essere utilizzati per questo (http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html) –

+0

@JeffWalkerCodeRanger Non vedo come i GSI possano aiutare a risolvere questo problema . Puoi spiegare? – rob

1

Avere una tabella diversa per l'indicizzazione comporterà un'elevata manutenzione. Mi sono imbattuto in un modello ridondante dal mio ex CTO.

per la vostra tavola: UTENTE

RDBMS:

id, password di posta elettronica

1, senthil3569 @ stack.com, chiede

DynamoDB:

K EY, id, email, password

1, 1, [email protected], chiede

senthil3569 @ stack.com, 1, [email protected], chiede

Invece di memorizzare un record, si sta memorizzando in modo ridondante per recuperare utilizzando colonne non indicizzate.

Spero che la soluzione sia chiara.

+2

In che modo questa soluzione richiede meno manutenzione rispetto a quella con la tabella secondaria? Hai ancora 2 record e non possono essere aggiornati in una transazione, anche se si trovano nella stessa tabella. – ivant