【问题标题】:Order in which data is stored for same GSI values in a DynamoDB table which does not have a range key over GSI在没有 GSI 范围键的 DynamoDB 表中为相同 GSI 值存储数据的顺序
【发布时间】:2016-10-18 22:13:20
【问题描述】:

我从 AWS documentation 引用以下内容

具有相同分区键值的项目按排序键排序存储。如果排序键数据类型为数字,则结果按数字顺序存储。对于 String 类型,结果按 ASCII 字符代码值的顺序存储。对于 Binary 类型,DynamoDB 将二进制数据的每个字节视为无符号。

假设一个表有一个全局二级索引(没有相关的范围键),相同 GSI 值的数据的存储顺序是什么?

DynamoDB 是否在将数据存储在具有相同分区键值的表中(仅具有分区键而没有在特定分区键上定义范围键)时根据某些属性维护某种顺序(这只会发生在GSI)只是分区键?

例如在下表中,3 个 GameTitle 为“GalaxyInvaders”的项目将按任何顺序存储在表中?

(GSI)                           (HashKey)
——————————————————————————————————————————
GameTitle           | Score    | UserId
——————————————————————————————————————————
AlienAdventure      | 23       | 101
AttackShip          | 45       | 102
GalaxyInvaders      | 34       | 104
GalaxyInvaders      | 45       | 106
GalaxyInvaders      | 56       | 107

我问这个是因为我在 GSI 上使用 lastEvaluatedKey 进行查询(此 GSI 没有范围键,表有单独的范围和哈希键),我想知道我是否可以朝两个方向前进,即获取下一页结果并使用 ScanIndexForward 获取上一页结果?

如果维持一些秩序,那么我似乎可以,但我找不到支持性文档。从我到目前为止所做的查询来看,我可以双向进行。

【问题讨论】:

    标签: amazon-web-services pagination amazon-dynamodb


    【解决方案1】:

    在没有排序键的情况下,DynamoDB 将按一些顺序存储一个分区键的数据。该顺序将是什么,您不能也不应该假设。

    我的意思是,GameTitle 等于 'GalaxyInvaders' 的所有行都将按 some 顺序排列,但您不会知道该顺序到底是什么。因此,您不能假设将按照ScoreUserId 对行进行排序。这种假设只能用于排序键。

    至于您在Scan 上的实际问题:是的,您可以双向使用。如果,abcScanIndexForward : true,您可以假设您将返回 cbaScanIndexForward : false

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多