【问题标题】:DynamoDB schema design to support lookup by ID and timestamp of item?DynamoDB 架构设计支持按 ID 和时间戳查找项目?
【发布时间】:2019-04-11 20:22:28
【问题描述】:

我需要设计一个 DynamoDB 架构来存储属性为:

  • tidUUID 字符串,它是项目的唯一标识符
  • timestampISO-8601 格式的字符串,表示与项目相关的日期和时间
  • 其他东西...

对于以下query(真的想避免必须做任何scans)模式:

  • tid查询
  • 根据timestamptimestamp 上的关系排序表达式(例如<=BETWEEN 等)进行查询。即,查询特定日期时间范围内的所有项目提前知道它们的tids。

这是否可以在 DynamoDB 中有效地完成,或者是否有其他 AWS 解决方案可以更好地为我服务?

【问题讨论】:

    标签: amazon-web-services database-design amazon-dynamodb


    【解决方案1】:

    给定一个 DynamoDB 表如下:

    • 分区键:tid,输入字符串
    • 排序键:timestamp,输入字符串

    您可以查询:

    • tid = 5
    • tid = 5,时间戳在 2018-12-21T09:00:00Z 和 2018-12-21T15:00:00Z 之间

    尝试使用awscli,例如使用tid=5查询所有项目:

    aws dynamodb query \
        --table-name mytable \
        --key-condition-expression "tid = :tid" \
        --expression-attribute-values '{":tid":{"S":"5"}}'
    

    查询tid=5timestamp between 09:00 and 15:00 on 2015-12-21的所有项目:

    aws dynamodb query \
        --table-name mytable \
        --key-condition-expression "tid = :tid AND #ts BETWEEN :ts1 AND :ts2" \
        --expression-attribute-values  '{":tid":{"S":"5"}, ":ts1":{"S":"2015-12-21T09:00:00Z"}, ":ts2":{"S":"2015-12-21T15:00:00Z"}}' \
        --expression-attribute-names '{"#ts":"timestamp"}'
    

    注意:因为timestamp 在 DynamoDB 中是 reserved keyword,所以您必须使用表达式属性名称对其进行转义。

    如果您愿意,也可以将 timestamp 属性创建为数字,然后存储纪元时间。

    使用timestamp between 09:00 and 15:00 on 2015-12-21 查询所有项目,不管tid,不能使用相同的分区/排序键架构。您需要添加 Global Secondary Index 类似这样的内容:

    • GSI 分区键:yyyymmdd,输入字符串
    • GSI 排序键:timestamp,输入字符串

    现在您可以查询具有给定时间戳范围的项目,只要它们在同一天(它们具有相同的 YYYYMMDD,这可能是一个合理的限制)。或者您可以将 YYYYMM 作为允许更宽时间戳范围的分区键。此时,您确实需要了解查询的用例以确定 YYYYMMDD(将查询限制为一天)是否正确。有关此想法的更多信息,请参阅How to query DynamoDB by date with no obvious hash key

    【讨论】:

    • 我提到的第二种查询模式是仅按时间戳查询,即不必指定tid。由于tid 是一个全局唯一标识符,因此以tid 作为分区键并以其他一些键作为排序键的复合键是多余的,因为它等效于仅由分区键tid 组成的简单主键.我正在寻找的是一个支持tid查找的结构,以及属于某个日期时间范围的所有项目的查找(事先不知道他们的tids)。
    • 抱歉,误读了问题的那一部分。 afaik 的典型解决方案使用具有分区键的 GSI,该分区键可以从时间戳推断/计算,然后是排序键,即时间戳。分区键可能类似于时间戳的 YYYYMMDD。然后,您可以查询具有给定时间戳范围的项目,只要它们在同一天(具有相同的 YYYYMMDD,这可能是一个合理的限制)。或者您可以使用 YYYYMM 作为分区键,允许更宽的时间戳范围,但对于不适合分片的高 i/o 表。这有帮助吗?
    猜你喜欢
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    相关资源
    最近更新 更多