存储个人资料图片。 (数据库或文件系统?)[重复]

Posted

技术标签:

【中文标题】存储个人资料图片。 (数据库或文件系统?)[重复]【英文标题】:Storing profile pictures. (Database or Filesystem?) [duplicate] 【发布时间】:2011-06-10 02:40:27 【问题描述】:

可能重复:Storing Images in DB - Yea or Nay?

我需要存储个人资料图片。很多。

我不确定是否应该将它们存储在数据库中。我什至不确定这是否是一个好主意,或者我是否应该将它们存储在服务器上的单独目录中,并禁止使用 HTAccess 访问它们。

但我对 HTAccess 并不太熟悉,当我使用 sn-ps 禁止访问文件夹时,它就从来没有工作过。

我使用 winhost.com 来托管我的网站,所以我认为 HTAccess 可以工作。

谁能建议哪种方式更适合在单个服务器上存储数以万计的个人资料图片?我已经阅读了很多我在 Google 上找到的博客、论坛帖子等,并且有点困惑,因为其中一半建议一件事,另一半不同意并建议使用数据库就可以了。

【问题讨论】:

【参考方案1】:

我绝对会支持只在数据库中存储图像路径。存储图像数据会降低您的网站速度并给您的系统带来额外的压力。

如果您计划移动网站,我可以想象将图像数据存储在数据库中的唯一优势是。然后你就不用担心文件路径等了。

【讨论】:

【参考方案2】:

个人经验表明,在数据库中存储大量图像会使数据库的备份速度非常慢。当您开始运行可重复的测试或更新数据库模式并且您想要进行临时备份时,以及在一般情况下,这可能会令人恼火。此外,根据数据库,存储 blob(这不可避免地意味着您要存储非固定长度的行)会使查询表变得非常慢 - 尽管可以通过适当的索引轻松修复。

如果您将它们存储在文件系统中并按照您的建议直接使用您的网络服务器提供它们,您会发现一个问题是如果您只想让登录用户看到它们,如何适当地访问控制它们。这取决于您的应用程序的设计,可能不是问题。

另外两个选项:

您可以将它们存储在文件系统中并使用应用程序页面为它们提供服务,以便它可以例如在获取图像并将其发送给客户端之前检查访问控制。

如果您的网络服务器支持它们在文件系统上提供文件,您可以使用 X-SendFile: 标头 - 应用程序页面告诉网络服务器要获取的文件,网络服务器将获取文件并发送它。如果您使用例如,应用程序和图像文件可能存在于不同的机器上。 FastCGI,并且图像永远不会通过 FastCGI 连接发送。

您可能还需要考虑缓存 - 如果您编写任何编程方式来发送文件,则需要添加额外的逻辑以便浏览器可以缓存图像,或者您最终只会提供一遍又一遍的图像,并增加您的带宽成本。

【讨论】:

【参考方案3】:

有一个权衡 - 这将取决于您的具体情况和需求。每种方法的好处包括

文件系统

性能,尤其是缓存和 I/O

数据库

更容易横向扩展到多个 Web 服务器 更易于管理(备份、安全等)

我猜您正在使用 mysql,但如果您有 SQL 2008 数据库,请查看 FileStream in this SO 文章 - 这是两全其美的选择。

【讨论】:

谢谢,正是我需要的那种链接!我正在使用 MySQL,但这只是早期阶段,因为我对 SQL 08 有更多的经验,所以我可以转换。

以上是关于存储个人资料图片。 (数据库或文件系统?)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

个人资料图片-如何存储[重复]

我应该将图像存储在数据库还是文件夹中? [复制]

zend框架,我可以在其中存储个人资料图片或其他用户上传的图片的路径

使用 mvc3 将图像保存到文件系统

将 ios 或 Android 应用程序中的图像设置为 Facebook 个人资料图片(使用 Facebook API)[重复]

了解 MongoDB 限制 [重复]