我即将为我正在从事的项目设计一个数据库。我需要存储多种类型的数据,如视频、照片、文本、音频。我必须存储它们并通过 php 我必须经常查询它们。我正在进行的这个项目是一个社交网络,我需要通过通知和消息来连接用户。这是一个问题:使用 NoSQL DB 存储数据和通知系统(如 MongoDB 和 Redis)或 MySQL 对这种系统也有帮助更有用吗?对不起我的英语,但是对于像我这样的英语初学者来说,技术性的东西很难解释。谢谢你们。
2 回答
你可以去任何一种方式。但是将二进制数据存储在数据库中通常不是最有效的路径。您最好将其存储在文件系统中并将路径放入数据库中。
SQL 技术(即 MySQL)的问题在于,通常您必须将二进制文本放在 BLOB 中,此时您已经做错了。
要考虑的另一件事是,无论是 MongoDB 还是 SQL,文件系统访问总是比数据库访问快,但是,数据库存储确实有一些优势。最终在您的网站上(如果它稍微受欢迎),您会发现您需要一个 CDN。这些类型的分发网络可能很昂贵,但是使用 MongoDB 之类的东西,您可以在其他区域启动数据的副本,并根据需要复制二进制数据(甚至可能 TTL 就像 CDN 一样)。
因此,这是一个需要考虑的领域,文件系统在大多数情况下并不是像社交网络这样的高负载站点的正确答案。然而,即使 facebook 本身也不能避免直接从文件系统提供服务,正如他们所说(https://blog.facebook.com/blog.php?post=2406207130,考虑到这篇文章已有 5 年历史但我很怀疑在这方面发生了变化):
我们还开发了我们自己的专用 Web 服务器,这些服务器经过调整,可以以尽可能少的磁盘读取来提供文件。即使有数千个硬盘驱动器,I/O(输入/输出)仍然是一个问题,因为我们的流量如此之高。我们的 squid 缓存有助于减少负载,但 squid 的速度和效率不足以满足我们的目的,因此我们也在编写自己的 Web 加速器。
然而,它们确实拥有非常大的基础架构,您很可能应该更喜欢考虑使用数据库存储还是 CDN。
我个人认为您应该对内容分发网络以及其他网站如何提供图像进行一些研究。您可以在 Google 上找到所有信息。您可以专门搜索 Facebook,直到最近,他们还在使用 Akamai 作为其 CDN。