MongoDB 最近在纠结,到底用 MongoDB 还是 MySQL

twm · 2013年12月03日 · 最后由 pathbox 回复于 2015年11月28日 · 51149 次阅读

大家有什么建议吗?

MySQL 的话,路线会比较顺畅,什么东西都很完善,MongoDB 偶尔会遇到一些小坑

这个要看你怎么选择了,各有个的优势。

看项目需求

MongoDB 没有事务原子性,好好考虑哦 我觉得 Postgresql 比较完美,既是 关系型数据库,又支持 json 和 Hstore 字段,事务 和 文档 特性两全了。

postgresql,集合两边优点

如果 MySQL 也不太熟悉的话,那我也建议用 Postgresql 理由和 #3 楼 @winnie 一样

#4 楼 @Rei #5 楼 @Victor Postgresql 的性能如何,和 MySQL 比的话?

#4 楼 @Rei #3 楼 @winnie #5 楼 @Victor 耶耶耶,我也要用 postgresql!不过我用的原因是因为小伙伴说这个可以全文搜索……

自己感觉哪个上手快就用哪个

谢谢,我比较纠结的是 mysql 设计类似本站的“通知”,“提醒”没有 mongodb 好实现。 比如:

notification = {
    [
    event: '在主题中提到了你',
    topic: {
      _id: 1,
      title: 'topic title',
      xxx: xxx
   },
   event: '在评论中提到了你',
   comment: {
      _id: 1,
      body: 'comment body',
      xxx: xxx
   },
   event: '你关注的话题有了新的回复',
   comment: {
      _id: 1,
      body: 'comment body',
      xxx: xxx,
     topic: {
        _id: 1,
        title: 'topic title',
        xxx: xxx
     }
   },
   ]
}

这样在 notification 中可以混合多种类型,mysql 我还没有好的思路实现。

#1 楼 @huacnlee #2 楼 @hz_qiuyuanxin #3 楼 @winnie #4 楼 @Rei #5 楼 @Victor #6 楼 @Numbcoder #7 楼 @chairy11 #8 楼 @miclle

MongoDB 等文档型数据库,优点在于方便横向扩展,不过 Ruby 应用的场景来看,性能从来不是出在数据库上,关系型数据库足够。

关系型数据库中,除了 Oracle 和 DB2 有商业支持,功能比较完善,售后支持比较好,适合金融行业技术人员比较懒的解决方案。 而 SQL Server 局限于微软平台,和 自家的 Windows Server && .net 是完美的组合。

那么流行关系型数据库中就剩下 MySQL 和 Postgresql 给我们选择。

  1. MySQL 是商业公司 Oracle 所有,前途未知,MySQL 创业人都离职写了新数据库。
  2. Postgresql 是开源社区所有,跟 Ruby,Rails 的优点很像
  3. 两者优势不一样,性能上 MySQL 快,功能上 Postgresql 强大。

再说一句:性能从来不是出在数据库上。 我选择 Postgresql

#9 楼 @twm 动态关联,片段缓存。现在在外面给不了详细例子。

@twm https://github.com/tombenner/nested-hstore 可以满足您的需求。

另外,json 类型也可以实现,不过性能差很多。

好消息,2014 年将发布 Postgresql 9.4 版本,其中 Hstore 类型的性能将超过现在的 MongoDB 参考:http://obartunov.livejournal.com/175235.html http://www.sai.msu.su/~megera/postgres/talks/hstore-dublin-2013.pdf

#11 楼 @Rei 谢谢,期待例子啊。

#12 楼 @winnie 谢谢,我瞧瞧 Postgresql

可以是试试 maridb

自己做的小应用推荐 mongodb, 这样连 memcache 都省了. 别再纠结了,我就是从 mysql + memcache 全盘用 mongodb 重写的。

#9 楼 @twm 没必要那样嵌进去,这些可以用 cache 来解决关联查询的问题

你不确定的时候一律 sql 当真正需要用到 mongdb 的特点时候你应该已经完全确定用哪个了

昨天看 ruby-china 源码,试着扩展,用脚手架新建一个 resource 后找半天找不到 migrate, 然后明了 mongoid 不需要了 migrate 了;然后找不到 id,再发现有个@huacnlee 写的模块需要 include。。

