2015-09-16 7 views
12

Sto provando a creare una tabella per archiviare gli elementi pubblicitari della fattura in dynamodb. Supponiamo che l'articolo sia definito da CompanyCode, InvoiceNumber e LineItemId, importo e altri dettagli dell'elemento pubblicitario.3 campi chiave primaria composita (articolo unico) in Dynamodb

Un elemento univoco è definito dalla combinazione dei primi 3 attributi. Qualsiasi 2 di questi attributi può essere uguale per i diversi articoli. Cosa dovrei selezionare come Hash Attribute e Range Attribute?

+1

Come pensate di interrogare questi record? Avrai sempre il Codice azienda + Numero fatture + CodiceItemId per le domande? – James

+0

Sì, quella è una delle query e inoltre ho bisogno di interrogare solo su CompanyCode. – HHH

risposta

7

Come sono sicuro che hai capito che non puoi avere più di due attributi nella tua chiave primaria (hash + intervallo). Pertanto, in base al tipo di query che eseguirai e alla dimensione dei tuoi dati, puoi strutturare la tua tabella in modi diversi.

(ottimizzato per il tipo di query che hai menzionato sopra: companyCode solo & tutto 3)

migliore sol'n per piccoli insiemi/medie dimensioni di dati:

  • Hash chiave: companyCode
  • Eseguire la query utilizzando solo CompanyCode e quindi filtra i risultati sugli altri due attributi

Soluzione ottimale per grandi insiemi di dati:

  • Hash chiave: companyCode
  • Key Range: InvoiceNumber + LineItemId
  • Questo consente di interrogare solo su un indice, ma la struttura della tabella è piuttosto brutto
+1

O forse CompanyCode + InvoiceNumber come hash, LineItemId come intervallo e aggiungere l'indice secondario per CompanyCode. In questo modo puoi eseguire query per società e puoi richiedere una fattura specifica per un'azienda specifica. Non sembra esserci alcuna necessità di interrogare solo il numero di fattura, poiché presumibilmente lo stesso numero di fattura può essere utilizzato con più società. – jarmod

+0

+1 al suggerimento di jarmod. Avere CompanyCode + InvoiceNumber offre una migliore cardinalità e, in definitiva, scalabilità nella propria applicazione. PER ESEMPIO. se un CompanyCode ottiene tonnellate di scritture per nuove fatture, quella chiave hash/partizione verrà sballata contro distribuirla attraverso la tabella –

+0

@jarmod C'è un modo in cui Dynamodb stesso si occupa di quella concatenazione e possiamo semplicemente passare quei campi come campi separati? Inoltre voglio accedere a quei campi come quelli separati nell'indice secondario senza memorizzarlo come duplicato di nuovo in altro campo. – HHH

11

Credo che la prima opzione offerta da @ georgeaf99 non funzionerà, perché se si fa così, quindi CompanyCode deve essere univoco nella tabella. Pertanto, ci sarebbe solo un articolo consentito per azienda. Penso che la seconda soluzione sia l'unico vero modo per farlo.

È possibile utilizzare companyCode come il tasto cancelletto, e poi tutti gli altri campi che si combinano per rendere l'oggetto unico (in questo caso InvoiceNumber e LineItemId) devono essere in qualche modo combinati in un unico valore (ad esempio la concatenazione con un delimitatore di campo) , che sarebbe il tuo Range Key. Sfortunatamente è un po 'brutto, ma questa è la natura di un database NoSQL come DynamoDB. Tuttavia, ti consentirà di archiviare correttamente i record con l'unicità corretta. Quando si leggono i record, se non si desidera analizzare nuovamente il campo combinato nelle sue singole parti, sarà necessario aggiungere ulteriori campi separati per InvoiceNumber e LineItemID.

Se non si dispone di un numero elevato di fatture per azienda, è possibile eseguire una query solo con la chiave hash e filtrare sul lato client. Se hai un numero elevato di fatture per azienda e devi poter interrogare solo gli articoli per una singola fattura, creo un indice secondario su CompanyCode e InvoiceNumber.