Menggunakan DynamoDB sebagai penyimpanan data untuk toko online - Amazon DynamoDB

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Menggunakan DynamoDB sebagai penyimpanan data untuk toko online

Kasus penggunaan ini membahas penggunaan DynamoDB sebagai penyimpanan data untuk toko online (atau e-store).

Kasus penggunaan

Toko online memungkinkan pengguna menelusuri berbagai produk dan pada akhirnya membelinya. Berdasarkan faktur yang dihasilkan, pelanggan dapat membayar menggunakan kode diskon atau kartu hadiah lalu membayar jumlah yang tersisa dengan kartu kredit. Produk yang dibeli akan diambil dari salah satu gudang dan akan dikirim ke alamat yang diberikan. Pola akses umum untuk toko online meliputi:

  • Dapatkan pelanggan untuk yang diberikan customerId

  • Dapatkan produk untuk yang diberikan productId

  • Dapatkan gudang untuk yang diberikan warehouseId

  • Dapatkan inventaris produk untuk semua gudang dengan productId

  • Dapatkan pesanan untuk yang diberikan orderId

  • Dapatkan semua produk untuk yang diberikan orderId

  • Dapatkan faktur untuk yang diberikan orderId

  • Dapatkan semua pengiriman untuk yang diberikan orderId

  • Dapatkan semua pesanan untuk yang diberikan productId untuk rentang tanggal tertentu

  • Dapatkan faktur untuk yang diberikan invoiceId

  • Dapatkan semua pembayaran untuk yang diberikan invoiceId

  • Dapatkan detail pengiriman untuk yang diberikan shipmentId

  • Dapatkan semua pengiriman untuk yang diberikan warehouseId

  • Dapatkan inventaris semua produk untuk yang diberikan warehouseId

  • Dapatkan semua faktur untuk diberikan customerId untuk rentang tanggal tertentu

  • Dapatkan semua produk yang dipesan oleh yang diberikan customerId untuk rentang tanggal tertentu

Diagram hubungan entitas

Ini adalah diagram hubungan entitas (ERD) yang akan kita gunakan untuk memodelkan DynamoDB sebagai penyimpanan data untuk toko online.

ERDuntuk model data toko online dengan entitas, seperti Produk, Pesanan, Pembayaran, dan Pelanggan.

Pola akses

Ini adalah pola akses yang akan dipertimbangkan saat menggunakan DynamoDB sebagai penyimpanan data untuk toko 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

Evolusi desain skema

MenggunakanTidak ada SQL Workbench untuk DynamoDB, import AnOnlineShop_1.json untuk membuat model data baru dipanggil AnOnlineShop dan tabel baru dipanggil. OnlineShop Perhatikan bahwa kita menggunakan nama generik PK dan SK untuk kunci partisi dan kunci urutan. Hal ini adalah praktik yang digunakan untuk menyimpan berbagai jenis entitas dalam tabel yang sama.

Langkah 1: Tangani pola akses 1 (getCustomerByCustomerId)

Impor AnOnlineShop_2.json untuk menangani pola akses 1 (). getCustomerByCustomerId Beberapa entitas tidak memiliki hubungan dengan entitas lain, jadi kita akan menggunakan nilai yang sama dari PK dan SK untuk entitas tersebut. Dalam contoh data, perhatikan bahwa kunci menggunakan prefiks c# untuk membedakan customerId dari entitas lain yang akan ditambahkan nanti. Praktik ini diulang untuk entitas lain juga.

Untuk menangani pola akses ini, operasi GetItem dapat digunakan dengan PK=customerId dan SK=customerId.

Langkah 2: Tangani pola akses 2 (getProductByProductId)

Impor AnOnlineShop_3.json ke alamat pola akses 2 (getProductByProductId) untuk entitas. product Entitas produk diawali oleh p# dan atribut kunci urutan yang sama digunakan untuk menyimpan customerID serta productID. Penamaan generik dan partisi vertikal memungkinkan kita membuat koleksi item untuk desain tabel tunggal yang efektif.

Untuk menangani pola akses ini, operasi GetItem dapat digunakan dengan PK=productId dan SK=productId.

Langkah 3: Tangani pola akses 3 (getWarehouseByWarehouseId)

Impor AnOnlineShop_4.json ke alamat pola akses 3 (getWarehouseByWarehouseId) untuk entitas. warehouse Saat ini entitas customer, product, dan warehouse ditambahkan ke tabel yang sama. Entitas tersebut dibedakan menggunakan prefiks dan atribut EntityType. Atribut jenis (atau penamaan prefiks) meningkatkan keterbacaan model. Keterbacaan akan terpengaruh jika kita hanya menyimpan alfanumerik IDs untuk entitas yang berbeda dalam atribut yang sama. Akan sulit untuk membedakan satu entitas dari yang lain tanpa adanya pengidentifikasi ini.

