首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何设计此NoSQL DB

如何设计此NoSQL DB
EN

Stack Overflow用户
提问于 2019-02-03 02:11:30
回答 1查看 40关注 0票数 0

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

应用程序是一个记录器。我将记录一些内容,然后Dynamo将记录日期并计算当天的时间。

例如,用户今天记录了多个内容,它只会显示today date和logged_times: 5

然后,我可以执行一个查询,获取过去一周/一天/一个月内所有logged_times的总和。

我的问题是,如何构建一个NoSQL数据库,才能高效地做这样的事情?

EN

回答 1

Stack Overflow用户

发布于 2019-02-03 10:14:49

NOSQLdb的几个概念

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

在查看给定问题和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并汇总计数。

现在,这种模式在以下方面会有问题

如果您决定从每小时更改为分钟,则获取

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54495990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档