Utilizzo di DynamoDB come archivio dati per un negozio online - Amazon DynamoDB

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Utilizzo di DynamoDB come archivio dati per un negozio online

In questo caso di utilizzo si parla di usare DynamoDB come archivio dati per un negozio online (o e-store).

Caso d'uso

Un negozio online consente agli utenti di sfogliare diversi prodotti e alla fine di acquistarli. In base alla fattura generata, un cliente può pagare utilizzando un codice sconto o una carta regalo e poi pagare l'importo residuo con una carta di credito. I prodotti acquistati verranno ritirati da uno dei diversi magazzini e spediti all'indirizzo fornito. I modelli di accesso tipici per un negozio online includono:

  • Ottieni clienti per un determinato periodo customerId

  • Ottieni un prodotto per un determinato prezzo productId

  • Ottieni un magazzino per un determinato prezzo warehouseId

  • Ottieni un inventario di prodotti per tutti i magazzini entro un productId

  • Ottieni un ordine per un determinato periodo orderId

  • Ottieni tutti i prodotti per un determinato prezzo orderId

  • Ottieni una fattura per un determinato periodo orderId

  • Ricevi tutte le spedizioni per un determinato periodo orderId

  • Ricevi tutti gli ordini per un determinato productId intervallo di date

  • Ottieni la fattura per un determinato periodo invoiceId

  • Ottieni tutti i pagamenti per un determinato periodo invoiceId

  • Ottieni i dettagli della spedizione per un determinato periodo shipmentId

  • Ricevi tutte le spedizioni per un determinato periodo warehouseId

  • Ottieni l'inventario di tutti i prodotti per un determinato periodo warehouseId

  • Ottieni tutte le fatture per un determinato customerId intervallo di date

  • Ordina tutti i prodotti in base customerId a un determinato intervallo di date

Diagramma delle relazioni tra entità

Questo è il diagramma delle relazioni tra entità (ERD) che useremo per modellare DynamoDB come archivio dati per un negozio online.

ERDper il modello di dati di un negozio online con entità come Prodotto, Ordine, Pagamento e Cliente.

Modelli di accesso

Questi sono i modelli di accesso da considerare quando si usa DynamoDB come archivio dati per un negozio online.

  1. getCustomerByCustomerId

  2. getProductByProductId

  3. getWarehouseByWarehouseId

  4. getProductInventoryByProductId

  5. getOrderDetailsByOrderId

  6. getProductByOrderId

  7. getInvoiceByOrderId

  8. getShipmentByOrderId

  9. getOrderByProductIdForDateRange

  10. getInvoiceByInvoiceId

  11. getPaymentByInvoiceId

  12. getShipmentDetailsByShipmentId

  13. getShipmentByWarehouseId

  14. getProductInventoryByWarehouseId

  15. getInvoiceByCustomerIdForDateRange

  16. getProductsByCustomerIdForDateRange

Evoluzione della progettazione dello schema

Utilizzo diNessun SQL workbench per DynamoDB, import AnOnlineShop_1.json per creare un nuovo modello di dati chiamato AnOnlineShop e una nuova tabella chiamata. OnlineShop Nota che usiamo i nomi generici PK e SK per la chiave di partizione e la chiave di ordinamento. Questa è una pratica utilizzata per memorizzare diversi tipi di entità nella stessa tabella.

Fase 1: Gestire il modello di accesso 1 (getCustomerByCustomerId)

Importa AnOnlineShop_2.json per gestire il pattern di accesso 1 (). getCustomerByCustomerId Alcune entità non hanno relazioni con altre entità, quindi useremo lo stesso valore di PK e SK per loro. Nei dati di esempio, nota che le chiavi utilizzano un prefisso c#per distinguere customerId da altre entità che verranno aggiunte in seguito. Questa pratica viene ripetuta anche per altre entità.

Per risolvere questo modello di accesso, un’operazione GetItem può essere utilizzata con PK=customerId e SK=customerId.

Fase 2: Gestire il modello di accesso 2 (getProductByProductId)

Importa AnOnlineShop_3.json per indirizzare il pattern di accesso 2 () per l'entità. getProductByProductId product Le entità del prodotto sono precedute da p# e lo stesso attributo chiave di ordinamento è stato utilizzato per memorizzare customerID così come productID. Denominazione generica e partizionamento verticale ci consentono di creare tali collezioni di articoli per un design efficace di una tabella singola.

Per risolvere questo modello di accesso, un’operazione GetItem può essere utilizzata con PK=productId e SK=productId.

Fase 3: Gestire il modello di accesso 3 (getWarehouseByWarehouseId)