Untuk menangani pola akses ini, operasi GetItem dapat digunakan dengan PK=warehouseId dan SK=warehouseId.

Tabel dasar:

Desain tabel DynamoDB dengan awalan EntityType dan untuk mendapatkan data gudang dengan ID-nya.

Langkah 4: Tangani pola akses 4 (getProductInventoryByProductId)

Impor AnOnlineShop_5.json ke pola akses alamat 4 (). getProductInventoryByProductId warehouseItemEntitas digunakan untuk melacak jumlah produk di setiap gudang. Item ini biasanya akan diperbarui ketika produk ditambahkan atau dihapus dari gudang. Seperti yang terlihat diERD, ada many-to-many hubungan antara product danwarehouse. Di sini, one-to-many hubungan dari product ke warehouse dimodelkan sebagaiwarehouseItem. Nantinya, one-to-many hubungan dari warehouse hingga product akan dimodelkan juga.

Pola akses 4 dapat ditangani dengan kueri pada PK=ProductId dan SK begins_with “w#“.

Untuk informasi selengkapnya tentang begins_with() dan ekspresi lain yang dapat diterapkan ke kunci urutan, lihat Ekspresi Kondisi Kunci.

Tabel dasar:

Desain tabel untuk query ProductID warehouseId dan untuk melacak inventaris produk di gudang tertentu.

Langkah 5: Tangani pola akses 5 (getOrderDetailsByOrderId) dan 6 (getProductByOrderId)

Tambahkan beberapa lagicustomer,product, dan warehouse item ke tabel dengan mengimpor AnOnlineShop_6.json. Kemudian, impor AnOnlineShop_7.json untuk membuat koleksi item order yang dapat mengatasi pola akses 5 (getOrderDetailsByOrderId) dan 6 (). getProductByOrderId Anda dapat melihat one-to-many hubungan antara order dan product dimodelkan sebagai orderItem entitas.

Untuk menangani pola akses 5 (getOrderDetailsByOrderId), lakukan kueri tabel dengan PK=orderId. Tindakan ini akan memberikan semua informasi tentang pesanan termasuk customerId dan produk yang dipesan.

Tabel dasar:

Desain tabel untuk kueri menggunakan orderId untuk mendapatkan informasi tentang semua produk yang dipesan.

Untuk menagani pola akses 6 (getProductByOrderId), kita hanya perlu membaca produk dalam order. Kueri tabel dengan PK=orderId dan SK begins_with “p#” untuk mencapai hal ini.

Tabel dasar:

Desain tabel untuk kueri menggunakan orderId dan productId untuk mendapatkan produk dalam pesanan.

Langkah 6: Tangani pola akses 7 (getInvoiceByOrderId)

Impor AnOnlineShop_8.json untuk menambahkan invoice entitas ke koleksi item pesanan untuk menangani pola akses 7 (). getInvoiceByOrderId Untuk menangani pola akses ini, operasi PK=orderId dan SK begins_with “i#” dapat digunakan.

Tabel dasar:

Desain tabel dengan entitas faktur dalam koleksi item pesanan untuk mendapatkan faktur oleh. orderId

Langkah 7: Tangani pola akses 8 (getShipmentByOrderId)

Impor AnOnlineShop_9.json untuk menambahkan shipment entitas ke koleksi item pesanan untuk mengatasi pola akses 8 (). getShipmentByOrderId Model yang dipartisi secara vertikal yang sama diperluas dengan menambahkan lebih banyak jenis entitas dalam desain tabel tunggal. Perhatikan bagaimana koleksi item pesanan berisi hubungan yang berbeda dari hubungan entitas order dengan entitasshipment, orderItem, dan invoice.

Untuk mendapatkan pengiriman berdasarkan orderId, Anda dapat melakukan operasi kueri dengan PK=orderId dan SK begins_with “sh#”.

Tabel dasar:

Desain tabel dengan entitas pengiriman ditambahkan ke koleksi barang pesanan untuk mendapatkan pengiriman dengan ID pesanan.

Langkah 8: Tangani pola akses 9 (getOrderByProductIdForDateRange)

