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.
Pola akses
Ini adalah pola akses yang akan dipertimbangkan saat menggunakan DynamoDB sebagai penyimpanan data untuk toko online.
-
getCustomerByCustomerId
-
getProductByProductId
-
getWarehouseByWarehouseId
-
getProductInventoryByProductId
-
getOrderDetailsByOrderId
-
getProductByOrderId
-
getInvoiceByOrderId
-
getShipmentByOrderId
-
getOrderByProductIdForDateRange
-
getInvoiceByInvoiceId
-
getPaymentByInvoiceId
-
getShipmentDetailsByShipmentId
-
getShipmentByWarehouseId
-
getProductInventoryByWarehouseId
-
getInvoiceByCustomerIdForDateRange
-
getProductsByCustomerIdForDateRange
Evolusi desain skema
MenggunakanTidak ada SQL Workbench untuk DynamoDB, import AnOnlineShop_1.jsonAnOnlineShop
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.jsongetCustomerByCustomerId
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.jsongetProductByProductId
) 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.jsongetWarehouseByWarehouseId
) 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:
Langkah 4: Tangani pola akses 4 (getProductInventoryByProductId
)
Impor AnOnlineShop_5.jsongetProductInventoryByProductId
warehouseItem
Entitas 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:
Langkah 5: Tangani pola akses 5 (getOrderDetailsByOrderId
) dan 6 (getProductByOrderId
)
Tambahkan beberapa lagicustomer
,product
, dan warehouse
item ke tabel dengan mengimpor AnOnlineShop_6.jsonorder
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:
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:
Langkah 6: Tangani pola akses 7 (getInvoiceByOrderId
)
Impor AnOnlineShop_8.jsoninvoice
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:
Langkah 7: Tangani pola akses 8 (getShipmentByOrderId
)
Impor AnOnlineShop_9.jsonshipment
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:
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.jsonorderItem
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:
GSI1:
Langkah 9: Tangani pola akses 10 (getInvoiceByInvoiceId
) dan 11 (getPaymentByInvoiceId
)
Impor AnOnlineShop_11.jsongetInvoiceByInvoiceId
) 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-PK
dan 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:
Langkah 10: Tangani pola akses 12 (getShipmentDetailsByShipmentId
) dan 13 (getShipmentByWarehouseId
)
Impor AnOnlineShop_12.jsongetShipmentDetailsByShipmentId
) 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:
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:
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:
Langkah 11: Tangani pola akses 14 (getProductInventoryByWarehouseId
) 15 (getInvoiceByCustomerIdForDateRange
), dan 16 (getProductsByCustomerIdForDateRange
)
Impor AnOnlineShop_13.jsongetProductInventoryByWarehouseId
), lakukan kueri GSI2
dengan GSI2-PK=warehouseId
dan GSI2-SK
begins_with “p#”
.
GSI2:
Untuk menangani pola akses 15 (getInvoiceByCustomerIdForDateRange
), lakukan kueri GSI2
dengan GSI2-PK=customerId
dan GSI2-SK between
(i#date1, i#date2)
.
GSI2:
Untuk menangani pola akses 16 (getProductsByCustomerIdForDateRange
), lakukan kueri GSI2
dengan GSI2-PK=customerId
dan GSI2-SK between
(p#date1, p#date2)
.
GSI2:
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
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
Tabel dasar
GSI1
GSI2
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:
-
Unduh No SQL Workbench. Untuk informasi selengkapnya, lihat Unduh No SQL Workbench untuk DynamoDB.
-
Unduh file JSON skema yang tercantum di atas, yang sudah dalam format model No SQL Workbench.
-
Impor file JSON skema ke No SQL Workbench. Untuk informasi selengkapnya, lihat Mengimpor model data yang ada.
-
Setelah Anda mengimpor ke NOSQL Workbench, Anda dapat mengedit model data. Untuk informasi selengkapnya, lihat Mengedit model data yang ada.
-
Untuk memvisualisasikan model data Anda, menambahkan data sampel, atau mengimpor data sampel dari CSV file, gunakan fitur Visualizer Data dari No Workbench. SQL