千万不要将 mongo 当关系用了。。。

postgresql 优点:

  1. 多种数据结构:list, hstore, json, GIS
  2. 多种存储过程:python, javascript, ruby(instable)

珍惜生命,远离 MongoDB。:trollface:

珍惜生命,远离 MySQL。:trollface:

MongoDB 适合有钱人,空间和内存占用相对都很大

http://sarahmei.com/blog/2013/11/11/why-you-should-never-use-mongodb/

看完这个你就可以确定到底要用哪个,Mongodb 和 Sinatra 一样,用法如果错误的话,绝对会处处碰壁的。

我是推荐 Postgresql。在 MySQL 被收购后,现在 Rails 社区已经全面倒向了 Postgresql,Rails 4 针对 Postgresql 有许多特性上的更新。如果没有特别对 MySQL 有历史上的依赖,新项目尝试使用 Postgresql 绝对是不错的选择。

嗯 postgresql,估计我们也得走 postgresql 啦

我也建议 PostgreSQL 的说。 MySQL 给收购后,其作者另开了一个叫 MariaDB 的东西,和 MySQL 很像,具体有什么不同可以看看他们的对比列表,像前段时间很多 Linux 的发行版都放弃 MySQL,用 MariaDB 替代,这就说明两者之间兼容性是很好的。

Postgres +1

如果是生产项目,我的建议是没弄明白前,还是选择关系型数据库好了,我们在使用 MariaDB。如果是自己折腾,那么随意了,都试试无妨。

建议在没有确定前,首选关系型数据库,绝大部分场景下它是最优选择。 当你确定业务模型确实需要 NoSQL 的特有功能来支撑时,再迁移也不迟,那时候你的规模也足够大,有足够的资金和人力来做改动。

还有疑问就千万不要用 MongoDB,这玩意除非你吃得非常透,不然你总归在一个时候得后悔自己为什么用这个

#4 楼 @Rei 话说 writings.io 不就是 MongoDB 咩~

你的那个用多态不就可以实现了么?这么说下来,你那个不是选数据库的问题,而是看你怎么去设计这个数据结构了。

你还可以设计成

notification = [
    {
      event: '在主题中提到了你',
      event_type: "topic",
      _id: 1,
      title: 'topic title',
      xxx: xx
    },
    {
      event: '在评论中提到了你',
      event_type: "comment",
      _id: 1,
      title: 'comment',
      xxx: xx
    },
   ]
}

MySQL 是有模式的,MongoDB 是无模式的 document 存储。通常选择数据库,不是由数据结构决定的,而是由你的项目需求来决定的。例如说:你的项目对事务性的要求很高,那你肯定得选 MySQL;如果只是一般的小项目,那其实选什么都可以。等等之类的。

用 pg 两者兼得。

新项目没必要用 mysql 了。

有很多关联的 model 就别用 mongodb 了,文档数据库的关键是 什么就存什么,存的时候就把东西内嵌好,所以才不需要搞 model 级别的缓存。mongodb 的原子操作必须保证修改都在同一个文档内,以前还见过在 mongodb 上重新自己实现跨表事务的做法,囧死了。

#36 楼 @luikore 这个一点都不囧,这个叫高大上的 EAV Pattern,没有资深架构师的水平根本玩不转

http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model

#36 楼 @luikore 明显不能兼得的。

MongoDB 和 pg 解决的不是同一个问题。

在 pg 里,一条记录无论如何都是需要有一个 master 的,不能连到 master 的节点是无法修改这条记录的。pg 只能保证能连到 master 的节点都能修改这条记录。

MongoDB,解决的是不同的问题。假设你有跨地理分布的多个数据中心,你想让尽可能多的来自不同数据中心的节点能修改某条记录。但是,假如你不能连到多数节点,你就不能修改任何一条记录。

#38 楼 @bhuztez 我觉得楼主就一台数据库服务器...

如果不知道该用哪个数据库,就用 Postgresql

#39 楼 @luikore 你怎么知道楼主不是土豪

#39 楼 @luikore 有可能是 VPS...

#37 楼 @bhuztez 应该叫 EAV Anti-Pattern 吧。

精力足够的话两个都用上吧~不冲突的

#10 楼 @winnie 请问 性能会出现在什么方面上?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号