我正在尝试为自己创建一个使用DynamoDB的简单应用程序。我从来没有在高级级别上使用过NoSQL,只是在这里和那里存储一个值。
该应用程序是一个记录器。我将记录一些内容,而Dynamo将记录日期和日期。
例如,一个用户今天记录了很多东西,它只会说今天的日期和已记录的时间:5
然后我可以进行查询以获取过去一周/天/月等所有记录时间的总和。
我的问题是您如何构建NoSQL数据库来执行类似这样的高效操作?
答案 0 :(得分:0)
NOSQLdb的一些概念
看着给定的问题和dyanamodb模式,显而易见的是
有键logs
作为主键和timestamp
作为辅助键。并使用
select * where pk=logs and sk is_between x and y
但是这将违反两个概念。我们总是写在一个pk上,并且总是从同一个pk读取。
由于这个特殊问题, 我们的PK应该足够随机(以至于没有hot keys)并且具有足够的确定性(以便我们可以查询)
我们将不得不作出有关应用程序而设计的键一些假设。假设我们决定每小时更新一次。因此可以将2018年1月7日作为密钥。其中17表示17小时。此密钥是确定性的,但不够随机。并在1月7日每一次更新或读大多会去同一个分区。为了使密钥随机,我们可以使用像md5这样的哈希算法来计算它的哈希。假设经过哈希处理后,我们的密钥变为1sdc23sjdnsd。如果你正在寻找在表中的数据,这将没有任何意义。但是,如果您想知道2018年1月7日的事件计数,您只需对时间进行哈希处理并使用hashkey从dynamodb中获取即可。 如果您想了解2018年1月7日的所有事件,则可以重复执行24次获取并汇总计数。
现在这种模式将在哪里出现问题
如果您决定从每小时更改为分钟。
如果您的大多数查询都在运行时,例如让我获取过去2,4,6天的所有数据。这将意味着太多往返分贝。这将是时间和成本效率低下。
经验法则是定义好查询模式后,出于性能原因,请使用NOSQL 并存储结果。如果您要对nosql进行联接或聚合查询,则将根据您的技术选择强制使用案例。
您也可以着眼于aws recommendation存储时间序列数据的