实施评论系统(大量数据写作)的最佳方法是什么?
1)使用RDBMS数据库(如MySQL),2个表用于主题,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"}
]
}
答案 0 :(得分:5)
我认为插入新数据并不像RDBMS那样快速有效
你在那里打了一些东西。 NoSQL数据库的插入速度依赖于您的场景。我不能说得那么清楚,所以很多人都希望MongoDB能够比SQL更快地执行,并且当它不适合他们时非常失望,事实上在此之前,mongodb用户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相同的设置,现在你开始看到问题了。如果不是MongoDBs fsync队列,插入可能会大致相同的速度,不像SQL直接写入磁盘。您可以使用日志编写来设置MongoDB,但随后您可能会在一天结束时从SQL获得相同的性能指标。
至于查询,这是MongoDB仍然可以出现的最佳位置,提供您的工作集适合RAM 。我不能大胆地说最后一点!!
与SQL不同,MongoDB将所有内容(您的整个数据)映射到虚拟内存,而不是RAM,绝对不要与RAM混淆。这确实使更大的查找速度更快,对于较小的查找,速度将大致相同,因为两者都将从内存缓存中提供。
此外,当您想要在各种主题中获取每个用户的注释时,我认为在RDBMS中搜索的速度比在nosql系统中更快。
如果主题id在评论文档中,那么在MongoDB中肯定会更快,只要你的工作集在RAM中准备就绪。
工作集是什么意思?这是一个很好的答案:What does it mean to fit "working set" into RAM for MongoDB?
希望这有帮助,
答案 1 :(得分:2)
我只能谈论MongoDB,你确实错误的插入。 Here很好地比较了Mongo和MSSQL,而Mongo的表现比MSSQL好100倍。所以它非常适合大数据处理。
搜索也快得多(如果插入和搜索不会更快,那么NoSQL的重点是什么?) - 但有一点需要注意,你不能在查询中执行连接,你必须手动连接表在您的应用程序中(但有推荐的解决方法 - nested documents)。