我在DynamoDB中有一个表:
Id: int, hash key
Name: string
(还有更多列,但我省略了它们)
通常我只是按照其ID来提取和更新项目,并且此架构可以正常工作。
但是,其中一个要求是根据名称设置一个自动完成下拉框。我希望能够在此DynamoDB表中查询以查询字符串开头的Name列的所有项目。
解决这个问题的SQL方法是在Name上添加一个索引并编写一个像 SELECT Id FROM table WHERE Name LIKE'query%'这样的查询,但我无法弄清楚DynamoDB友好的方式。
我考虑了几种方法来解决这个问题:
这个问题有一个简单的解决方案吗?
答案 0 :(得分:5)
今天DynamoDB的Query操作不直接支持您描述的用例 - DynamoDB通常要求您指定一个hashkey,然后相应地查询范围键。
但是,有一种流行的分散 - 聚集技术,通常用于像你这样的用例。在这种情况下,您将添加属性bucket_id
并创建一个全局二级索引,其中bucket_id
作为哈希键,Name
作为范围键。
bucket_id指的是固定范围的ID或数字,具有足够的基数以确保您的全局二级索引分布均匀。例如,bucket_id
的范围可以是0到99.然后在更新基表时,无论何时添加新条目,都会为其分配0到99之间的随机bucket_id
。
在自动填充查询期间,应用程序将为每个bucket_id值(0到99)发送100个单独的查询(分散),并在范围键名称上使用BEGINS_WITH
。检索结果后,应用程序必须组合100组响应并根据需要重新排序(收集)。
上述过程可能看起来有点麻烦,但它可以确保负载均匀分布在固定的密钥范围内,从而使您的系统/表能够很好地扩展。您可以根据需要增加bucket_id范围。为了节省成本,您可以选择将KEYS_ONLY
投影到全局二级索引上,从而最大限度地降低查询成本。
答案 1 :(得分:2)
问题在于DynamoDB本质上是一个键值存储,支持针对单个键的操作,并且您正在尝试搜索所有不能正常工作的值。最简单的"解决方法是使用已知的哈希键,然后直接Query
并指定条件。
例如,您可以使用hash_key='name_search'
和range_key=begins_with(myText)
或other_key=begins_with(myText)
进行查询,并获取您正在描述的用例。这适用于不需要大量provisioned RCUs的小型数据集。
问题是这不会扩展,因为你没有关注任何DynamoDB best practices(事实上,这是一个反模式)。看看Understand Partition Behavior documentation
我的建议是使用不同的服务/解决方案来实现这一点,而不是试图将DynamoDB压缩到这个用例中。