2017-03-16 49 views
0

我是DynamoDB的新手,我發現很難考慮如何決定我的分區密鑰。我正在使用我的用例的精簡版本:在Dynamo DB中爲GSI確定分區密鑰

我有一個屬性,它是一個布爾值=> B 對於給定的ID,我需要返回所有的數據。該ID是X或Y屬性。對於給定的ID,如果B爲真,我需要讀取屬性X,否則Y.

在插入表格時,我知道B的值,因此我可以用X或Y填充它,具體取決於它的價值。

但是在讀取時,我只是給了一個ID,我需要弄清楚它是存在於X列還是Y列(我不會在輸入中獲得B的值)。

在RDBMS中,我可以運行一個查詢,如select * from tab where (B == true && X == ID) || (B==false && Y == ID)

我認爲在DynamoDB中創建一個GSI將是在Dynamo中解決這個問題的方法。但是我無法找出解決這個問題的最佳方式。我能得到建議嗎?

+0

以防萬一問,你有X和Y的任何記錄規定? – xtx

+0

@xtx是的,可能存在指定X和Y的情況。但是,如果B爲真,則只能從中讀取X. – user1692342

+0

對於給定的ID,布爾B可以同時使用'true'和'false'值(用於不同的記錄)? – xtx

回答

-1

不知道我是否正確使用了用例,但爲什麼不在插入行時基於值B交換目標列。

考慮以下輸入:

+-----+------+--------+ 
| X | Y | B | 
+-----+------+--------+ 
| ID1 | ID2 | true | 
+-----+------+--------+ 
| ID3 | ID4 | true | 
+-----+------+--------+ 
| ID5 | ID6 | false | 
+-----+------+--------+ 
| ID7 | ID8 | false | 
+-----+------+--------+ 

如果你存儲這樣的值:

+-----------+-------------------------+ 
| id  |  opposite id  | 
|(hash key) | or whatever you call it | 
+-----------+-------------------------+ 
| ID1  |  ID2    | 
+-----------+-------------------------+ 
| ID3  |  ID4    | 
+-----------+-------------------------+ 
| ID6  |  ID5    | 
+-----------+-------------------------+ 
| ID8  |  ID7    | 
+-----------+-------------------------+ 

這種方式,而由IDXXX值獲取的項目,你將需要執行一個查詢在單欄id上。


UPD:注意,如果你的使用情況允許具有一個相同的ID,那麼你需要一個另一個領域擔任各種重要多個記錄。無論你是否像上面顯示的那樣交換列,情況都是如此。

-1

按照AWS DynamoDB博客文章:

選擇合適的DynamoDB分區鍵是在 設計和建築上 DynamoDB的頂部可擴展和可靠的應用程序的一個重要步驟。

什麼是分區密鑰?

DynamoDB支持兩種類型的主密鑰:

分區鍵:也稱爲散列鍵,分區鍵由單一屬性的。 DynamoDB中的屬性在很多方面與其他數據庫系統中的字段或列相似。

分區鍵和排序鍵:這種類型的鍵被稱爲複合主鍵或散列範圍鍵,由兩個屬性組成。 的第一個屬性是分區鍵,第二個屬性是 排序鍵。這裏有一個例子:

enter image description here

爲什麼需要分區鍵?

DynamoDB將數據存儲爲屬性組(稱爲項目)。項目 與其他數據庫系統中的行或記錄類似。 DynamoDB 根據主鍵值( 必須唯一)來存儲和檢索每個項目。項目分佈在10 GB存儲單元中, 稱爲分區(DynamoDB內部的物理存儲)。每個表 都有一個或多個分區,如圖2所示。有關更多 的信息,請參閱DynamoDB 開發人員指南中的瞭解分區行爲。

DynamoDB將分區鍵的值用作內部 散列函數的輸入。散列函數的輸出決定了將存儲項目的分區。每個項目的位置是由其分區密鑰的散列值確定的 。

具有相同分區鍵的所有項目都存儲在一起,併爲 複合分區鍵,通過排序關鍵字值進行排序。 DynamoDB 將按照排序鍵拆分分區,如果集合大小比10 GB大 。

enter image description here

建議的分區鍵

使用高基數的屬性。這些是具有像電子郵件ID,employee_no每個項目, 客戶ID,會話ID 不同值的屬性,有序的,等等。

使用複合屬性。如果符合您的訪問模式,請嘗試將多個屬性組合爲 作爲唯一鍵。例如, 考慮使用customerid + productid + countrycode作爲 分區鍵和order_date作爲排序鍵的訂單表。

緩存中受歡迎的項目當有讀流量的高容量。 緩存充當低通濾波器,可防止讀取來自陷入分區的流行項目異常的 。例如,考慮具有產品交易信息的表 。預計在黑色星期五或網絡星期一 等主要銷售活動期間,某些交易將比其他交易更受歡迎 。

從寫重 用例在預定的範圍添加的隨機數/數字。如果您希望分區密鑰的寫入量很大,則 將使用額外的前綴或後綴(來自預定義的 範圍的固定數字,例如1-10),並將其添加到分區密鑰中。例如, 考慮一張發票交易表。單個發票可以包含每個客戶端的數千筆交易。

更多@