【问题标题】:Would MongoDB be a good idea for a social network site (developed in Ruby on Rails)?对于社交网站(使用 Ruby on Rails 开发)来说,MongoDB 会是一个好主意吗?
【发布时间】:2011-06-30 23:37:13
【问题描述】:

我的项目(在 Ruby on Rails 3 中)是开发一个具有以下功能的“社交网络”网站:

  • 用户可以成为朋友。这是相互的友谊;不像 Twitter 那样不对称。
  • 用户可以发布链接,进行分享。用户的朋友可以看到该用户分享的内容。
  • 朋友可以对这些共享链接发表评论。

所以基本上我们有用户、链接和评论,以及所有相关的东西。社交网络中一个有趣的事情是 User 表与其自身具有一种多对多的关系。

我认为我可以使用 SQL 和 RoR 处理这种复杂程度。

我的问题是:在这样的网站上使用 MongoDB(或 CouchDB)是个好主意吗?

说实话,我认为答案是否定的。 MongoDB 似乎不太适合多对多关系。我想不出一个好的 MongoDB 方式来实现友谊关系。而且我读过 Diaspora 从 MongoDB 开始,但后来又切换回经典 SQL。

但网络上的一些文章为 MongoDB 为社交网络辩护,最重要的是,我想做出一个明智的决定,不要错过 MongoDB 的一个非常酷的方面,它会改变我的生活。

另外,我听说过 graph DB,它可能很棒,但它们对我来说似乎太年轻了,我不知道它们如何适应 RoR(更不用说 heroku)了。

那么,我错过了什么吗?

【问题讨论】:

  • 这可能会帮助您选择:blog.nahurst.com/visual-guide-to-nosql-systems
  • @JimmyCuadra :我必须说我并没有真正理解架构。我想我对数据库的了解还不够,无法真正了解该三角形 3 边的利害关系。不过还是谢谢你!

标签: sql ruby-on-rails mongodb social-networking nosql


【解决方案1】:

我喜欢 MongoDB 并经常使用它,但我认为,如果您正在处理关系数据,则应该使用正确的工具。为此,我们有关系数据库。 Mongo 和 Couch 是文档存储。

如果你要维护大量的文档间链接,Mongo 有一个严重的缺点。只保证对一个文档的写入是原子的。因此,如果您对架构不小心,您可能会对关系进行不一致的更新。

MongoDB 的好处在于它非常擅长扩展。您可以分片和创建副本集。 Foursquare 目前使用的是 MongoDB,而且对他们来说效果很好。 MongoDB 还可以进行 map-reduce 并具有不错的地理空间集成。开发 MongoDB 的团队非常出色,我住在他们所在的纽约并遇到了他们。尽管我会考虑开始,但您可能不会遇到扩展问题。

至于侨民转换...我不想关注他们正在做的任何事情:)

不过,您对图形数据库的评论很有趣。我可能也不会使用图形数据库作为我的主数据库,但是在处理关系时,你可以用它们做一些令人惊奇的事情。事实上,通常来自图形数据库公司的人会给你的演示是从社交网络中提取关系知识。但是,没有什么可以阻止您将来使用这些进行网络分析。

总之,当您从这里开始时,您还没有遇到大规模的问题,并且可能在时间和金钱上受到限制。请记住,即使 Facebook 也不仅仅使用一种技术,它们基本上已经扩展到 NoSQL 以实现某些功能(如 Facebook 消息传递)。将来没有什么可以阻止您使用 Mongo 和 gridFS 来处理图像上传或地理位置等。随着您的需求变化而增长是件好事。我认为您的直觉认为您在这里有一个 SQL 应用程序是正确的,而使用 MongoDB 获得的好处暂时不会实现。

【讨论】:

  • 谢谢。我想我是 MongoDB 炒作的受害者……是的,我也有一种想法,即为每个功能使用最适合其目的的数据库(那是英语吗?)。但我担心它会造成混乱。无论如何,对于我项目的核心功能,我将坚持使用一种数据库解决方案,那就是 SQL。感谢您的回答。
  • 另外,出于好奇,为什么对 Diaspora 发表如此尖锐的评论?我没有关注他们的故事
  • @arthur 在 9 月他们发布了一些代码,表明他们不知道自己在做什么。即使是新手程序员也会知道一些重大的安全问题。一些人在发布 alpha 软件时为它辩护,但如果您创建了一个删除控制器并且不检查授权(即任何登录的人都可以删除任何帐户),那么就会出现问题。 (这是众多问题之一)kalzumeus.com/2010/09/22/… 总结得很好。
  • @MichaelPapile 我认为数据建模和安全是两个完全不同的领域。一位 Diaspora 开发人员写了一篇关于为什么 mongodb 不适合他们的深思熟虑的文章:sarahmei.com/blog/2013/11/11/why-you-should-never-use-mongodb
  • @mehaase 我同意那篇博文中所说的很多事情,但这是因为他们看不到他们的数据不适合文档存储。很多人都有这个问题,但使用 mongo 是因为它被作为一个通用数据库销售,而实际上它不是。我坚持这样的说法,即我认为 Diaspora 程序员不知道他们在 2 年前在做什么。他们可能从那时起就学会了。我知道它们是不同的领域,但我希望开发人员对两者都有非常基本的了解。
【解决方案2】:

我的建议是使用您最熟悉的任何内容,以便您可以快速启动和运行。从您的问题来看,这听起来像是 SQL 而不是 MongoDB。

【讨论】:

  • 再想一想:这样想,你永远学不会新东西!
  • 是的,但这取决于您的目标。你的目标是学习新事物还是完成一个项目?听起来你的目标是后者,这就是为什么我建议使用你所知道的。另一方面,如果您的目标是学习一项新技术,那么请务必使用 MongoDB。
【解决方案3】:

Riak 是一个有趣的可能性。它是键值存储和图形数据库之间的交叉。 userID 可以是您的密钥,而 cmets 和链接可以存储在您的值中。但是Riak 也有密钥对密钥linking。这可用于将您的用户连接为朋友。链接是不对称的,因此您需要处理两个方向的添加和删除,但这应该不会太难。

但请注意,Riak 不是文档数据存储,这意味着它与值无关,这意味着它不会帮助您提取值的内部部分,这意味着如果您想提取注释,则需要首先检索与用户一起存储的每个评论和链接。

您可能还想查看其他图形数据库。社交图是图数据库的典型用例。

【讨论】:

  • Sean Cribbs 为 Riak 创建了名为 Ripple 的出色 Ruby 客户端。 seancribbs.com
【解决方案4】:

抱歉,您必须开始学习图表。使用以 JSON 格式吐出数据的图形数据库并将其写入您的 Mongodb 数据库。您正在处理一个网络,这意味着必须有某种图形可以让您创建一个自我(例如用户)或焦点或逻辑中心,连接到它周围的其他节点。节点可以是特定用户的属性,例如姓名、喜欢、朋友、图片等。如果你要绘制它,自我图将类似于中心和辐条。

进一步阅读,你可以参考 Facebook 如何实现它的 Graph API - https://developers.facebook.com/docs/graph-api/overview/

这里尝试连接 Mongodb 和 Neo4j 图数据库 - https://neo4j.com/developer/mongodb/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多