2015-11-06 11 views
10

Ho una tabella dinamo con i seguenti attributi:DynamoDB - Indice Secondario globale su voci impostate

  • id (Number - chiave primaria)
  • titolo (String)
  • created_at (Number - lungo)
  • tag (StringSet - contiene un insieme di tag dicono Android, iOS, ecc,)

voglio essere in grado di interrogare dai tag - get me tutti gli oggetti etichettati android. Come posso farlo in DynamoDB? Sembra che l'indice secondario globale possa essere compilato solo su ScalarDataTypes (che è Numero e Stringa) e non sugli elementi all'interno di un set.

Se l'approccio che sto prendendo è sbagliato, va bene anche un modo alternativo per farlo creando diverse tabelle o cambiando gli attributi.

risposta

7

Lo schema chiave per l'indice. Ogni attributo nello schema chiave dell'indice deve essere un attributo di primo livello di tipo String, Number o Binary. Gli attributi nidificati e i set multivalore non sono consentiti. Altri requisiti per lo schema chiave dipendono dal tipo di indice: per un indice secondario globale , l'attributo hash può essere un attributo della tabella scalare . Un attributo intervallo è facoltativo e anch'esso può essere qualsiasi attributo di tabella scalare . Per un indice secondario locale, l'attributo hash deve essere uguale all'attributo hash della tabella e l'attributo intervallo deve essere un attributo di tabella senza chiave.

  • Amazon raccomanda la creazione di un tavolo di uno-a-molti separata per questo tipo di problemi. Maggiori informazioni qui: Use one to many tables
2

Sarà necessario creare una tabella separata per questa query. Se siete interessati ad andare a prendere tutti gli elementi in base a un tag, allora vi suggerisco di tenere una tabella con una chiave primaria:
hash: tag
gamma: id

In questo modo è possibile utilizzare un semplice Query per recuperare tutti gli articoli per tag.

+0

tag non può essere una chiave primaria. Può essere solo una chiave per l'indicizzazione. la chiave primaria deve essere un identificativo univoco. – 500865

+5

hash + intervallo = chiave primaria. Tag + id è univoco in quanto id è univoco (secondo la tua domanda) –

+2

Avere un hash come tag comporta un caricamento non uniforme perché non c'è un numero elevato di valori tag distinti. Avere id come hash e tag come l'intervallo della nuova tabella con GSI che ha tag come hash e id come range è il modo consigliato. http://www.slideshare.net/AmazonWebServices/deep-dive-amazon-dynamodb (controlla diapositiva 33). – 500865

Problemi correlati