2012-02-03 13 views
43

Sto guardando Amazon DynamoDB in quanto sembra che toglie tutto il fastidio di mantenere e ridimensionare il server del database. Attualmente sto usando MySQL e mantenere e scalare il database è un mal di testa completo.Come si esegue una query su DynamoDB?

Ho esaminato la documentazione e sto facendo fatica a cercare di capire come strutturare i dati in modo che possano essere recuperati facilmente.

Sono totalmente nuovo ai database NoSQL e non relazionali.

Dalla documentazione Dynamo suona come è possibile interrogare solo un tavolo sulla tasto cancelletto primaria, e la chiave primaria gamma con un numero limitato di operatori di confronto.

Oppure è possibile eseguire una scansione completa della tabella e applicare un filtro. Il problema è che analizzerà solo 1Mb alla volta, quindi probabilmente dovresti ripetere la scansione per trovare il numero X di risultati.

Mi rendo conto che queste limitazioni consentono loro di fornire prestazioni prevedibili, ma sembra che rendano davvero difficile ottenere i dati. Inoltre, eseguire le scansioni complete della tabella sembra come se fosse davvero inefficiente e diventerebbe meno efficiente nel tempo man mano che la tabella cresce.

Per istanza, dire che ho un clone di Flickr. Il mio tavolo Immagini potrebbe essere simile:

  • ID immagine (Numero, primaria Hash Key)
  • Aggiunto (Numero, Chiave primaria Range)
  • ID utente (String)
  • Tag (String Set)
  • ecc

Quindi, utilizzando interrogazione vorrei essere in grado di elencare tutte le immagini degli ultimi 7 giorni e limitarla a un numero X di risultati abbastanza facilmente.

Ma se volessi elencare tutte le immagini da un utente particolare avrei bisogno di fare una scansione completa della tabella e filtrare per nome utente. Lo stesso vale per i tag.

E poiché è possibile eseguire la scansione solo 1Mb in un momento potrebbe essere necessario fare più scansioni per trovare un numero X di immagini. Inoltre, non vedo un modo per fermarsi facilmente al numero X di immagini. Se stai cercando di afferrare 30 immagini, la prima scansione potrebbe trovare 5, e il secondo potrebbe trovare 40.

Devo questo diritto? È fondamentalmente un trade-off? Ottieni prestazioni del database predicibili davvero rapide, praticamente senza manutenzione. Ma il compromesso è che hai bisogno di costruire molta più logica per gestire i risultati?

O sono completamente fuori base qui?

risposta

16

Sì, lei ha ragione circa la compromesso tra prestazioni e flessibilità delle query.

Ma ci sono alcuni accorgimenti per ridurre il dolore: gli indici secondari/denormalizzazione sono probabilmente i più importanti.

Si avrebbe un'altra tabella digitata su ID utente, elencando tutte le loro immagini, ad esempio. Quando aggiungi un'immagine, aggiorni questa tabella e aggiungi una riga alla tabella immessa nell'ID immagine.

È necessario decidere quali query sono necessarie, quindi progettare il modello di dati che li circonda.

+0

Ok questo ha senso. Come faresti qualcosa come i tag? La chiave primaria sarebbe il nome del tag e quindi la chiave intervallo sarebbe l'ID immagine? Suppongo che la chiave primaria non possa essere un set di stringhe. – chriserwin

+0

Suona bene, ma non ho familiarità con i dettagli di DynamoDB - ho invece lavorato con Cassandra. – DNA

+0

Quando interrogo DynamoDB da zend per la prima volta, ci vogliono 3 secondi. e quindi ci vuole meno di un secondo per eseguire altre query. Quale può essere la ragione di questo? – keen

6

Penso che sia necessario creare il proprio indice secondario, utilizzando un'altra tabella.

Questa tabella "schema" potrebbe essere:

User ID (String, Primary Key) 
    Date Added (Number, Range Key) 
    Image ID (Number) 

-

In questo modo è possibile eseguire una query per ID utente e il filtro per data e

4

È possibile utilizzare chiave hash composita chiave come indice primario.

Dal DynamoDB Pagina:

Una chiave primaria può essere una chiave hash singolo attributo o un chiave hash-range composito. Una chiave primaria hash con attributo singolo potrebbe essere, per esempio , "ID utente". Ciò consentirebbe di leggere e scrivere rapidamente i dati per un elemento associato a un determinato ID utente.

Una chiave hash-range composita è indicizzata come un elemento chiave hash e un elemento chiave intervallo . Questa chiave multiparte mantiene una gerarchia tra i valori del primo e del secondo elemento. Ad esempio, una chiave composita hash-range potrebbe essere una combinazione di "UserID" (cancelletto) e "Timestamp" (intervallo). Tenendo costante l'elemento chiave hash, è possibile eseguire la ricerca attraverso l'elemento chiave intervallo per recuperare gli elementi. Ciò consentirebbe a di utilizzare l'API Query per, ad esempio, recuperare tutti gli articoli per un singolo ID utente in un intervallo di data/ora.

Problemi correlati