【问题标题】:How to design this NoSQL DB如何设计这个 NoSQL DB
【发布时间】:2019-02-03 10:20:18
【问题描述】:

我正在尝试为自己创建一个使用 DynamoDB 的简单应用程序。我从来没有在高级级别上使用过 NoSQL,只是在这里和那里存储一个值。

应用程序是一个记录器。我会记录一些东西,而 Dynamo 会记录日期并计算当天的时间。

例如,一个用户今天记录了多件事,它只会说今天的日期和记录的时间:5

然后我可以查询过去一周/一天/一个月等内所有记录时间的总和。

我的问题是如何构建一个 NoSQL 数据库来做这样有效的事情?

【问题讨论】:

    标签: database nosql amazon-dynamodb


    【解决方案1】:

    NOSQLdb的几个概念

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

    看到给定的问题和 dyanamodb 架构,最明显的想法是

    将键 logs 作为主键,将 timestamp 作为辅助键。并进行聚合使用

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

    但这会违反这两个概念。我们总是在一个 pk 上写入,并且总是从同一个 pk 中读取。

    现在到这个特殊的问题, 我们的 PK 应该足够随机(以便没有hot keys)和足够确定性(以便我们可以查询)

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

    现在这种模式会出现问题

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

    2. 如果您的大多数查询都是运行时的,例如获取过去 2、4、6 天的所有数据。这将意味着到 db 的往返次数过多。而且这在时间和成本上都是低效的。

    经验法则是当查询模式定义明确时,使用 NOSQL 并出于性能原因存储结果。如果您尝试在 nosql 上执行连接或聚合查询,它会根据您的技术选择强制适合您的用例。

    您还可以查看存储时间序列数据的aws recommendation

    【讨论】:

      猜你喜欢
      • 2016-02-28
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-11
      相关资源
      最近更新 更多