我想了解DynamoDB上的最佳實踐。我看到DynamoDB有兩種PK類型:DynamoDB:何時使用什麼PK類型?
- 散列鍵
- 哈希和範圍鍵
從我讀,似乎後者是像前,但支持排序和的索引有限的一組列。
所以我的問題是爲什麼只使用沒有範圍鍵的散列鍵?只有當表格沒有被搜索時,它是一個可行的選擇嗎?
對於什麼時候使用什麼鍵類型有一些通用的指導方針也很棒。我已閱讀過幾本指南(包括亞馬遜自己的DynamoDB文檔),但沒有一篇似乎直接解決了這個問題。
感謝
我想了解DynamoDB上的最佳實踐。我看到DynamoDB有兩種PK類型:DynamoDB:何時使用什麼PK類型?
從我讀,似乎後者是像前,但支持排序和的索引有限的一組列。
所以我的問題是爲什麼只使用沒有範圍鍵的散列鍵?只有當表格沒有被搜索時,它是一個可行的選擇嗎?
對於什麼時候使用什麼鍵類型有一些通用的指導方針也很棒。我已閱讀過幾本指南(包括亞馬遜自己的DynamoDB文檔),但沒有一篇似乎直接解決了這個問題。
感謝
其關鍵應用可以歸結爲你的使用案例和數據要求特定場景的選擇。例如,如果您正在存儲用戶會話數據,那麼使用範圍鍵可能沒有太大意義,因爲每個記錄都可以由GUID引用,並且可以直接訪問而不需要分組。一般而言,一旦你知道會話ID,你只需要通過密鑰查詢特定的項目。另一個例子可能是存儲用戶帳戶或個人資料數據,每個用戶都有自己的,你很可能會直接訪問它(通過用戶ID或其他)。
但是,如果你存儲訂單項目那麼範圍主要更有道理,因爲你可能想通過檢索其訂購分組的項目。
在數據模型方面,散列鍵可以唯一從表中標識記錄,而範圍主要可以任意地使用到組和通常一起檢索排序幾個記錄。例如:如果要定義一個聚合存儲訂單項目,在訂單標識可能是你散列鍵和OrderItemId的範圍主要。無論何時您想從特定訂單中搜索訂單項目,您只需通過哈希鍵(訂單ID)進行查詢,並且您將獲得所有訂單項。
您可以在下面找到一個正式的定義爲使用這兩個鍵:
「使用範圍主要複合散列鍵允許開發人員創建 主鍵是兩個屬性的複合體, 'hash 屬性'和'範圍屬性'。當查詢關鍵字 時,哈希屬性需要唯一匹配,但可以爲範圍屬性指定範圍 操作:例如,所有訂單 從沃納在過去24小時內,或由個人 玩家在過去24小時玩過的所有遊戲。」 [VOGELS]
所以範圍主要增加了分組能力的數據模型然而,使用這兩個按鍵也會對存儲模式的含義:
「迪納摩使用一致的哈希值,以在其 副本的分區其密鑰空間確保均勻的負載分配。均勻的關鍵 分佈可以幫助我們實現均勻的負荷分佈假設 鍵的訪問分佈是極不平衡。」 [DDB-SOSP2007]
不僅散列鍵允許唯一標識備案,也就是確保負載分配的機制範圍鍵(當使用時)有助於指示將主要一起取回的記錄,因此,存儲也可以針對這種需要進行優化。您的數據是您設計過程中最關鍵的方面之一,它直接影響您的應用程序的性能,規模和成本。
腳註:
數據模型,通過它,我們看待和處理我們的數據模型。它描述了我們如何與數據庫中的數據交互[FOWLER]。換句話說,它是你如何抽象你的數據模型,你分組實體的方式,你選擇的屬性作爲主鍵等
存儲模型描述了數據庫如何在內部存儲和操作數據[FOWLER ]。雖然你不能直接控制這個,但你當然可以通過了解數據庫如何在內部工作來優化數據的檢索或寫入方式。
謝謝。您的回答非常全面 – user1836155
歡迎您。 – bsd
我再讀一次。我有一個問題是爲什麼散列鍵用於負載平衡而不是範圍鍵?我的印象是範圍鍵在標準的基於SQL的分片設計中像分配鍵那樣工作 – user1836155