【问题标题】:Query a range of primary keys in dynamodb在dynamodb中查询一系列主键
【发布时间】:2021-11-17 14:42:17
【问题描述】:

我想确保我做对了,
根据我目前阅读的内容,您无法查询 dynamodb 中的一系列主键,
例如,如果您的主键是客户的电话号码之类的数字,则无法获取主键大于 3010000000 或介于 3010000000 和 3020000000 之间的项目
说清楚,我不是在谈论范围键,我的问题是关于主键本身,

所以如果这是真的,那么会有很多用例,比如日期之间的项目、在某个时间点之后注册的用户,以及...,这需要表扫描,

这是正确的吗?

编辑:好的,想到的一种解决方案是只使用一个虚拟 hash_key 作为主键,然后插入真正的键(如上面的电话号码)作为范围键,这可行吗?

【问题讨论】:

    标签: amazon-dynamodb


    【解决方案1】:

    是的,您无法使用 DynamoDb 获得hash_key 的范围。但这并不意味着你会被你的用例所困。

    让我们以“日期”用例为例,假设您正在构建一个日志应用程序。您每天可能会获得大量记录。

    如果你使用天作为 hash_key,你可以把完整的时间戳作为 range_key。这样,您可以将查询拆分成块并获得您想要的。

    当然,要获得最佳结果,您需要充分了解查询的类型。例如,典型范围是多少?使用 DynamoDb 以及其他 key:value 存储,您在大多数时间建模数据时都会考虑到查询,这与 SQL 建模时只考虑数据不同。

    当然,如果您的物品跨越更大/更短的范围,只需调整此系统即可。

    关于“所有人都在同一个假人hash_key”听起来是个糟糕的主意。对不起。我不是百分百确定它是如何工作的,但我知道 DynamoDB 会跨所谓的分区进行一些分片。我相信1 hash_key <=> 1 partitions。此外,如果仔细阅读文档,您会注意到预置吞吐量在分区之间平均分配,因此每个分区只分配了您所支付费用的一小部分。

    【讨论】:

    • 好的,我明白你的建议,但这太麻烦了(考虑到我得到的回报,这没关系),但这也意味着我无法查询跨越的时间范围一天到下一天的界限,除非我提前知道并创建重叠的键和范围,这太可怕了,我认为我最好的选择是将所有项目下载到我的应用程序中并在那里做我想做的任何事情并使用 dynamodb 作为仅限存储。
    • 我也编辑了这个问题,请你再看看,谢谢
    • 更新了我的答案。简而言之,我认为这是一个非常无效的想法,但不能保证。
    • 如果您想获取日期之间的记录范围,请将您的日期时间转换为 unix 时间戳,将其存储在范围键中,然后对其执行 IN_BETWEEN 查询。
    • @whistlergreg,对于日期,我通常建议使用 RFC3339。它是可读且自然的排序 == 词法排序。我们在 DynamoDB-Mapper (Python) 中使用了它。
    【解决方案2】:

    在不修改主 DynamoDB 表的键的情况下,您可以添加具有恒定分区键的 GSI,并将主表的分区键作为其排序键。

    这将使您能够查询索引的排序键并使用生成的分区键来获取您要查找的数据。

    【讨论】:

      猜你喜欢
      • 2018-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      相关资源
      最近更新 更多