簡體   English   中英

DynamoDB - 如何通過非主鍵查詢

[英]DynamoDB - how to query by something that is not the primary key

所以,我在 DybamoDB 上有一個具有這種結構的表:

- userId as the primarykey (it's a uuid)
- email
- hashedPassword

當有人注冊時,我想查明是否已經有人在使用該 email。

這應該很容易,但據我所知,除非您使用主鍵作為參數或排序鍵(而且我不確定將 email 設為排序鍵是否有意義,否則您無法在 DynamoDB 上查詢)。

我發現的另一種方法是使用全局二級索引,它幾乎是您使用另一個字段作為主要類型創建的索引表,但這是可計費的,因為我仍在開發和測試我不想擁有花費。

有人有其他選擇嗎? 還是我錯了,還有另一種方法嗎?

像其他答案一樣,我也認為GSI 是這里的最佳選擇

但我還想補充一點,由於 DynamoDB 的搜索功能非常有限,因此將 DynamoDB 與其他東西一起用於此目的並不少見。 AWS 博客中描述了一個這樣的用例:

DynamoDB 的主要查詢功能以使用主鍵的查找為中心。 但是,有時需要更豐富的查詢功能。 使用 Elasticsearch 等搜索引擎為 DynamoDB 表的內容編制索引將允許進行全文搜索。

顯然,我不建議在您的場景中使用 ES 而不是 GSI。 但值得了解的是,DynamoDB 可以並且經常與其他服務一起使用以擴展其搜索功能。

即使您將email作為sort key ,同時將userId作為primary key ,也不能僅使用電子郵件進行查詢(除非是scan操作)。 您不想使用掃描來查看表中是否存在 email。 這就像通過掃描整個表來迭代每個值。

我認為您最好的選擇是global secondary index 另一種選擇是創建一個僅包含email值的新表,但在這種情況下,您必須寫入/維護多個表,這是不必要的。

我發現的另一種方法是使用全局二級索引,它幾乎是您使用另一個字段作為主要類型創建的索引表,但這是可計費的,因為我仍在開發和測試我不想擁有花費。

正如@Ersoy 所說,GSI 是合法的解決方案,即使它會增加消耗的寫入單位。

Dynamodb 對於低流量應用程序和/或測試環境來說很便宜,但是為了保持這些費用不變,您可以:

  1. 在本地開發/測試和 CI 構建期間使用dynamodb local

  2. 為您的表選擇預置容量模式(您可能會發現它的免費層很有趣)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM