2015-11-14 50 views
1

我最近開始學習DynamoDB和創建表「評論」具有以下屬性(與DynamoDB類型一起):主鍵和GSI設計在DynamoDB

productId - String 
username - String 
feedbackText - String 
lastModifiedDate - Number (I'm storing the UNIX timestamp) 
createdDate - Number 
active - Number (0/1 value, 1 for all records by default) 

以下是我所期望的查詢對這個表運行:

1. Get all reviews for a 'productId' 
2. Get all reviews submitted by a 'username' (sorted asc/desc by lastModifiedDate) 
3. Get N most recent reviews across products and users (using lastModifiedDate) 
爲了能夠運行這些查詢我創建的「評論」表中的下列

現在:

1. A Primary Key with 'productId' as the Hash Key and 'username' as the Range Key 
2. A GSI with 'username' as the Hash Key and 'lastModifiedDate' as the Range Key 
3. A GSI with 'active' as the Hash Key and 'lastModifiedDate' as the Range Key 

最後一個索引有點瑕疵,因爲我只在表中引入了'active'屬性,因此所有記錄的值都可以是'1',我可以將它用作GSI的Hash Key。

我的問題很簡單。我已經閱讀了一些關於DynamoDB的內容,這是我能想到的最好的設計。我想問問是否有更好的主鍵/索引設計,我可以在這裏使用。如果在DynamoDB中有一個概念,我可能錯過了這個特定用例可能會有所幫助。謝謝!

回答

0

我覺得你的設計是正確的:

  • 點2表鍵,GSI將覆蓋你的前兩個查詢。這裏沒有驚喜,這是非常標準的。
  • 我認爲你的最後一次查詢的設計是正確的,即使有點黑客,並且可能不是性能最好的。考慮到DynamoDB限制,您需要使用相同的哈希鍵值。您希望能夠按順序獲取值,因此您需要使用範圍鍵。由於您只想使用範圍鍵,因此您需要爲散列鍵提供相同的值。你應該注意到,當你的表增長到很多分區時,這個可能不能很好地擴展(雖然我沒有任何數據來支持這個語句)。