代码之家  ›  专栏  ›  技术社区  ›  MauricioRobayo

如何实现具有日值的简单dynamodb表

  •  0
  • MauricioRobayo  · 技术社区  · 6 年前

    我正在通过构建一个非常简单的API项目来学习AWS API网关+lambda+dynamodb。

    我有一个从2013-01-01开始的每日值,每天都在更新,所以基本上是这样的:

    [
        {
            "value": 1776.09,
            "date": "2013-01-01"
        },
        {
            "value": 1779.25,
            "date": "2013-01-02"
        },
        // ...
        {
            "value": 2697.32,
            "date": "2018-11-22"
        }
    ]
    

    在API中,我想获取特定日期和范围(日期从-日期到)的数据,我一直在阅读关于dynamodb和计划 date 作为格式中的分区键 YYYY-MM-DD 没有排序键,但不确定这是否是这种类型数据和范围查询的正确方法,我假设必须对范围查询进行全表扫描,尽管这是一个小数据集。

    如果这个围裙是对的,有人能指点我吗?还是我需要重新考虑我的桌子结构。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Matthew Pope    6 年前

    你的建议会奏效的。

    但是,如果要提高设计的效率,可以使用的分区键 YYYY 然后你的分类键可以是 MM-DD . 这样,您就可以使用查询操作来限制结果(或者仍然可以使用扫描)。

    甚至可以对分区键使用一个常量值,并且 date 作为排序键,但通常不建议对每个项使用相同的分区键。

    无论哪种方式,您的数据都足够小,您可能只需要选择最容易开发和维护的实现。

        2
  •  0
  •   best wishes    6 年前

    从复制我的答案 this post

    nosqldb的几个概念

    1. 写操作应该在主键上均匀分布。
    2. 读取应该在主键上均匀分布。

    从给定的问题和dyanamodb模式来看,最明显的是

    有钥匙 logs 作为主键和 timestamp 作为辅助键。以及进行聚合使用

    select * where pk=logs and sk is_between x and y

    但这将违反这两个概念。我们总是在一个pk上写作,并且总是从相同的pk上阅读。

    对于这个特殊的问题, 我们的pk应该足够随机(因此 hot keys )具有足够的确定性(以便我们查询)

    在设计密钥时,我们必须对应用程序做一些假设。假设我们决定每小时更新一次。因此,可以将2018年1月7日-17日作为关键。其中17表示17小时。这个键是确定性的,但它不够随机。而且,1月7日的每次更新或读取都将进入同一分区。为了使密钥随机,我们可以使用类似MD5的散列算法计算它的散列值。让我们假设在获取hash之后,我们的密钥变为1sdc23sjdnsd。如果您正在查看表数据,这将没有任何意义。但是,如果你想知道2018-17年1月7日的事件计数,你只需散列时间,然后用hashkey从dynamodb获取数据。 如果你想知道2018年1月7日的所有事件,你可以重复24次获取并汇总计数。

    现在这种模式会有一些问题

    1. 如果你决定从每小时改为每分钟。

    2. 如果您的大多数查询都是运行时的,比如获取最近2、4、6天的所有数据。这意味着去DB的往返次数太多。而且时间和成本都是低效的。

    经验法则是 当查询模式定义良好时,使用nosql 并出于性能原因存储结果。如果您试图对NoSQL进行连接或聚合类型的查询,那么它将根据您的技术选择强制适合您的用例。

    你也可以看看 aws recommendation 存储时间序列数据。