2016-04-27 41 views
1

我在DynamoDB中有Messages表。它有四列發件人,時間戳,郵件,收件人。我想知道不是使用四列中的任何一列創建分區鍵,爲什麼不創建另一個列用於分區目的連接發件人&時間戳&收件人。DynamoDB中分區鍵的優化

因此,這列將保存數據,如JohnSmithID1461754484307SallyMcDonaldID。

通過這樣做,當搜索來自特定發件人&收件人組合的郵件時,我可以通過使用此列使用查詢來查詢(如以&結尾)。還有其他一些利用這一欄的方法。

問題1.我被過度試圖使用一列,而不是散佈我查詢到的幾個列在這裏事情複雜?

問題2.採取這個方向是否有明顯的性能好處?如果我消除列SenderId & RecipientID數據大小的目的

問題3:這是設計模式不僅值得嗎? (我需要時間戳排序鍵列)

回答

4

我認爲你必須再次how DynamoDB partition keys work閱讀。您無法在分區鍵上執行「開頭」或「結束」等查詢,因爲您必須爲查詢提供完整的分區鍵。您只能在排序鍵上提供這樣的條件(但請注意,函數有begins_with函數,但是沒有ends_with函數)。

您的想法可能基於使用掃描而不是查詢,但(關於問題2),這會導致更多的使用容量和性能不佳,因爲DynamoDB必須查看錶中的每個項目。如果你想有更多的查詢靈活性,你可以定義一個或多個secondary indexes

你可以自己回答問題3:DynamoDB量是相當昂貴的,但我們談論的是每個條目也許20字節的差異。如果您最終可能會在表中輸入> 10.000.000個條目,則可能會成爲問題,否則請忽略它。

1

您的特定示例將不起作用,因爲查詢時您無法在分區鍵上具有條件。您只能在Sort Key上有這樣的條件。

雖然這種結構有時可能派上用場。例如,如果您有三個要查詢的屬性。 DynamoDB允許最多兩個(分區鍵+排序鍵),因此在這種情況下,其中一個可以是兩個或更多屬性的組合。

+0

先生,是ü說,如果我想用三個濾波器參數,我不會因爲有dynamodb表做查詢,儘管有擺在所有三個各自列二級指標? – shle2821

+0

@ shle2821我在談論一個場景,當你需要查詢一個可以由三個或更多屬性組合定義的項目時。 DynamoDB允許使用最多兩個屬性(分區鍵+排序鍵)形成主鍵。更多信息[here](http://stackoverflow.com/questions/32620215/3-fields-composite-primary-key-unique-item-in-dynamodb) –

+0

感謝您的信息。那麼,讓我問你一下。單獨留下主鍵時,我會根據senderID&timestamp&recipientID創建一個排序鍵?因此,用戶的設備將三個屬性連接在一起併發送到DynamoDB。由於它是一個排序鍵,我可以用「begin with」,「end with」等來查詢。您對這種設計模式有什麼看法? – shle2821