mysql v mongodb - 针对复杂的用户聚焦网站的最佳解决方案?

时间:2011-02-18 17:16:52

标签: mysql mongodb performance scale database

我花了几天时间研究 mysql nosql 解决方案(特别是 mongodb )的优缺点,用于我的项目。< / p>

项目需要能够最终扩展以处理成千上万的并发用户 - 总共数百万用户。该网站非常注重用户,并将与数据库进行交互,如果不是像Facebook这样的网站 - 它是非常关系的,所有功能都取决于与用户的关系以及他们与其他用户的关系。它也是数据繁重 - 大量的文件,图像,音频,消息,个人新闻提要等。

我非常喜欢 mongodb 的外观,我喜欢它的工作方式,我喜欢它的扩展方式 - 但无法理解这对于诸如我描述。是否必须将特定用户的所有交互存储在单个文档中?

然而,我使用 mysql 并且喜欢它的关系方面非常舒服。我只是担心没有很多工作,这个项目会出现可扩展性问题 - 虽然可能有memcached和分片这不会是一个问题吗?

我想从那些有大型项目的两个数据库经验的人那里了解一下, mysql mongodb 哪个是这个特定工作的合适工具?

3 个答案:

答案 0 :(得分:5)

如果数据是高度相关的,请使用关系数据库。如果不是,请不要。 NoSQL很棒,不要误解我的意思,但它不适合所有任务。它可能适合您的任务,但找到的唯一方法是为您的特定用例构建一些测试。添加一堆虚拟数据(数百万甚至数亿行)。然后加载测试它。

就扩展而言,这更像是构建应用程序的一个组件,而不是您选择的后端。你有一个可靠的架构吗?你有一个强大的缓存层与直写缓存?您是否尽可能高效地访问后端(查询等)?你可以根据你的申请进行分类吗?

这些是适合的问题。不是“哪个会更适合我”。而不是“哪个是正确的工具”。两个都可以完成工作。哪个最好取决于你...

答案 1 :(得分:4)

显然,这里没有银弹。但是,我想挑战你做出的这个假设:

  

...它非常关系,所有功能都取决于与用户的关系以及他们与其他用户的关系......

好的,我希望您在关系数据库中拥有100M用户并开始构建此模型。让我们尝试一些简单的方法,抓住用户朋友的名字。

你如何得到用户的朋友?那么你去users_friends表。如果每个用户甚至只有10个朋友,那么该表包含十亿行。如果用户有更合理的100个朋友,那么现在你有10B行。

所以现在你有了一个用户和他们的朋友ID列表。我们如何得到他们朋友的名字?那么你浏览100个ID列表并拉下每个朋友。完美。

现在,如果你想向一个用户展示他们所有朋友的名字,你所要做的就是将100M记录表加入到10B记录表中。 这不是一项简单的任务。随着数据集的增长,扩展连接变得更加指数级和更昂贵。

因此,为了使这更容易,您可能会运行for循环并手动收集每个朋友的记录。你必须这样做,因为朋友分散在多个服务器上,因此每个“查找”都必须单独完成。

你已经破坏了你的“关系模型”。

朋友名单怎么样?保持一张10B记录真的很实用吗?为什么不保留每个用户的朋友ID列表?为什么要额外查询。

如果你注意到这里的模式,我们基本上将“非常关系型”模型分解为有效的键值查找。当然,键值模型的扩展性会更好。所以, MongoDB 似乎非常适合这里。

不要误解我,关系数据库有很多好的用途。但是,当您谈论处理数百万个单独的键值样式请求时,您可能希望查看NoSQL数据库。

答案 2 :(得分:0)

没有法律规定您必须使用一个数据库构建应用程序。通常的做法是为特定任务提供专用后端。例如。在类似Facebook的应用程序的上下文中,使用图形数据库来存储用户之间的关系可能是有意义的 - 每个数据库都有它的优点和缺点,并且只会愚弄只使用RDBMS或仅使用NoSQL数据库来实现大型后端因为他们不知道更好。