2013-05-09 120 views
0

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

1)使用RDBMS数据库如MySQL,2桌一个主题,一个用于注释 优点是新评论的插入是快速,高效,简单,高效的索引。 缺点是缩小(水平缩放)很难。

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

为什么你认为CouchDB的或MongoDB中插入数据时速度较慢?你是用自己的基准来验证它,还是只是在听你的直觉? – Philipp 2013-05-09 20:29:15

+0

要给couchdb文档添加注释,您需要获取整个文档,在本地更新它,然后再次提交,文档大小将很大,因此会占用带宽。所以它会“慢” – 2013-05-09 20:40:16

+0

为什么你会将你的评论嵌入到博客文章中?你是否期望当你显示博客帖子时,你还需要显示它的所有评论?为什么你认为RDBM中的搜索速度会比MongoDB更快?它们都使用索引,两个结构索引都是B树。你为什么不实际测试你预期使用的数据? – 2013-05-10 05:23:57

回答

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相同的设置,现在你开始看到这个问题。如果不是用于MongoDB的fsync队列,插入的速度可能会大致相同,这与SQL直接写入磁盘的SQL不同。您可以使用日记写入来设置MongoDB,但是在一天结束时,您可能会从SQL获得与SQL相同的性能指标。

至于查询,这是MongoDB仍然可以在上面提供的地方,提供你的工作集适合RAM。我不敢大胆,最后一点够了!

与SQL不同,MongoDB将一切(您的整个数据)映射到虚拟内存,而不是RAM,绝对不会与RAM混淆。这对于更大的查找速度更快,对于小型查找,速度将大致相同,因为两者都将从内存缓存中提供。

此外,当您想要获得每个用户在各种主题中的评论时,我认为RDBMS中的搜索速度要快于nosql系统。

如果主题ID在评论文档中,它肯定会在MongoDB中更快,因为您的工作集已准备好在RAM中。

工作集是什么意思?这里是一个很好的答案:What does it mean to fit "working set" into RAM for MongoDB?

希望这有助于

+0

嗯,有人下来投票我的答案,我不知道他们是否有一个解释? – Sammaye 2013-05-10 07:06:03

2

我可以说只有约MongoDB的,你确实是错了刀片。 Here不错,Mongo与MSSQL的比较,Mongo比MSSQL好100倍。所以它非常适合大数据处理。搜索速度也要快得多(如果插入和搜索速度不会更快,NoSQL的全部重点是什么?) - 但有一点需要注意,你不能在查询中执行连接,你必须连接表在手动应用程序(但有建议报告的解决方法 - nested documents)

+1

我会非常担心依赖这样的图表,然后说MongoDB更快就是“事实”,即他只在那里使用嵌入式架构,嵌入并不总是一个好主意,事实上它应该仔细考虑...... – Sammaye 2013-05-09 21:02:21

+0

我并不是说嵌入总是一个好主意,但在一些(可能是大多数?)情况下它是可以接受的。如果没有,你仍然可以手动加入,虽然这很痛苦(但这是NoSQL DB的价格)。但OP询问了评论系统,所以在这种情况下嵌入似乎很好。 – 2013-05-09 21:12:23

+0

这取决于查询和意见,但是,似乎可以假设嵌入 – Sammaye 2013-05-09 21:25:55