6

是的,所以我即将开始使用 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,因为它可以做的事情,它可以很容易地做,并且全面使用一种语言是很好的。但是,我不禁觉得我需要采用关系方法才能“正确”完成工作。

有没有人有过用任何一种或两种语言做类似事情的经验?

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

在此先感谢您的帮助:) 詹姆斯

4

3 回答 3

7

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

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

我会更改您的架构中的一些内容:

USER: {id: id, name: "screen name", image: "image_url"}

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

{USER:someone, DATE:something, MESSAGE:"hi"}

使用一个ObjectId字段USER。这些ObjectIds 将与用户集合有关。还要去掉那些大写字母,我觉得编码会很痛苦。

至于处理关系:-您将可重复信息作为子文档嵌套到实体中(通常在第一个 NF 中被规范化),但这并不意味着您应该嵌套到无穷大,通常建议最多 3 级用于查询兼容性也牢记应用程序实体的边界,blog例如postuser

现在您必须管理非嵌套关系,例如bloguser行(因为帖子将嵌套评论等)。解决这些关系的方法是客户端,因为 MongoDB 没有关系理想(它是 RDB 异端)。

您只需执行 MySQL 通常会在服务器端客户端执行的操作,即单独挑选用户,然后根据该用户 id 挑选帖子,而不是挑选出每一行的巨大结果集作为用户和帖子之间的连接表。

于 2012-10-17T21:38:57.637 回答
0

我不同意需要一种关系方法才能正确完成事情。

决定取决于您是否可以免除 ACID 和关系细节。

如果您的博客是基于文档的,那么 NoSQL 方法也许可以正常工作。

更好的是,如果您使用 Java 或 C# 等面向对象的语言,您可以抽象出如何在接口后面持久化事物的细节,并将一个实现换成另一个实现。你不必以这种方式被锁定。

于 2012-10-17T18:59:52.423 回答
-6

我只会使用 wordpress,它非常受欢迎,而且我从来没有遇到过任何性能问题!当今全球 25% 的网站使用 wordpress!

于 2012-10-17T18:59:32.033 回答