Importa AnOnlineShop_4.json per indirizzare il pattern di accesso 3 () per l'entità. getWarehouseByWarehouseId warehouse Al momento abbiamo le entità customer, product e warehouse aggiunte alla stessa tabella. Si distinguono utilizzando i prefissi e l’attributo EntityType. Un attributo di tipo (o denominazione del prefisso) migliora la leggibilità del modello. La leggibilità ne risentirebbe se memorizzassimo semplicemente elementi alfanumerici IDs per diverse entità nello stesso attributo. Sarebbe difficile distinguere un'entità dall'altra in assenza di questi identificatori.

Per risolvere questo modello di accesso, un’operazione GetItem può essere utilizzata con PK=warehouseId e SK=warehouseId.

Tabella di base:

Progettazione di tabelle DynamoDB con prefissi EntityType e per ottenere dati di magazzino tramite il relativo ID.

Fase 4: Gestire il modello di accesso 4 (getProductInventoryByProductId)

Importa AnOnlineShop_5.json per indirizzare il pattern di accesso 4 (). getProductInventoryByProductId warehouseIteml'entità viene utilizzata per tenere traccia del numero di prodotti in ogni magazzino. Questo articolo viene normalmente aggiornato quando un prodotto viene aggiunto o rimosso da un magazzino. Come si vede inERD, esiste una many-to-many relazione tra product ewarehouse. Qui, la one-to-many relazione da product a warehouse è modellata comewarehouseItem. Successivamente, product verrà modellata warehouse anche la one-to-many relazione da a.

Il pattern di accesso 4 può essere risolto con una query su PK=ProductId e SK begins_with “w#“.

Per ulteriori informazioni su begins_with() e altre espressioni che possono essere applicate alle chiavi di ordinamento, vedi Espressioni delle condizioni chiave.

Tabella di base:

Progettazione di tabelle per interrogare ProductID e warehouseId per tracciare l'inventario dei prodotti in un determinato magazzino.

Fase 5: Gestire i modelli di accesso 5 (getOrderDetailsByOrderId) e 6 (getProductByOrderId)

Aggiungi altri customerwarehouse elementi e articoli alla tabella importando AnOnlineShop _6.json. product Quindi, importa AnOnlineShop_7.json per creare una raccolta di elementi in grado di soddisfare i order modelli di accesso 5 () e 6 (). getOrderDetailsByOrderId getProductByOrderId Puoi vedere la one-to-many relazione tra order e product modellata come entità. orderItem

Per risolvere il modello di accesso 5 (getOrderDetailsByOrderId), esegui una query della tabella con PK=orderId. Questo fornirà tutte le informazioni sull'ordine, tra cui customerId e i prodotti ordinati.

Tabella di base:

Disegno di tabella da utilizzare orderId per ottenere informazioni su tutti i prodotti ordinati.

Per risolvere il modello di accesso 6 (getProductByOrderId), dobbiamo leggere i prodotti solo in order. Interroga la tabella con PK=orderId e SK begins_with “p#” per realizzarlo.

Tabella di base:

Progettazione di tabelle productId per eseguire interrogazioni, utilizzare orderId e ordinare i prodotti.

Fase 6: Gestire il modello di accesso 7 (getInvoiceByOrderId)

Importa AnOnlineShop_8.json per aggiungere un'invoiceentità alla raccolta di articoli dell'ordine per gestire il modello di accesso 7 (). getInvoiceByOrderId Per risolvere questo modello di accesso, puoi usare un’operazione di query con PK=orderId e SK begins_with “i#”.

Tabella di base:

Progettazione di una tabella con l'entità della fattura nella raccolta di articoli dell'ordine entro cui ottenere una fattura. orderId

Fase 7: Gestire il modello di accesso 8 (getShipmentByOrderId)

Importa AnOnlineShop_9.json per aggiungere shipment entità alla raccolta di articoli dell'ordine in modo da soddisfare il modello di accesso 8 (). getShipmentByOrderId Stiamo estendendo lo stesso modello partizionato verticalmente aggiungendo più tipi di entità nel design a tabella singola. Da notare come la raccolta di articoli dell’ordine contenga le diverse relazioni che un’entità order ha con le entità shipment, orderItem e invoice.

Per ricevere spedizioni entro la data orderId, è possibile eseguire un'operazione di query con PK=orderId e SK begins_with “sh#”.

Tabella di base:

Progettazione della tabella con l'entità di spedizione aggiunta alla raccolta di articoli dell'ordine per ottenere le spedizioni in base al numero dell'ordine.

Fase 8: Gestire il modello di accesso 9 (getOrderByProductIdForDateRange)

