nosql 表上非常简单的关系的最佳实践

Posted

技术标签:

【中文标题】nosql 表上非常简单的关系的最佳实践【英文标题】:best practice for very simple relation on a nosql table 【发布时间】:2021-10-12 06:42:03 【问题描述】:

我正在使用带有 GraphQL api 的 dynamoDB 表来存储帖子。我希望用户能够将某些帖子标记为收藏。

我曾考虑创建一个要发布的用户关系表,但我还想将一个 userId 的数组添加到 post 对象中,其中包含已收藏该帖子的用户的所有 userId。

我的理解是 UUID 是 16 个字节,所以即使说有 10,000 个用户喜欢该对象,那么该数组也将是 160kb。每次加载时通过对象传递这么多数据并不是微不足道的,但可以管理。

只是想知道这种情况的最佳做法是什么。我对 nosql 很陌生。

【问题讨论】:

你将如何使用它?你要向用户展示他们自己的最爱吗?或者在每个帖子上显示谁最喜欢?或两者?您打算如何使用数据对您希望如何在 noSQL 中构建数据有很大影响 【参考方案1】:

对于 dynamoDB,您必须首先考虑访问模式:

要获取用户最喜欢的帖子,请将postsIds 数组存储在用户表中 要获得喜欢帖子的用户,请在帖子表中存储一个likerIds 数组 要获得双向链接,请执行上述两项操作

还请记住:

获取文档时可以选择字段(只选择您感兴趣的字段) 我没有看到加载 10k 个用户名并显示它们的场景

上面的解决方案对于常见的场景看起来很不错。

更高级的解决方案:

使用范围键可能有更强大的方法来做到这一点。例如:

Hash Key: postID range key: likerID title ...
post1 MyFancyPost
post1 user1
post1 user2

这种结构更强大,可以存储大量连接,而post 模型中没有任何“大”字段。

您可以轻松地进行分页,并统计喜欢的人列表 只需一个帖子即可处理更多喜欢的人

【讨论】:

以上是关于nosql 表上非常简单的关系的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB 最佳实践

使用 NoSQL DB 跟踪用户时间戳数据的 DB 最佳实践(使用 firebase)

Laravel 中批量更新关系的最佳实践

NoSQL文档型数据库Couchbase的生产部署最佳实践

Mysql 索引:查询生成器的最佳实践

将数据库内容从一种非常糟糕的结构迁移到一种非常合乎逻辑的结构的最佳实践?