2012-12-10 87 views
1

假設我們有許多數據表,其結構爲時間戳(哈希) - 值對,其中值可以是溫度或其他類型的各種測量數據。爲了得到某些值的時間戳,我們可以用值(散列) - 時間戳(範圍)建立一個二級索引,但是如果我們想用像GT,LT,BETWEEN這樣的比較操作來查詢該值來獲得一個時間戳值的範圍?DynamoDB:通過比較查詢非鍵值

顯然,我想避免使用掃描。我唯一想到的是使用一個虛擬散列鍵並將值+時間戳放入範圍屬性中,但我猜測這有它自己的問題(與掃描相比,更好或更差)。

有沒有更好的解決方案,或者可以使用DynamoDB來完成嗎?

回答

0

您需要知道HASH,然後才能在RANGE上執行查詢。爲了解決這個問題,您需要對錶格進行非規範化處理,即使用相反的鍵創建一個副本。雖然這看起來有點痛苦,但它是時間關鍵價值商店所有性能優勢所需的權衡之一。

這種情況下的示例: 這兩個鍵完全是隨機的,那麼您運氣不好。您可以嘗試使用每月的時間戳,而不是將您的HASH設置爲虛擬值,這樣您應該始終能夠務實地制定哈希應該是什麼。然後你也可以將範圍設置爲由連字符(即timestamp-value)分隔的兩個值的組合,然後在非規格化表中value-timestamp,這樣你就可以在沒有性能影響的情況下使用比較運算符。

+0

反規範化就是我所說的「建立二級索引」。但是,這不允許我查詢值,只能得到。就像上面所說的,我曾經想過在範圍鍵中使用一個常用的散列鍵(一個'虛擬'),用於查詢的範圍鍵中的值+時間戳,但我不確定它的性能或其它可能存在的問題(分區)我正在尋找替代品。非規範化不是問題(至少現在)。 – user1597701

+0

如果他們都是完全隨機的,那麼我認爲你運氣不好。建議:不要將你的HASH設置爲虛擬值,而應該使用每月的時間戳,這樣你應該總是能夠務實地制定哈希應該是什麼。您也可以查看將範圍設置爲用連字符(即timestamp-value)分隔的兩個值,然後在非規格化表中value-timestamp,這樣您就可以使用GT,LT和BETWEEN運算符而無需執行性能擊中。 – greg

+0

雖然不太喜歡不得不細分數據,但我想這是我必須做出的權衡來實現這一點。 – user1597701