Kita membuat koleksi item pesanan pada langkah sebelumnya. Pola akses ini memiliki dimensi pencarian baru (ProductID dan Date) yang mengharuskan Anda memindai seluruh tabel dan memfilter catatan yang relevan untuk mengambil item yang ditargetkan. Untuk mengatasi pola akses ini, kita harus membuat indeks sekunder global (GSI). Impor AnOnlineShop_10.json untuk membuat koleksi item baru menggunakan GSI yang memungkinkan untuk mengambil orderItem data dari beberapa koleksi item pesanan. Sekarang data memiliki GSI1-PK dan GSI1-SK yang masing-masing akan menjadi kunci partisi dan kunci urutan GSI1.

DynamoDB secara otomatis mengisi item yang berisi atribut kunci GSI a dari tabel ke. GSI Tidak perlu melakukan sisipan tambahan secara manual ke dalam. GSI

Untuk menangani pola akses 9, lakukan kueri GSI1 dengan GSI1-PK=productId dan GSI1SK between (date1, date2).

Tabel dasar:

Desain tabel dengan a GSI untuk mendapatkan data pesanan dari beberapa koleksi item pesanan.

GSI1:

GSIdesain dengan productID dan Date sebagai partisi dan kunci sortir untuk mendapatkan pesanan berdasarkan ID produk dan tanggal.

Langkah 9: Tangani pola akses 10 (getInvoiceByInvoiceId) dan 11 (getPaymentByInvoiceId)

Impor AnOnlineShop_11.json untuk mengatasi pola akses 10 (getInvoiceByInvoiceId) dan 11 (getPaymentByInvoiceId), keduanya terkait dengan. invoice Meskipun berbeda, dua pola akses ini direalisasikan menggunakan kondisi kunci yang sama. Payments didefinisikan sebagai atribut dengan jenis data peta pada entitas invoice.

catatan

GSI1-PKdan GSI1-SK kelebihan beban untuk menyimpan informasi tentang entitas yang berbeda sehingga beberapa pola akses dapat dilayani dari yang samaGSI. Untuk informasi selengkapnya tentang GSI kelebihan beban, lihatMembebani Indeks Sekunder Global di DynamoDB.

Untuk menangani pola akses 10 dan 11, lakukan kueri GSI1 dengan GSI1-PK=invoiceId dan GSI1-SK=invoiceId.

GSI1:

GSIdesain dengan invoiceId sebagai partisi dan kunci sortir untuk mendapatkan faktur dan pembayaran dengan ID faktur.

Langkah 10: Tangani pola akses 12 (getShipmentDetailsByShipmentId) dan 13 (getShipmentByWarehouseId)

Impor AnOnlineShop_12.json untuk mengatasi pola akses 12 (getShipmentDetailsByShipmentId) dan 13 (). getShipmentByWarehouseId

Perhatikan bahwa entitas shipmentItem ditambahkan ke koleksi item pesanan pada tabel dasar agar dapat mengambil semua detail tentang pesanan dalam satu operasi kueri.

Tabel dasar:

Desain tabel dengan shipmentItem entitas dalam koleksi item pesanan untuk mendapatkan semua detail pesanan.

Kunci GSI1 partisi dan sortir telah digunakan untuk memodelkan one-to-many hubungan antara shipment danshipmentItem. Untuk menangani pola akses 12 (getShipmentDetailsByShipmentId), lakukan kueri GSI1 dengan GSI1-PK=shipmentId dan GSI1-SK=shipmentId.

GSI1:

GSI1desain dengan shipmentId sebagai partisi dan kunci sortir untuk mendapatkan detail pengiriman dengan ID pengiriman.

Kita perlu membuat another GSI (GSI2) untuk memodelkan one-to-many hubungan baru antara warehouse dan shipment untuk pola akses 13 (getShipmentByWarehouseId). Untuk menangani pola akses ini, lakukan kueri GSI2 dengan GSI2-PK=warehouseId dan GSI2-SK begins_with “sh#”.

GSI2:

GSI2desain dengan warehouseId dan shipmentId sebagai partisi dan sortir kunci untuk mendapatkan pengiriman berdasarkan gudang.

Langkah 11: Tangani pola akses 14 (getProductInventoryByWarehouseId) 15 (getInvoiceByCustomerIdForDateRange), dan 16 (getProductsByCustomerIdForDateRange)

Impor AnOnlineShop_13.json untuk menambahkan data yang terkait dengan kumpulan pola akses berikutnya. Untuk menangani pola akses 14 (getProductInventoryByWarehouseId), lakukan kueri GSI2 dengan GSI2-PK=warehouseId dan GSI2-SK begins_with “p#”.

GSI2:

GSI2desain dengan warehouseId dan productId sebagai partisi dan sortir kunci untuk mengatasi pola akses 14.

