Il processo di modellazione dei dati deve prendere in considerazione i requisiti per il recupero dei dati, in DynamoDB è possibile eseguire query solo per hash o hash + chiave di intervallo.
Se l'interrogazione con la chiave primaria non è sufficiente per le vostre esigenze, potete certamente avere chiavi alternative creando indici secondari (locali o globali).
Tuttavia, la concatenazione di più attributi può essere utilizzata in determinati scenari come chiave primaria per evitare il costo di mantenere gli indici secondari.
Se è necessario ottenere gli utenti in base a Nome, Cognome e Data di creazione, suggerirei di includere tali attributi nella chiave Hash e intervallo, quindi la creazione di indici aggiuntivi non è necessaria.
La chiave hash deve contenere un valore che può essere calcolato dall'applicazione e allo stesso tempo fornisce un accesso dati uniforme. Ad esempio, dire che si sceglie di definire le chiavi come segue:
Hash chiave (nome): first_name # last_name
key range (create): MM-GG-AAAA-HH-MM-SS-millisecondi
È sempre possibile aggiungere attributi aggiuntivi nel caso in cui quelli menzionati non siano sufficienti a rendere la chiave univoca sul tavolo.
users = Table.create('users', schema=[
HashKey('name'),
RangeKey('created'),
], throughput={
'read': 5,
'write': 15,
})
Aggiungendo l'utente al tavolo:
with users.batch_write() as batch:
batch.put_item(data={
'name': 'John#Doe',
'first_name': 'John',
'last_name': 'Doe',
'created': '03-21-2015-03-03-02-3243',
})
Il codice per trovare l'utente John Doe, creato '03 -21-2015' dovrebbe essere qualcosa di simile:
name_john_doe = users.query_2(
name__eq='John#Doe',
created__beginswith='03-21-2015'
)
for user in name_john_doe:
print user['first_name']
Considerazioni importanti:
i. Se la query inizia a diventare troppo complicata e Hash o Range Key troppo a lungo con troppi campi concatenati, non utilizzare in alcun modo gli indici secondari. È un buon segno che solo un indice primario non è sufficiente per le tue esigenze.
ii. Ho detto che il tasto cancelletto dovrebbe fornire accesso ai dati uniforme:.
"Dynamo usa hashing coerente per partizionare il suo spazio chiave attraverso le sue repliche e per garantire una distribuzione uniforme del carico Una chiave distribuzione uniforme può aiutarci a raggiungere distribuzione uniforme del carico supponendo che la distribuzione dell'accesso delle chiavi non sia molto distorta."[DYN]
Non solo il tasto cancelletto permette di identificare in modo univoco il record, ma è anche il meccanismo per garantire la distribuzione del carico. La chiave Range (se utilizzati) aiuta a indicare i record che verranno per lo più recuperati insieme, quindi, , l'archiviazione può anche essere ottimizzato per tale bisogno
il link qui sotto ha una spiegazione completa sul tema:.
http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html#GuidelinesForTables.UniformWorkload
la tua ricerca su un indice e possono utilizzare un [ 'ConditionExpression'] (http : //docs.aws.amazon.com/amazo ndynamodb/latest/developerguide/Expressions.SpecifyingConditions.html) per altri confronti di attributi. Non è chiaro per me come sia strutturata la tua tabella in questo momento. – mkobit
quali informazioni extra ti servono? vuoi dire che il comando di creazione del tavolo non è abbastanza? –