Abbiamo creato una raccolta degli articoli dell’ordine nel passaggio precedente. Questo modello di accesso ha nuove dimensioni di ricerca (ProductID e Date) che richiedono la scansione dell'intera tabella e il filtraggio dei record pertinenti per recuperare gli elementi mirati. Per risolvere questo modello di accesso, dovremo creare un indice secondario globale (GSI). Importa AnOnlineShop_10.json per creare una nuova raccolta di articoli utilizzando il GSI che consente di recuperare orderItem i dati da diverse raccolte di articoli dell'ordine. I dati ora hanno GSI1-PK e GSI1-SK che saranno rispettivamente la chiave di partizione e la chiave di ordinamento di GSI1.

DynamoDB popola automaticamente gli elementi che contengono gli attributi chiave di GSI a dalla tabella alla. GSI Non è necessario eseguire manualmente inserimenti aggiuntivi in. GSI

Per risolvere il modello di accesso 9, esegui una query su GSI1 con GSI1-PK=productId e GSI1SK between (date1, date2).

Tabella di base:

Progettazione di tabelle con l'obiettivo GSI di ottenere i dati degli ordini da diverse raccolte di articoli dell'ordine.

GSI1:

GSIprogetta con ProductID e Date come chiavi di partizione e ordinamento per ottenere ordini per ID e data del prodotto.

Fase 9: Gestire i modelli di accesso 10 (getInvoiceByInvoiceId) e 11 (getPaymentByInvoiceId)

Importa AnOnlineShop_11.json per risolvere i modelli di accesso 10 (getInvoiceByInvoiceId) e 11 (getPaymentByInvoiceId), entrambi correlati a. invoice Anche se si tratta di due modelli di accesso diversi, vengono realizzati utilizzando la stessa condizione chiave. Payments sono definiti come un attributo con il tipo di dati della mappa su entità invoice.

Nota

GSI1-PKed GSI1-SK è sovraccarico per memorizzare informazioni su entità diverse in modo da poter fornire più modelli di accesso dalla stessa. GSI Per ulteriori informazioni sul GSI sovraccarico, vedere. Sovraccarico degli indici secondari globali in DynamoDB

Per risolvere il modello di accesso 10 e 11, esegui una query su GSI1 con GSI1-PK=invoiceId e GSI1-SK=invoiceId.

GSI1:

GSIprogetta utilizzando invoiceId sia una chiave di partizione che una chiave di ordinamento per ottenere la fattura e il pagamento tramite l'ID della fattura.

Fase 10: Gestire i modelli di accesso 12 (getShipmentDetailsByShipmentId) e 13 (getShipmentByWarehouseId)

Importa AnOnlineShop_12.json per gestire i modelli di accesso 12 (getShipmentDetailsByShipmentId) e 13 (). getShipmentByWarehouseId

Da notare che le entità shipmentItem vengono aggiunte alla raccolta di elementi dell’ordine sulla tabella di base per poter recuperare tutti i dettagli su un ordine in un'unica operazione di query.

Tabella di base:

Progetta una tabella con l' shipmentItem entità nella raccolta degli articoli dell'ordine per ottenere tutti i dettagli dell'ordine.

Le chiavi di GSI1 partizione e ordinamento sono già state utilizzate per modellare una one-to-many relazione tra shipment eshipmentItem. Per risolvere il modello di accesso 12 (getShipmentDetailsByShipmentId), esegui una query su GSI1 con GSI1-PK=shipmentId e GSI1-SK=shipmentId.

GSI1:

GSI1progetta con shipmentId una chiave di partizione e ordinamento per ottenere i dettagli della spedizione in base all'ID di spedizione.

Dovremo creare un altro GSI (GSI2) per modellare la nuova one-to-many relazione tra warehouse e shipment per il pattern di accesso 13 (getShipmentByWarehouseId). Per risolvere questo modello di accesso, esegui una query su GSI2 con GSI2-PK=warehouseId e GSI2-SK begins_with “sh#”.

GSI2:

GSI2progetta con warehouseId e shipmentId come chiavi di partizione e ordinamento per ricevere le spedizioni per magazzino.

Fase 11: Gestire i modelli di accesso 14 (getProductInventoryByWarehouseId) 15 (getInvoiceByCustomerIdForDateRange) e 16 (getProductsByCustomerIdForDateRange)

Importa AnOnlineShop_13.json per aggiungere dati relativi al prossimo set di modelli di accesso. Per risolvere il modello di accesso 14 (getProductInventoryByWarehouseId), esegui una query su GSI2 con GSI2-PK=warehouseId e GSI2-SK begins_with “p#”.

GSI2:

