在MySQL数据库中存储图像文件或URL链接,哪种更好?

8

可能是重复问题:
在数据库中存储图像-是还是不是?
数据库中的图像 vs 文件系统

我正在使用 RIA 技术(Flex + PHP + MySQL + Ajax)开发 Web 应用程序,现在我对图像文件有些犹豫。

我在我的 Flex 应用程序中使用了一些图像,所以我认为“如果我将它们存储到数据库中,然后从数据库中检索出来会很棒;因此,维护过程应该更容易”。但是,这里是我的困境:

我应该存储图像的物理 URL,还是直接存储图像会更好?

例如,我的 Cars 表格应该看起来像这样:

ID(自动编号)| Source(文本)

还是像这样?

ID(自动编号)| Image(longblob 或 blob)

我知道这里有很棒的人可以回答我的问题,解释一下哪个更好,为什么更好 :)


网址链接,绝对更好。 - Mob
6个回答

6
我个人建议将图像存储在数据库中。当然,这样做有优点也有缺点。
将BLOB数据存储在数据库中的优点:
- 更容易将BLOB数据与行中的其他项保持同步。 - BLOB数据随着数据库一起备份。使用单一存储系统可以简化管理。 - 可以通过MySQL中的XML支持访问BLOB数据,该支持可以在XML流中返回数据的base 64编码表示。 - MySQL全文搜索(FTS)操作可以针对包含固定或可变长度字符(包括Unicode)数据的列执行。您还可以针对图像字段中包含的格式化基于文本的数据执行FTS操作,例如Microsoft Word或Microsoft Excel文档。
将BLOB数据存储在数据库中的缺点:
请仔细考虑哪些资源最好存储在文件系统而不是数据库中。很好的例子是通常通过HTTP HREF引用的图像。这是因为:
- 从数据库检索图像与使用文件系统相比会产生显着的开销。 - 数据库SAN上的磁盘存储通常比Web服务器农场中使用的磁盘存储更昂贵。

我对数据库不是很精通,但是结果缓存和数据库服务器的RAM使用情况怎么样?由于blob将全部加载到RAM中,这不会大幅增加吗? - Vinicius Kamakura

4

一般来说,为了提高数据库的性能(以及备份效果),您应该保持数据库尽可能小。因此,如果您只能在数据库中存储文件系统引用(路径+文件名)或URL,则更好。


不同意。如果正确管理,大型数据库可以像小型数据库一样运行良好。数据库也是存储图像的理想平台;直接从数据库访问这些图像可以解决在使用较大系统时遇到的许多问题,例如使用多个Web服务器时必须开始使用共享存储(具有自己的问题)或复制文件(更多问题)。 - ChrisBint
1
如果你有一个网络画廊,例如,将图像存储在数据库中,那么所有的工作和流量都必须通过数据库服务器进行。如果你存储路径/URL,你可以与你所谈论的多个Web服务器共享负载。但每种情况都需要不同的方法,因此我说这是一条通用规则而不是一条铁律。 - Vinicius Kamakura
你不能通过多个服务器来“共享负载”,因为你需要找出如何共享文件。 NFS?不行...如果你丢失了NFS共享,那怎么办呢?至少使用数据库,你可以同步它们并在需要时使用主从备份。 - sdot257
@luckytaxi 是的,你可以这样做。同步目录中的文件有几个选项,其中rsync是一个常见的例子。仅仅因为你不知道怎么做,就不要以为其他人也不会。 - Vinicius Kamakura
@hexa 哈哈,认真的吗?rsync很好用,我也经常使用它,但如果你想走这条路线,还有更好的选择。你将如何推送/拉取数据?你什么时候执行此操作?rsync只是单向的,那么如果B与A不同,而A是授权服务器,会发生什么情况?我建议你考虑Unison或类似DRDB的东西,这些更可靠,适用于集群环境。 - sdot257

4

这可能是个人偏好的问题。

通常来说,保持数据库小一些会更好。但是在企业应用中,他们经常直接将图像添加到数据库中。如果您将它们放在文件系统中,数据库和文件系统可能会失步。

较大的CMS通常会将这些文件放入数据库中。但是要注意,当所有内容增长时,这需要更大的数据库大小...

当您仅保存URL和名称时,请确保它们将来不会更改。

使用存储在数据库中的文件,您可以更轻松地实现安全性,并且无需担心重复的文件名。


1

我曾经将路径存储到URL中,但是添加另一个Web服务器并不理想。首先,您必须共享图像存储的路径。我们使用NFS,一段时间后变得很慢。我们尝试将文件从一个Web服务器同步到另一个Web服务器,但这个过程变得繁琐。

话虽如此,我会将它们存储在数据库中。我已经将所有的图像/文件存储转移到了MongoDB。我知道这不能满足您的需求,但我们已经尝试了所有其他解决方案(甚至是S3),但我们对其他解决方案都不满意。如果必须这样做,我肯定会将它们放在MySQL中。


1

就我个人而言,我一直将URL存储。

没有真正的理由不将图像直接存储在数据库中,但是不将其存储在数据库中有好处。

当您不将图像存储在数据库中时,您会获得更多的灵活性。您可以轻松地移动它并只需更新文件中的URL。因此,如果您想将图像从Web服务器移动到Flickr或Amazon Web Services等服务,则只需更新链接以链接到新文件。这也为您提供了易于访问的内容交付网络,以便更快地将图像传递给最终用户。


0

我会存储URL,因为它是更少的数据,这意味着更小的数据库和更快的数据获取;)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接