6

所以我正在为一个论坛创建一个模型。想想线程和一堆评论在哪里。线程有很多评论。在 RDBMS 世界中,我会这样设计

Thread --has many--> Comment
id                   id
user_id              thread_id
                     user_id 

现在,我想,有了这个,数据/模式将遵循许多正常形式之一(我忘记了)。我认为这是最明智的做法。然而,当谈到在 NoSQL 世界 (MongoDB) 中执行此操作时,设计这种关系的最佳方式是什么?我几乎可以用 RDBMS 的方式做到这一点,但我会失去使用嵌入式对象的优势。出于某种原因,我更倾向于这样做

Thread
_id
user_id
comments => [{_id, user_id, body, created_at}]

我想这就是我要问的最明智的方法是什么。为什么?

4

2 回答 2

6

首先,我希望你已经阅读了关于Schema Design的文档,其中解释了一个与你类似的示例。

因此,您可以根据自己的选择嵌入或链接。如果评论的数量预计是可管理的(相对较小),我会嵌入,如果评论太多,我会链接。

嵌入的优点是只需要一个单独的 DB 调用来显示一个帖子/线程,并且通常可以只将 mongodb 响应按原样发送到浏览器(如果客户端进行 UI 渲染)。*注意:添​​加评论需要使用 $push 进行更新。请记住,comment._id 必须由您创建,MongoDB 不会为您自动创建它。嵌入式场景中评论数据的任何更新都需要使用 $ 位置运算符进行更新。*

于 2012-01-28T18:12:25.930 回答
-1

在这种情况下,mongoDB 注释不像任何其他 RDBMS 那样易于解释。如您所知,MONGODB 根本不是 RDBMS。此外,由于它是序列化数据存储系统,您需要在每次更新时添加评论,无论您使用 PHP/ASP/JAVA 或 NODE 作为后端技术。

db.collection.find( { <query> } )._addSpecial( "$comment", <comment> )
db.collection.find( { <query> } ).comment( <comment> )
db.collection.find( { $query: { <query> }, $comment: <comment> } )

也请点击链接

https://docs.mongodb.com/manual/reference/operator/meta/comment/

记住一件事 Mongo DB Jason 数组将像下面这样的示例

comments => [{_id, user_id, body, created_at}]
comments => [{_id, body, created_at}]
comments => [{_id, user_id, body }]

等等...相应地使用它...

于 2019-06-04T07:05:22.583 回答