是的,所以我即将开始使用Node.js为我的网站写博客(就像任何学习过程一样),我一直在与自己激烈争论使用MySQL或MongoDB中的哪一个
搜索周围已经产生了一些“如何在Mongo中写博客”指南,但它们似乎并没有涵盖我遇到的问题。这是我的困境:
如果我要使用 MySQL ,我会想象我的架构是这样的:
ID, USER, DATE, TITLE, TAGS
POST_ID, USER, DATE, MESSAGE
ID, SCREEN_NAME, IMAGE_URL
因此,每个帖子都有相关的评论,帖子和评论都有关联的用户。优点是,如果用户希望更改其屏幕名称或图像,则只需更新用户表中的一行。然而,我不确定我会如何获得包含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:
[
...
]
},
}
因此,评论嵌入在每个帖子中,这似乎很自然。
在这里,一个查询可以找回所有匹配的帖子。另一方面,如果我需要更新用户使用的屏幕名称或图像,该怎么办?似乎很难深入研究给定文档中的嵌入对象,更不用说更新每个帖子中的所有相关记录。
我可以将评论移到单独的集合中以使其更易于访问,但我仍然面临着对屏幕名称等内容进行大量更新。
基本上,我更喜欢使用MongoDB,因为它可以做到,它可以很容易地完成,并且可以全面使用一种语言。但是,我无法帮助,但我觉得我需要采用关系方法才能“正确”完成任务。
有没有人有过使用这两种语言或两种语言做类似事情的经验?
您对此有何看法,具体说明如何处理用户与评论/帖子之间的关系?
提前感谢您的帮助:) 詹姆斯
答案 0 :(得分:7)
这个问题绝对不能归结为性能,因为MongoDB和SQL都会以完全相同的方式选择一个小数据集,因此不会有真正可衡量的性能提升。
在这种情况下,MongoDB的主要思想是能够将多个表嵌套在一个中,从而减少查询以更新您的信息,例如,而不是查询12个表,您只需查询一个表。不仅如此,有时候模式对于实际使用数据的方式更为自然。
我会在您的架构中更改一些内容:
USER: {id: id, name: "screen name", image: "image_url"}
这应该只是一个ObjectId
,与用户行相关,并在评论中再次出现:
{USER:someone, DATE:something, MESSAGE:"hi"}
对ObjectId
字段使用USER
。这些ObjectId
将与用户集合相关。还要取出那些大写字母,我觉得编码很麻烦。
至于处理关系: - 你将可重复信息作为子文档嵌入到实体中(通常在第一个NF中标准化),但这并不意味着你应该嵌套到无穷大,通常最多3个级别建议使用blog
,post
和user
等应用实体的边界时,建议您查询兼容性。
现在你必须管理没有嵌套的关系,例如blog
和user
行(因为帖子会有嵌套的评论等)。解决这些关系的方法是客户端,因为MongoDB没有关系理想(它是一个RDB异端)。
您只需执行MySQL通常在服务器端客户端执行的操作,单独挑选用户,然后根据该用户ID选择帖子,而不是选择每行的巨大结果集作为连接用户和帖子表。
答案 1 :(得分:2)
我会选择MongDB。有很多关于如何在博客中使用它的例子,包括这个: http://www.mongodb.org/display/DOCS/Schema+Design
http://seanhess.github.com/2012/02/01/mongodb_relational.html强调了MongoDB所具有的一些关系风格细节。
当然这两种范例都非常重要,博客可能是使用基于文档的数据库的一个很好的例子。
答案 2 :(得分:2)
在像你这样的情况下,MongoDB可能会占用更多的磁盘空间和其他资源。本文比较了MongoDB和MySQL之间的磁盘空间使用情况:MySQL vs Mongodb disk space usage。
答案 3 :(得分:0)
我不同意需要一种关系方法来正确完成工作。
决定取决于你是否可以免除ACID和关系细节。
如果您的博客是基于文档的,那么NoSQL方法可能会正常工作。
更好的是,如果您使用的是面向对象的语言(如Java或C#),您可以抽象出如何在界面后面保留事物并将一个实现换成另一个实现的细节。你不需要以这种方式被锁定。
答案 4 :(得分:-5)
我只是使用wordpress,它非常受欢迎,而且我从来没有遇到任何性能问题!如今,全球25%的网站都使用wordpress!