您位於此處:
在 Amazon DynamoDB 中一對多和多對多關係的限定詞範例
企業會儲存和保留數百萬客戶的細微交易詳細資料,因此資料量達到數十億筆記錄。在此範例中,Salesforce 是核心客戶資訊的記錄系統,且針對規模原因,所有客戶訂單的詳細資料都會儲存在 Amazon DynamoDB 中。
在這種標準的關係模型中,客戶會在 Salesforce 中儲存為帳戶。訂單、訂單項目與產品會儲存在 Amazon DynamoDB 中,並在 Salesforce 中虛擬化為外部物件。部署此類解決方案可讓企業的銷售人員和客戶服務工作人員取得客戶訂單歷程記錄的完整存取權。
由於 Amazon DynamoDB 是 NoSQL 資料庫,且不支援 JOIN 查詢,因此建議設計作法是將業務作業的所有相關資訊儲存在單一 DynamoDB 表格中。若要區分產品而非訂單或訂單項目,您必須使用其他策略。另一個設計作法是識別存取模式,並確保常用作業可透過單一查詢執行,進而在使用大型表格下保持高效能。以下是根據建議設計作法所建立的範例表格。
| PK | SK | 客戶 | 訂單日期 | 總量 | 運輸 | 數量 | 價格 | 小計 | 名稱 |
|---|---|---|---|---|---|---|---|---|---|
| 1012 | ORDER | A123 | 2022-07-12T14:33:14Z | 25.75 | 5.75 | ||||
| 1012 | product#1 | 2 | 5.00 | 10.00 | 小工具 X | ||||
| 1012 | product#2 | 1 | 15.00 | 15.00 | 小工具 Y | ||||
| 1 | PRODUCT | 5.00 | 小工具 X | ||||||
| 2 | PRODUCT | 15.00 | 小工具 Y | ||||||
| 3 | PRODUCT | 20.00 | 小工具 Z | ||||||
| 1013 | ORDER | B456 | 2022-07-15T18:05:45Z | 9.25 | |||||
| 1013 | product#1 | 49.25 | 1 | 5.00 | 5.00 | 小工具 X | |||
| 1013 | product#2 | 1 | 15.00 | 15.00 | 小工具 Y | ||||
| 1013 | product#3 | 1 | 20.00 | 20.00 | 小工具 Z |
Amazon DynamoDB 會根據相鄰清單設計模式,管理訂單和訂單項目之間的一對多關係。此模式允許透過單一查詢擷取訂單和其所有訂單項目。例如,部署在 AWS 上的訂單管理應用程式會執行以下一個查詢,並呈現訂單的單一回條。基於此目的,產品名稱會在結帳時複製到訂單項目中。表格設計的目標並非完全正規化資料,如同關係資料庫設計。
SELECT * FROM "OrderManagement" WHERE "pk" =
"1012"
瞭解 Amazon DynamoDB 表格的結構後,我們可以在 Salesforce 中建立限定詞,使 DynamoDB 的 Salesforce Connect 轉接器可以分隔產品、訂單和訂單項目。排序索引鍵 (SK) 會連同其他限定詞元素,一起用於區分項目 (類似「記錄類型」)。針對產品和訂單,排序索引鍵包含 PRODUCT 或 ORDER 的靜態值作為分隔字元。由於靜態值,因此會簡化某些作業。
管理訂單的限定詞
訂單的分割索引鍵 (PK) 是數字,但是若欄位是字串,相對於 Amazon DynamoDB 而言這會更有彈性。因此,即使屬性類型仍為字串,「順序」的限定詞也會透過規則運算式尋找數值。以下是「訂單」限定詞的 JSON 程式碼片段。
{
"tableName": "OrderManagement",
"columns": {
"pk": {
"postFilter": "^[0-9]+$", // regex matching integers
"type": "S" // attribute must be a String
},
"sk": {
"values": [
{
"definition": "\"ORDER\"" // // matches the static value "ORDER"
}
]
}
}
}將分割索引鍵 (PK) 欄位對應至 Salesforce 中的訂單編號 (或一個類似的欄位) 是很有幫助的,但排序索引鍵 (SK) 不需要對應至訂單物件上的欄位。其不會提供任何業務價值給使用者。
管理產品的限定詞
根據與「訂單」相同的方法,以下為「產品」限定詞的 JSON 程式碼片段。
{
"tableName": "OrderManagement",
"columns": {
"pk": {
"postFilter": "^[0-9]+$", // regex matching integers
"type": "S" // attribute must be a String
},
"sk": {
"values": [
{
"definition": "\"PRODUCT\"" // // matches the static value "PRODUCT"
}
]
}
}
}「產品」與「訂單」在 Amazon DynamoDB 表格中皆有其他屬性,必須對應至外部物件欄位。由於這些屬性不需要任何條件或翻譯,因此不需要顯示在限定詞中。Amazon DynamoDB 適用的 Salesforce Connect 轉接器會將這些其他屬性對應至欄位類型。例如:
- ORDERDATE 字串屬性會轉換為 DateTime 欄位類型 (如果其為 ISO 8601 格式)。
- PRICE 與 TOTAL 數字屬性已轉換為針對 Salesforce 組織設定的「貨幣」類型。
管理訂單項目的限定詞
限定詞可讓您使用 Salesforce 公式建立不存在於 Amazon DynamoDB 中的虛擬屬性。當您定義外部物件的欄位時,這類屬性可以參照為外部欄名稱。
「訂單項目」的排序索引鍵 (SK) 包含產品的識別碼,以及靜態字首 product#,以清楚指出此值參照產品。
相對於 Amazon DynamoDB 而言,這個範例所用的方法能夠結合 PK 和 SK 並順利運作。分割索引鍵與排序索引鍵在一起,形成項目的唯一複合索引鍵。當套用下列限定詞時,特定訂單項目的外部識別碼在 Salesforce 中會採用 1012-1 的格式 (以連字號分隔 PK 和 SK)。外部識別碼會對應至 Salesforce 識別碼,以啟用可供外部物件使用的 Salesforce Platform 功能。
以下為限定詞的 JSON 片段,此限定詞利用所述的方法,並使用公式來移除字首並提升可讀性。
{
"tableName": "OrderManagement",
"columns": {
"pk": {
"postFilter": "^[0-9]+$", // regex matching integers
"type": "S" // attribute must be a String
},
"sk": {
"filter": "products#%" // prefixed with "products#"
},
"productCode": {
"virtual": true, // productCode does not exist in DynamoDB
"values": [
{
"definition": "RIGHT(sk, LEN(sk) - FIND(\"#\", sk))" // Formula parses out the prefix
}
]
}
}
}當您建立「訂單項目」中「產品」的外部對應時,請使用虛擬屬性 productCode 作為外部欄名稱。「訂單」的外部對應會使用 PK 作為外部欄名稱,且您可以使用此欄建立多對多關係。