GSI2progetta con warehouseId e productId come chiavi di partizione e ordinamento per affrontare il pattern di accesso 14.

Per risolvere il modello di accesso 15 (getInvoiceByCustomerIdForDateRange), esegui una query su GSI2 con GSI2-PK=customerId e GSI2-SK between (i#date1, i#date2).

GSI2:

GSI2progetta con un customerId intervallo di date di fatturazione come chiavi di partizione e ordinamento per soddisfare lo schema di accesso 15.

Per risolvere il modello di accesso 16 (getProductsByCustomerIdForDateRange), esegui una query su GSI2 con GSI2-PK=customerId e GSI2-SK between (p#date1, p#date2).

GSI2:

GSI2progettazione con customerId intervallo di date del prodotto come chiavi di partizione e ordinamento per soddisfare lo schema di accesso 16
Nota

In No SQL Workbench, i facet rappresentano i diversi modelli di accesso ai dati di un'applicazione per DynamoDB. I facet consentono di visualizzare un sottoinsieme di dati in una tabella, senza dover visualizzare record che non soddisfano i vincoli del facet. I facet sono considerati uno strumento di modellazione visiva dei dati e non esistono come costrutto utilizzabile in DynamoDB, in quanto sono puramente un aiuto alla modellazione dei modelli di accesso.

Importa AnOnlineShop_facets.json per vedere i facet per questo caso d'uso.

Tutti i modelli di accesso e il modo in cui la progettazione dello schema li affronta sono riassunti nella tabella seguente:

Modello di accesso Tabella GSI base//LSI Operazione Valore della chiave di partizione Valore della chiave di ordinamento
getCustomerByCustomerId Tabella di base GetItem PK= customerId SK= customerId
getProductByProductId Tabella di base GetItem PK= productId SK= productId
getWarehouseByWarehouseId Tabella di base GetItem PK= warehouseId SK= warehouseId
getProductInventoryByProductId Tabella di base Query PK= productId SK begins_with "w#"
getOrderDetailsByOrderId Tabella di base Query PK= orderId
getProductByOrderId Tabella di base Query PK= orderId SK begins_with "p#"
getInvoiceByOrderId Tabella di base Query PK= orderId SK begins_with "i#"
getShipmentByOrderId Tabella di base Query PK= orderId SK begins_with "sh#"
getOrderByProductIdForDateRange GSI1 Query PK= productId SK tra date1 e date2
getInvoiceByInvoiceId GSI1 Query PK= invoiceId SK= invoiceId
getPaymentByInvoiceId GSI1 Query PK= invoiceId SK= invoiceId
getShipmentDetailsByShipmentId GSI1 Query PK= shipmentId SK= shipmentId
getShipmentByWarehouseId GSI2 Query PK= warehouseId SK begins_with "sh#"
getProductInventoryByWarehouseId GSI2 Query PK= warehouseId SK begins_with "p#"
getInvoiceByCustomerIdForDateRange GSI2 Query PK= customerId SK tra i#date1 e i#date2
getProductsByCustomerIdForDateRange GSI2 Query PK= customerId SK between p#date1 and p#date2

Schema finale del negozio online

Di seguito sono riportate le progettazioni dello schema finale. Per scaricare questo schema come JSON file, consulta DynamoDB Design Patterns su. GitHub

Tabella di base

Schema finale della tabella di base per un negozio online con attributi come Nome EntityName .

GSI1

GSI1Schema finale per la tabella base di un negozio online con attributi, ad esempio EntityType.

GSI2

GSI2Schema finale per la tabella base di un negozio online con attributi, ad esempio EntityType.

Utilizzo di No SQL Workbench con questo schema di progettazione

Puoi importare questo schema finale in No SQL Workbench, uno strumento visivo che fornisce funzionalità di modellazione, visualizzazione dei dati e sviluppo di query per DynamoDB, per esplorare e modificare ulteriormente il tuo nuovo progetto. Per iniziare, segui queste fasi:

  1. Scarica No Workbench. SQL Per ulteriori informazioni, consulta Scarica No SQL Workbench per DynamoDB.

  2. Scarica il file di JSON schema sopra elencato, che è già nel formato del modello No SQL Workbench.

  3. Importa il file JSON dello schema in No SQL Workbench. Per ulteriori informazioni, consulta Importazione di un modello di dati esistente.

  4. Dopo averlo importato in NOSQL Workbench, puoi modificare il modello di dati. Per ulteriori informazioni, consulta Modifica di un modello di dati esistente.

  5. Per visualizzare il modello di dati, aggiungere dati di esempio o importare dati di esempio da un CSV file, utilizza la funzionalità Data Visualizer di No Workbench. SQL