1

实现评论系统(大量数据写入)的最佳方式是什么?

1)使用MySQL等RDBMS数据库,2张表,1张主题,1张评论 优点是新评论的插入速度快,效率高,索引效率高。缺点 是横向扩展(水平缩放)很难。

2)使用nosql数据库,例如couchdb或mongodb,优点是横向扩展(水平扩展)容易,支持大数据写入,无模式缺点 我认为新数据的插入不如RDBMS快速高效

比如更新couchdb文档需要抓取整个文档,在本地更新后再提交,文档会很大,会占用带宽。

另外我认为 couchdb 就地更新,Mongodb 更新会很慢,并且不会像在 RDBMS 中那样高效

此外,当您想获取每个用户在各种主题中的评论时,我认为在 RDBMS 中搜索会比在 nosql 系统中更快。

那是一个couchdb数据库文档的样本[每个主题的文档样本]

{"_id":"doc id",
 "_rev":"45521231465421"
 "topic_title":"the title of the topic"
 "topic_body":"the body of the topic"
 "comments":[
           {"date":"mm/dd/yy hh:mm:ss"}, {"commment":"bla1"}, {"user":"user1"}
           {"date":"mm/dd/yy hh:mm:ss"}, {"commment":"bla2"}, {"user":"user2"}
           {"date":"mm/dd/yy hh:mm:ss"}, {"commment":"bla3"}, {"user":"user3"}
           {"date":"mm/dd/yy hh:mm:ss"}, {"commment":"bla4"}, {"user":"user4"}
           {"date":"mm/dd/yy hh:mm:ss"}, {"commment":"bla5"}, {"user":"user5"}
           {"date":"mm/dd/yy hh:mm:ss"}, {"commment":"bla6"}, {"user":"user6"}
            ]
}
4

2 回答 2

5

我认为新数据的插入并不像 RDBMS 那样快速高效

你在那里碰到了什么东西。NoSQL 数据库的插入速度取决于您的场景。我不能说得足够清楚,很多人都希望 MongoDB 的执行速度比 SQL 快得多,而当它不适合他们时,他们会感到非常失望,事实上,在此之前,mongodb-user Google 组已经充满了这样的人。

例如更新 couchdb

不仅如此,CouchDB 还使用版本控制和 JSON,这不如将其存储在 SQL 中高效,并且每条记录会消耗更多空间。

Mongodb 更新会很慢并且不会像在 RDBMS 中那样高效

架构,查询,架构,查询...

这就是归结为。问自己一个问题。

我会期待每个帖子有很多评论吗?

如果是这样,内存中(是的,内存中)$push$pull其他子文档运算符可能会在大型子文档上变慢(老实说,会的)。

不仅如此,持续增长的文档可能会成为一个问题,并可能导致严重的碎片和空间使用,从而产生“瑞士奶酪”效应,大大降低系统速度(使其停止运转)。此演示文稿应该有助于了解更多关于存储的真正工作原理:http ://www.10gen.com/presentations/storage-engine-internals

所以您已经知道,如果使用不当,子文档可能是个坏主意。话虽如此,您可以使用 2 种尺寸分配的力量来部分补救它:http: //docs.mongodb.org/manual/reference/command/collMod/#usePowerOf2Sizes但如果您插入的评论太多,那么它不会帮助太多。

我个人不会嵌入这种关系。

所以我会采用与 RDBMS 相同的设置,现在您开始看到问题所在。如果不是 MongoDB 的 fsync 队列,插入的速度可能大致相同,这与直接写入磁盘的 SQL 不同。您可以使用日志写入设置 MongoDB,但最终您可能会从 SQL 获得相同的性能指标。

至于查询,这是 MongoDB 仍然可以脱颖而出的地方,只要您的工作集适合 RAM。我不能大胆的最后一点!

与 SQL 不同,MongoDB 将所有内容(您的整个数据)映射到虚拟内存,而不是 RAM,绝对不要与 RAM 混淆。这确实使较大的查找速度更快,对于较小的查找速度将大致相同,因为两者都将从内存缓存中提供服务。

此外,当您想获取每个用户在各种主题中的评论时,我认为在 RDBMS 中搜索会比在 nosql 系统中更快。

如果主题 ID 在评论文档中,那么在 MongoDB 中肯定会更快,前提是您的工作集已在 RAM 中准备好。

工作集是什么意思?这是一个很好的答案:将“工作集”放入 MongoDB 的 RAM 是什么意思?

希望这可以帮助,

于 2013-05-09T21:19:13.267 回答
2

我只能谈论 MongoDB,而您对插入确实是错误的。是 Mongo 与 MSSQL 的很好比较,Mongo 的性能是 MSSQL 的 100 倍。所以非常适合大数据处理。

搜索也更快(如果插入和搜索不会更快,那么 NoSQL 的全部意义是什么?) - 但需要注意的是,您不能在查询中执行连接,您必须在应用程序中手动连接表(但有推荐的解决方法 -嵌套文档)

于 2013-05-09T20:40:46.313 回答