制作博客; 无法在MongoDB和MySQL之间做出决定

jsd*_*sdw 5 mysql blogs mongodb

是的,所以我即将开始使用Node.js为我的网站写博客(就像任何学习过程一样),而且我一直在与自己争论使用MySQL或MongoDB中的哪一个.

搜索周围已经产生了一些"如何在Mongo中写博客"指南,但它们似乎并没有涵盖我遇到的问题.这是我的困境:

如果我要使用MySQL,我会想象我的架构是这样的:

帖子:

ID, USER, DATE, TITLE, TAGS
Run Code Online (Sandbox Code Playgroud)

评论:

POST_ID, USER, DATE, MESSAGE
Run Code Online (Sandbox Code Playgroud)

用户:

ID, SCREEN_NAME, IMAGE_URL
Run Code Online (Sandbox Code Playgroud)

因此,每个帖子都有相关的评论,帖子和评论都有关联的用户.优点是,如果用户希望更改其屏幕名称或图像,则只需更新用户表中的一行.但是,我不确定我会如何获得包含X标签的所有帖子,除非我有多个潜在标签的多个字段?

或者,使用像MongoDB这样的东西,我正在考虑像这样格式化它:

帖子集:

{ 
    {
    _ID: something
    USER: {id: id, name: "screen name", image: "image_url"}
    DATE: ...
    TITLE: ...
    TAGS: [tag1, tag2...]
    COMMENTS: 
         [
         {USER:someone, DATE:something, MESSAGE:"hi"},
         {USER:someone, DATE:something, MESSAGE:"another message"}
         ]
    },
    {
    _ID: something,
    USER: {id: id, name: "screen name", image: "image_url"},
    DATE: ...
    TITLE: ...
    TAGS: [tag1, tag2...]
    COMMENTS: 
         [
         ...
         ]
    },
}
Run Code Online (Sandbox Code Playgroud)

因此,评论嵌入在每个帖子中,这看起来很自然.

在这里,一个查询可以检索我匹配的所有匹配的帖子.另一方面,如果我需要更新用户使用的屏幕名称或图像,该怎么办?似乎很难深入了解给定文档中的嵌入对象,更不用说更新每个帖子中的所有相关记录.

我可以将注释移动到一个单独的集合中以使它们更易于访问,但我仍然面临着对屏幕名称这样的事情进行大量更新.

所以...

从本质上讲,我更喜欢使用MongoDB,因为它可以做到,它可以很容易地完成,并且可以全面使用一种语言.但是,我无法帮助,但我觉得我需要采用关系方法才能"正确"完成工作.

有没有人在任何一种语言或两种语言中都有相似的经历?

您对此有何看法,具体如何处理用户与评论/帖子之间的关系?

在此先感谢任何帮助:)詹姆斯

Sam*_*aye 7

这个问题绝对不能归结为性能,因为MongoDB和SQL都会以完全相同的方式选择一个小数据集,因此不会有真正可衡量的性能提升.

在这种情况下,MongoDB的主要思想是能够将多个表嵌套在一个中,从而减少查询以更新您的信息,例如,而不是查询12个表,您只需查询一个表.不仅如此,有时候模式对于实际使用数据的方式更为自然.

我会在你的架构中改变一些东西:

USER: {id: id, name: "screen name", image: "image_url"}
Run Code Online (Sandbox Code Playgroud)

这应该只是一个ObjectId与用户行相关的内容,并在评论中再次出现:

{USER:someone, DATE:something, MESSAGE:"hi"}
Run Code Online (Sandbox Code Playgroud)

使用ObjectIdUSER领域.这些ObjectId与用户集合有关.还要取出那些大写字母,我觉得这将是一个痛苦的代码.

至于处理关系: - 你将可重复的信息作为子文档嵌入到实体中(通常在第一个NF中标准化),但这并不意味着你应该嵌套到无穷大,通常建议最多3个级别用于查询兼容性裸记住应用等实体的边界blog,postuser.

现在你必须管理没有嵌套的关系,比如bloguser行(因为帖子会有嵌套的评论等).解决这些关系的方法是客户端,因为MongoDB没有关系理想(它是一个RDB异端).

你只会做什么的MySQL通常会做服务器端的客户端,基于用户ID,而不是挑选出一个巨大的结果集的每一行的是用户和岗位之间的连接单独挑选出来的用户,然后挑选出职位表.