我正在尝试为自己创建一个使用DynamoDB的简单应用程序。我从来没有在高级级别上使用过NoSQL,只是为了在这里和那里存储值。
应用程序是一个记录器。我将记录一些内容,然后Dynamo将记录日期并计算当天的时间。
例如,用户今天记录了多个内容,它只会显示today date和logged_times: 5
然后,我可以执行一个查询,获取过去一周/一天/一个月内所有logged_times的总和。
我的问题是,如何构建一个NoSQL数据库,才能高效地做这样的事情?
发布于 2019-02-03 10:14:49
NOSQLdb的几个概念
在查看给定问题和dyanamodb模式时,脑海中浮现的显而易见的事情是
主键为key logs,副键为timestamp。并进行聚合使用
select * where pk=logs and sk is_between x and y
但这将违反这两个概念。我们总是在一个pk上写,并且总是从同一个pk上读取。
现在对于这个特定的问题,我们的PK应该是足够随机的(这样就没有hot keys)和足够确定的(这样我们就可以查询)。
在设计密钥时,我们必须对应用程序做一些假设。假设我们决定每小时更新一次。因此可以将2018-17年1月7日作为关键字。其中17表示17小时。这个密钥是确定性的,但它还不够随机。而1月7日的每次更新或读取大部分都将转到相同的分区。为了使密钥随机,我们可以使用散列算法来计算它的散列,就像md5一样。假设在使用hash之后,我们的key变成了1sdc23sjdnsd。如果您正在查看表数据,这将没有任何意义。但是,如果您想知道2018-17年1月7日的事件计数,您只需对时间进行散列,并使用hashkey从dynamodb执行get。如果你想知道2018年1月7日的所有事件,你可以重复24次gets并汇总计数。
现在,这种模式在以下方面会有问题
如果您决定从每小时更改为分钟,则获取
经验法则是当查询模式定义良好时,出于性能原因,使用NOSQL并存储结果。如果您尝试在nosql上执行连接或聚合类型的查询,它将根据您的技术选择强制适合您的用例。
您还可以查看存储时间序列数据的aws recommendation。
https://stackoverflow.com/questions/54495990
复制相似问题