DynamoDB 中的週期性付款結構描述設計 - Amazon DynamoDB

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

DynamoDB 中的週期性付款結構描述設計

週期性付款商業使用案例

此使用案例將說明如何使用 DynamoDB 實作週期性付款系統。資料模型具有以下實體:帳戶訂閱收據。我們的使用案例包括以下細節:

  • 每個帳戶可以有多個訂閱

  • 需要處理下一次付款時,訂閱會有 NextPaymentDate,傳送電子郵件提醒給客戶時,則會有 NextReminderDate

  • 有一個代表訂閱的項目會儲存並在付款處理完成時更新 (平均項目大小約為 1KB,輸送量取決於帳戶訂閱的數目)

  • 付款處理器也會建立收據,做為儲存在資料表中程序的一部分,並使用 TTL 屬性設定為在一段時間後過期

週期性付款實體關係圖

這是我們將用於週期性付款系統結構描述設計的實體關係圖 (ERD)。

顯示ERD實體的重複付款系統:帳戶、訂閱和收據。

週期性付款系統存取模式

這些是我們針對週期性付款系統結構描述設計考量的存取模式。

  1. createSubscription

  2. createReceipt

  3. updateSubscription

  4. getDueRemindersByDate

  5. getDuePaymentsByDate

  6. getSubscriptionsByAccount

  7. getReceiptsByAccount

週期性付款結構描述設計

通用名稱 PK 和 SK 用於金鑰屬性,以允許在相同資料表中儲存不同類型的實體,例如帳戶、訂閱和收據實體。使用者首先建立訂閱,這代表使用者同意在每個月的同一天支付一定金額來換取使用產品。使用者可以選擇要在每個月的哪一天處理付款。另外還會在處理付款之前傳送提醒。應用程式的運作方式是每天執行兩個批次任務:一個批次任務傳送當天應送出的提醒,另一個批次任務則處理當天應付的任何款項。

步驟 1:位址存取模式 1 (createSubscription)

存取模式 1 (createSubscription) 用於初次建立訂閱,並設定包括 SKUNextPaymentDateNextReminderDate 和 PaymentDetails 等詳細資訊。此步驟僅顯示具有一個訂閱的一個帳戶的資料表狀態。項目集合中可以有多個訂閱,因此這是一個 one-to-many關係。

顯示帳戶訂閱詳細資訊的資料表設計。

步驟 2:位址存取模式 2 (createReceipt) 和 3 (updateSubscription)

存取模式 2 (createReceipt) 用於建立收據項目。每個月處理付款後,付款處理器會將收據寫回基底資料表。項目集合中可能有多個收據,因此這是一個 one-to-many關係。付款處理器也會更新訂閱項目 (存取模式 3 (updateSubscription)) 以更新下個月的 NextReminderDate 或 NextPaymentDate

接收詳細資訊和訂閱項目更新,以顯示下一個訂閱提醒日期。

步驟 3:位址存取模式 4 (getDueRemindersByDate)

應用程式會分批處理當天的付款提醒。因此,應用程式需要存取不同維度的訂閱:日期,而非帳戶。這是全域次要索引 (GSI) 的良好使用案例。在此步驟中,我們會新增索引 GSI-1,該索引使用 NextReminderDate作為GSI分割區金鑰。我們不需要複寫所有項目。GSI 這是稀疏索引,不會複寫收據項目。我們也不需要對應所有的屬性,只需要包括屬性的子集。下方影像顯示了 GSI-1 的結構描述,它提供了應用程式傳送提醒電子郵件所需的資訊。

GSI-1 結構描述,其中包含詳細資訊,例如電子郵件地址,應用程式需要傳送提醒電子郵件。

步驟 4:位址存取模式 5 (getDuePaymentsByDate)

應用程式會分批處理當天的付款,採取與處理提醒相同的方式。我們在此步驟GSI-2中新增 ,並使用 NextPaymentDate作為GSI分割區金鑰。我們不需要複寫所有項目。GSI 這是稀疏索引,因為不會複寫收據項目。下方影像顯示了 GSI-2 的結構描述。

GSI-2 結構描述,其中包含處理付款的詳細資訊。 NextPaymentDate 是 GSI-2 的分割區金鑰。

步驟 5:位址存取模式 6 (getSubscriptionsByAccount) 和 7 (getReceiptsByAccount)

應用程式可以使用以帳戶識別符 (PK) 為目標的基礎資料表上的查詢來擷取帳戶的所有訂閱,並使用範圍運算子來取得以「SUB#」SK開頭的所有項目。應用程式也可以使用相同的查詢結構,使用範圍運算子擷取所有收據,以取得以「REC#」SK開頭的所有項目。這樣就能滿足存取模式 6 (getSubscriptionsByAccount) 和 7 (getReceiptsByAccount)。應用程式使用這些存取模式讓使用者看見過去六個月內自己目前的訂閱及過去的收據。在此步驟中,我們不會變更資料表結構描述,而且可以在下面看到我們如何單獨鎖定存取模式 6 (getSubscriptionsByAccount) 中的訂閱項目。

基礎資料表上的查詢操作結果。它會顯示特定帳戶的訂閱。

下表摘要整理了所有存取模式,以及結構描述設計處理這些模式的方式:

存取模式 基礎資料表/GSI/LSI 作業 分割區索引鍵值 排序索引鍵值
createSubscription 基本資料表 PutItem ACC#account_id SUB#<SUBID>#SKU<SKUID>
createReceipt 基本資料表 PutItem ACC#account_id REC#<RecieptDate>#SKU<SKUID>
updateSubscription 基本資料表 UpdateItem ACC#account_id SUB#<SUBID>#SKU<SKUID>
getDueRemindersByDate GSI-1 Query <NextReminderDate>
getDuePaymentsByDate GSI-2 Query <NextPaymentDate>
getSubscriptionsBy帳戶 BASE 資料表 Query ACC#account_id SK start_with “SUB#”
getReceiptsBy帳戶 BASE 資料表 Query ACC#account_id SK start_with “REC#”

週期性付款最終結構描述

以下是最終結構描述設計。若要將此結構描述設計下載為 JSON 檔案,請參閱 上的 DynamoDB 範例 GitHub。

基底資料表

顯示帳戶資訊及其訂閱和接收詳細資訊的基礎資料表設計。

GSI-1

GSI-1 個具有訂閱詳細資訊的結構描述,例如電子郵件地址 和 NextPaymentDate。

GSI-2

GSI-2 結構描述,包含付款詳細資訊,例如 PaymentAmount 和 PaymentDay。

使用此結構描述設計的無SQL工作台

您可以將此最終結構描述匯入 NoSQL Workbench ,這是一種視覺化工具,可為 DynamoDB 提供資料建模、資料視覺化和查詢開發功能,以進一步探索和編輯您的新專案。請依照下列步驟以開始使用:

  1. 下載無SQL Workbench。如需詳細資訊,請參閱不下載適用於 DynamoDB 的SQL工作台

  2. 下載上述結構描述檔案,該檔案已採用 NoSQL Workbench JSON 模型格式。

  3. 將JSON結構描述檔案匯入 NoSQL Workbench。如需詳細資訊,請參閱匯入現有的資料模型

  4. 匯入 NOSQL Workbench 後,您可以編輯資料模型。如需詳細資訊,請參閱編輯現有的資料模型

  5. 若要視覺化您的資料模型、新增範例資料,或從CSV檔案匯入範例資料,請使用無SQL工作台的 Data Visualizer 功能。