Untuk menangani pola akses 15 (getInvoiceByCustomerIdForDateRange), lakukan kueri GSI2 dengan GSI2-PK=customerId dan GSI2-SK between (i#date1, i#date2).

GSI2:

GSI2desain dengan customerId dan rentang tanggal faktur sebagai partisi dan kunci pengurutan untuk mengatasi pola akses 15.

Untuk menangani pola akses 16 (getProductsByCustomerIdForDateRange), lakukan kueri GSI2 dengan GSI2-PK=customerId dan GSI2-SK between (p#date1, p#date2).

GSI2:

GSI2desain dengan customerId dan rentang tanggal produk sebagai partisi dan sortir kunci untuk mengatasi pola akses 16
catatan

Di No SQL Workbench, facet mewakili pola akses data aplikasi yang berbeda untuk DynamoDB. Faset memberi Anda cara untuk melihat subset data dalam tabel tanpa harus melihat rekaman yang tidak memenuhi batasan faset. Faset dianggap sebagai alat pemodelan data visual, dan tidak ada sebagai konstruksi yang dapat digunakan di DynamoDB, karena aspek tersebut murni bantuan untuk memodelkan pola akses.

Impor AnOnlineShop_facets.json untuk melihat aspek untuk kasus penggunaan ini.

Semua pola akses dan bagaimana desain skema mengatasinya dirangkum dalam tabel di bawah ini:

Pola akses Tabel dasar//GSILSI Operasi Nilai kunci partisi Nilai kunci urutan
getCustomerByCustomerId Tabel dasar GetItem PK= customerId SK= customerId
getProductByProductId Tabel dasar GetItem PK= productId SK= productId
getWarehouseByWarehouseId Tabel dasar GetItem PK= warehouseId SK= warehouseId
getProductInventoryByProductId Tabel dasar Kueri PK= productId SK begins_with "w#"
getOrderDetailsByOrderId Tabel dasar Kueri PK= orderId
getProductByOrderId Tabel dasar Kueri PK= orderId SK begins_with "p#"
getInvoiceByOrderId Tabel dasar Kueri PK= orderId SK begins_with "i#"
getShipmentByOrderId Tabel dasar Kueri PK= orderId SK begins_with "sh#"
getOrderByProductIdForDateRange GSI1 Kueri PK= productId SK antara date1 dan date2
getInvoiceByInvoiceId GSI1 Kueri PK= invoiceId SK= invoiceId
getPaymentByInvoiceId GSI1 Kueri PK= invoiceId SK= invoiceId
getShipmentDetailsByShipmentId GSI1 Kueri PK= shipmentId SK= shipmentId
getShipmentByWarehouseId GSI2 Kueri PK= warehouseId SK begins_with "sh#"
getProductInventoryByWarehouseId GSI2 Kueri PK= warehouseId SK begins_with "p#"
getInvoiceByCustomerIdForDateRange GSI2 Kueri PK= customerId SK antara i#date1 dan i#date2
getProductsByCustomerIdForDateRange GSI2 Kueri PK= customerId SK antara p#date1 dan p#date2

Skema akhir toko online

Berikut adalah desain skema akhir. Untuk mengunduh desain skema ini sebagai JSON file, lihat Pola Desain DynamoDB di. GitHub

Tabel dasar

Skema akhir tabel dasar untuk toko online dengan atribut, seperti EntityName dan Nama.

GSI1

GSI1Skema akhir untuk tabel dasar toko online dengan atribut, seperti EntityType.

GSI2

GSI2Skema akhir untuk tabel dasar toko online dengan atribut, seperti EntityType.

Menggunakan No SQL Workbench dengan desain skema ini

Anda dapat mengimpor skema akhir ini ke No SQL Workbench, alat visual yang menyediakan pemodelan data, visualisasi data, dan fitur pengembangan kueri untuk DynamoDB, untuk mengeksplorasi lebih lanjut dan mengedit proyek baru Anda. Ikuti langkah-langkah berikut untuk memulai:

  1. Unduh No SQL Workbench. Untuk informasi selengkapnya, lihat Unduh No SQL Workbench untuk DynamoDB.

  2. Unduh file JSON skema yang tercantum di atas, yang sudah dalam format model No SQL Workbench.

  3. Impor file JSON skema ke No SQL Workbench. Untuk informasi selengkapnya, lihat Mengimpor model data yang ada.

  4. Setelah Anda mengimpor ke NOSQL Workbench, Anda dapat mengedit model data. Untuk informasi selengkapnya, lihat Mengedit model data yang ada.

  5. Untuk memvisualisasikan model data Anda, menambahkan data sampel, atau mengimpor data sampel dari CSV file, gunakan fitur Visualizer Data dari No Workbench. SQL