作为最流行的NoSQL解决方案之一,MongoDB具有这种方法的大部分优势.但是我仍然在努力解决的一个问题是如何在NoSQL数据存储中反映对象关系,特别是MongoDB.

例如,让我们考虑一个简单的数据模型:用户、POST和 comments .我很清楚, comments 本身没有价值,因此成为帖子的嵌入对象.但当涉及到用户时——这就变得很棘手,因为用户本身就是一个实体,不与Post相耦合.现在,如果我需要在网页上列出带有用户全名和个人资料链接的帖子,我需要一个帖子列表和关于帖子作者的信息(至少包括姓名和id).

我在这里看到了两种可能的解决方案:

  1. 对数据进行反规范化,使每个帖子条目都包含作者ID和全名(以及列出帖子时可能需要的任何其他用户属性).通过这种方式,我可以让查询数据变得非常简单,但当用户更新他/她的个人资料时,我也需要更新用户的所有帖子.但是,我还需要在comments对象中存储用户属性,这意味着更新用户配置文件基本上需要我更新所有至少有一条用户 comments 的帖子,除非我想将 comments 存储在单独的集合中.
  2. 只将用户ID存储在POST对象中,并运行两个查询:一个用于获取帖子列表,另一个用于获取用户ID在帖子作者列表中的用户列表.这需要在我的应用程序代码中执行2个查询和额外的处理,以将用户映射到帖子.

我肯定我不是第一个面对这个问题的人,但不幸的是,到目前为止,我还没有找到任何关于这个话题的最佳实践.意见?

推荐答案

这两种解决方案都是有效的解决方案,解决方案1的优点是您可以显示这样的页面,只需从数据库中检索一个文档即可.用户不经常更新他们的个人资料,您可以在用户个人资料更改后异步更新所有帖子和嵌入的 comments .您可以在userid上索引帖子和嵌入的 comments ,这样更新应该会很快.MongoDB中的更新非常快,因为MongoDB执行就地更新,并且您不能回滚或提交,因此MongoDB不必记录更改.

然而,像stackoverflow这样的网站上的用户也有一个声誉,这个声誉的变化比他们的个人资料要大得多.

解决方案2要求每页检索更多的文档,但是您可以将$in操作符与userid列表(发布的userid+ comments 的userid)一起使用,因此您只需要两个"SELECT语句".

Database相关问答推荐

位置运算符($)工作不正确

为什么Hibernate会为@JoinTable的双向@OneToMany关系生成一个复杂的子查询?

如何限制报表中返回的行数?

使用 Npgsql 执行年龄查询并在 .NET 应用程序中返回结果?

java嵌入式库磁盘键值数据库

在 bindParam 中使用 LIKE 进行 MySQL PDO 查询

按纬度/经度进行半径搜索

Oracle 和 SQL Server 中的 NVARCHAR 之间的区别?

查询表的外键关系

在 PostgreSQL 中使用 pg_notify(text, text) 监听/通知

将 Android Room 数据库与 Firebase 实时数据库相关联

在默认路径下使用脚本创建数据库?

使用十进制数据类型(MySQL / Postgres)是否会影响性能

部分依赖(数据库)

如何在android中使用合同类?

为什么用 varbinary 而不是 varchar

数据库触发器的命名约定

将内存数据库保存到磁盘

查询 oracle clob 列

为什么 DBMS 不支持 ASSERTION