[英]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 對於低流量應用程序和/或測試環境來說很便宜,但是為了保持這些費用不變,您可以:
在本地開發/測試和 CI 構建期間使用dynamodb local
為您的表選擇預置容量模式(您可能會發現它的免費層很有趣)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.