Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql v mongodb-针对以用户为中心的复杂站点的最佳解决方案?_Mysql_Mongodb_Performance_Scale_Database - Fatal编程技术网

mysql v mongodb-针对以用户为中心的复杂站点的最佳解决方案?

mysql v mongodb-针对以用户为中心的复杂站点的最佳解决方案?,mysql,mongodb,performance,scale,database,Mysql,Mongodb,Performance,Scale,Database,我花了几天时间研究了mysql与nosql解决方案(特别是mongodb)在我的项目中的利弊 该项目需要能够最终扩展到同时处理数万个用户——总计数百万个用户。该网站以用户为中心,如果不超过facebook这样的网站,也会与数据库进行交互——这是一个非常相关的网站,所有功能都取决于与用户的关系以及他们与其他用户的关系。它也是数据密集型的——大量的文件、图像、音频、消息、个人新闻提要等 我非常喜欢mongodb上的外观,我喜欢它的工作方式,我喜欢它的扩展方式,但我无法理解这对于我描述的网站是如何工作

我花了几天时间研究了mysqlnosql解决方案(特别是mongodb)在我的项目中的利弊

该项目需要能够最终扩展到同时处理数万个用户——总计数百万个用户。该网站以用户为中心,如果不超过facebook这样的网站,也会与数据库进行交互——这是一个非常相关的网站,所有功能都取决于与用户的关系以及他们与其他用户的关系。它也是数据密集型的——大量的文件、图像、音频、消息、个人新闻提要等

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

不过,我对使用mysql非常满意,并且喜欢它的关系方面。我只是担心如果没有大量的工作,这个项目会出现可伸缩性问题——尽管也许使用memcached和sharding这不会是一个问题


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

没有法律规定必须使用一个数据库构建应用程序。通常的做法是为特定任务提供专用后端。例如,在类似Facebook的应用程序环境中,使用图形数据库来存储用户之间的关系可能是有意义的——每个数据库都有其优缺点,只有傻瓜才会用RDBMS或NoSQL db实现大型后端,因为他们不太清楚。

如果数据高度相关,使用关系数据库。如果不是,就不要。NoSQL很棒,别误会,但它并不适合所有任务。它可能适合您的任务,但唯一的方法是为您的特定用例构建一些测试。添加一组虚拟数据(数百万行,如果不是数亿行的话)。然后对其进行负载测试

就扩展而言,这更多地是构建应用程序的一个组成部分,而不是您选择的后端。你有一个可靠的模式吗?您是否有具有直写缓存的强缓存层?您是否尽可能高效地访问后端(查询等)?你能根据你的应用程序进行切分吗


这些问题在这里是合适的。而不是“哪个对我更有利”。而不是“哪个是正确的工具”。两者都能胜任这项工作。哪个是最好的取决于你…

显然,这里没有银弹。然而,我想挑战你的一个假设:

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

好的,我想让你们想象一下,在一个关系数据库中有1亿用户,然后开始构建这个模型。让我们尝试一些简单的方法,获取用户朋友的姓名

你如何获得用户的朋友?好的,您可以转到
用户\u朋友
表。如果每个用户只有10个好友,那么该表将包含10亿行。如果用户有一个更合理的100个好友,那么您现在有10B行

现在您有了一个用户和他们的朋友ID列表。我们怎么知道他们朋友的名字?好吧,你浏览了100个ID的列表,然后把每个朋友都拉下来。太好了

现在,如果你想向一个用户显示他们所有朋友的名字,你所要做的就是将100M记录表加入10B记录表。这不是一项简单的任务。随着数据集的增长,伸缩联接变得越来越困难,成本也越来越高

因此,为了简化此过程,您可能要运行
for
循环,并手动收集每个朋友的记录。您必须这样做,因为朋友分散在多个服务器上,所以每个“查找”都必须单独完成

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

朋友名单呢?保存一张10B记录表真的实用吗?为什么不为每个用户保留一个好友ID列表?为什么要进行额外的查询

如果您注意到这里的模式,我们基本上已经将“非常相关”的模型分解为有效的键值查找。当然,关键价值模型的伸缩性会更好。因此,MongoDB似乎很适合这里


别误会,关系数据库有很多很好的用途。但是,当您谈到处理数百万个单独的键值样式请求时,您可能想看看NoSQL数据库。

我经常在100万行表和50亿行表之间运行联接。你能确切地解释一下为什么连接根本不起作用吗?特别是因为RDBMS系统在世界各地的庄园中每一天的每一秒都在使用……MongoDB中的键值查找与在RDBMS中通过主键检索每个原始数据有什么不同?只是好奇。这听起来不错,而且很有意义——所以在mongodb中,因为我们没有连接,那么每个用户以及与他们相关的所有数据都必须在一个文档中吗?还是因为每个文档只能有4mb,更可能是每个用户一个集合?因此,我们将拥有一个名为user_[name]的集合和一个名为friends?的文档@colin:MongoDB文档现在的大小已达到16MB(从1.8.0开始)。4MB=100份《战争与和平》,这是很多文本。您可能可以使用一个用户集合。另外,您可以合理创建的集合数量也有限制。@这是真的!如果每个用户都可以上传无限量的照片/音频呢?我也是新手,但我的印象是无论你的应用程序如何设置,Mongo都会进行切分。T