如何设计此NoSQL数据库

时间:2019-02-02 18:11:30

标签: database nosql amazon-dynamodb

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

该应用程序是一个记录器。我将记录一些内容,而Dynamo将记录日期和日期。

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

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

我的问题是您如何构建NoSQL数据库来执行类似这样的高效操作?

1 个答案:

答案 0 :(得分:0)

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小时。此密钥是确定性的,但不够随机。并在1月7日每一次更新或读大多会去同一个分区。为了使密钥随机,我们可以使用像md5这样的哈希算法来计算它的哈希。假设经过哈希处理后,我们的密钥变为1sdc23sjdnsd。如果你正在寻找在表中的数据,这将没有任何意义。但是,如果您想知道2018年1月7日的事件计数,您只需对时间进行哈希处理并使用hashkey从dynamodb中获取即可。 如果您想了解2018年1月7日的所有事件,则可以重复执行24次获取并汇总计数。

现在这种模式将在哪里出现问题

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

  2. 如果您的大多数查询都在运行时,例如让我获取过去2,4,6天的所有数据。这将意味着太多往返分贝。这将是时间和成本效率低下。

经验法则是定义好查询模式后,出于性能原因,请使用NOSQL 并存储结果。如果您要对nosql进行联接或聚合查询,则将根据您的技术选择强制使用案例。

您也可以着眼于aws recommendation存储时间序列数据的