首页 > 解决方案 > 必须计算记录数,我应该使用哪个数据库

问题描述

我正在设计一个系统,该系统具有一个功能,我必须允许用户创建帖子和回复帖子(没有子帖子)。其中一项要求是显示自用户上次访问以来每个论坛是否有新帖子。用户将被划分在不同的部门。可能有多个部门,但用户将在各个部门内具有可见性。每个部门最多可以有 1000-1500 个用户。

理想的用例是计算自上次访问以来的帖子数,但即使我得到关于自上次访问以来新帖子的是/否答案,也没关系。

使用和 RDS 会很完美,因为每个帖子都可以很容易地具有父子关系。但是 RDS 将花费我 23 美元/月,最低使用量。鉴于这只是一个想法的 PoC,我不想每个月花那么多钱。所以我正在寻找替代方案。

另一种方法是 DynamoDB。但是 DynamoDB 并没有提供任何开箱即用的东西(至少我不知道)来计算自给定日期时间以来的行数。我会在给定的时间内阅读所有帖子(假设我将 datetime 设置为 sortkey 以及 departmentid 作为哈希键),这会占用我的 RCU(读取容量单位)。

实现此要求的最佳优化(成本/运营)方式是什么。

标签: amazon-web-servicesamazon-dynamodbamazon-rds

解决方案


DynamoDB 确实不支持开箱即用的计数。其中一个选项是预先计算行数并将其存储在单独的实体中以便快速访问。创建新帖子时,您还会增加帖子总数,当用户阅读帖子时,您会增加该用户已阅读帖子的数量。您可以使用DDB 事务DDB 流和 Lambda来简化累积实体的更新。

此解决方案应该有效,但正确实施可能会很复杂。为简单起见,我建议先更改计数要求。您可以为计数标签设置阈值,例如 100 条未读消息。在这种情况下,不是显示1521 new messages标签而是显示100+ new messages. 这种方法用于我遇到的大多数 Messenger(例如,Slack、Discord 等)。

通过这种方式,您最多只能读取 100 条下一条未读消息,并且不会消耗太多 RCU,尤其是在您的实体很小的情况下(通常它们应该很小)。DDB 对查询返回的所有项目的总大小收费。因此,您可以检索 100 行,如果它们的组合大小低于 4096 字节,它们仍将花费您 0.5 RCU。


推荐阅读