MongoDB论坛模型

时间:2012-01-28 06:53:19

标签: mysql mongodb schema schema-design

所以我正在为一个论坛创建一个模型。思考线程和一堆评论在哪里。线程有很多评论。在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}]

这是最明智的做法,我猜这就是我要问的。为什么?

2 个答案:

答案 0 :(得分:4)

首先,我希望您已阅读Schema Design上的文档,该文档以与您类似的示例进行说明。

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

嵌入具有以下优点:只需要一个DB调用来显示单个帖子/线程,并且大多数情况下通常只能将mongodb响应发送到浏览器(如果客户端进行UI呈现)。 *注意:添​​加评论需要使用$ push进行更新。并且请记住,您必须创建comment._id,MongoDB不会为您自动创建它。嵌入式场景中注释数据的任何更新都需要使用$ position运算符进行UPDATE。*

答案 1 :(得分:0)

在这种情况下,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 }]

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