通过 DynamoDB 建立模型 Post 和主题

Model Post and Topic through DynamoDB

这是我尝试在 DynamoDB 中建模的关系: 我的服务包含 post 和主题。一个post可能属于多个主题。一个主题可能有多个 post。所有 post 都有一个兴趣值,该值将根据喜欢和自 post 发布以来的时间组合进行调整,兴趣衡量 post 在当前时刻的受欢迎程度。如果 post 变得太旧,它的利息值将为 0 并永远保持这种状态(存档)。

REST api 端点的工作方式如下:

现在的问题是,如何在 DynamoDB NoSql 中创建主题和 post 之间的关系?

我考虑过将 posts 的副本列表添加到 DynamboDB 中的标签条目,其中每个标签都有一个包含最新和最有趣帖子的列表。 我可以做到这一点的一种方法是创建一个 cloudwatch 作业,每 10 分钟 运行 并循环遍历每个主题 object,找到最有趣和最新的条目,然后替换主题的旧列表. 另一项工作还必须定期更新每个未存档的“兴趣”值 post(请记住,喜欢和时间都会对兴趣值产生影响)。

一个问题是标签列表中的很多 post 会过时 10 分钟,以防用户更改或删除 post。标签 post 列表中也不会正确跟踪点赞。这也许可以通过事务来解决,尽管 dynamoDB 限制为每个事务 10 objects。
另一个问题是,它需要 add-posts-to-tags 作业将所有未存档的 post 加载到内存中,以便按时间和兴趣手动对它们进行排序,按标签将它们分开,然后添加第一个每 10 分钟将两个集合的 N 个设置到标签列表中。


我还有一个想法,通过限制允许的post标签为1,我可以将标签添加为分区键,post-time作为排序键,并使用 GSI 添加兴趣作为第二个排序键。
这确实有几个缺点:

但它的优点是除了 GSI 之外没有 post object 的复制。它还允许按日期对所有 post 进行基本上无限的分页,而不是仅限于 N 个最新的 post。

那么什么是好的方法呢?它接缝我的两个解决方案都有可怕的交易破坏者。这只是 NoSQL 无法解决的问题之一吗?

您正在尝试使用非关系数据库对关系数据建模, 为此,我会使用两种类型的数据库, 我会在发电机中存储 post 信息 在您的示例中,它将是:

GET /posts/{id} 
POST /posts/
POST /likes/creates

对于与主题相关的信息,我会使用弹性搜索 (Amazon Elasticsearch Service)

GET /topics/{name} :搜索索引将存储完整的主题信息以及 post id's that ,以及您要搜索的相关字段(在您的情况下更新日期以获取最新的posts)

这需要的是后台进程(在 dynamoDB 中,这可以通过 streams 完成),该进程对新 post 的 dynamoDB 进行更改,更新为喜欢计数等。填充搜索索引。

注意:这也可以使用 graphDB 解决,但出于扩展目的,最好将数据源(post 的)和数据关系(主题)分开。