Architecture 我应该在哪里储存照片?文件系统还是数据库?

Architecture 我应该在哪里储存照片?文件系统还是数据库?,architecture,photos,Architecture,Photos,可能重复: 我开始开发一个web应用程序,其主要目的是显示照片。用户也可以上传照片 出现的第一个问题是将照片存储在哪里:在文件系统还是数据库中 我将使用Windows box来托管该站点。数据库是MySQL,后端代码是C#使用ASP.NET MVC。通常,人们将二进制数据(如图像)存储在文件系统中,而不是数据库中。它们引用数据库中的文件系统路径。从数据库中检索blob(二进制大对象)比允许web服务器从文件系统中提供静态文件要慢。拥有blob数据库会让您的生活变得非常轻松。您应该忘记文件系统管

可能重复:

我开始开发一个web应用程序,其主要目的是显示照片。用户也可以上传照片

出现的第一个问题是将照片存储在哪里:在文件系统还是数据库中


我将使用Windows box来托管该站点。数据库是MySQL,后端代码是C#使用ASP.NET MVC。

通常,人们将二进制数据(如图像)存储在文件系统中,而不是数据库中。它们引用数据库中的文件系统路径。从数据库中检索blob(二进制大对象)比允许web服务器从文件系统中提供静态文件要慢。

拥有blob数据库会让您的生活变得非常轻松。您应该忘记文件系统管理这一噩梦

编辑

ID
瓦比诺


根据经验,这是管理二进制文件的有效方法。您有一个只有二进制文件的数据库。这怎么会更难备份呢?

我会使用类似AmazonS3的东西


但是,如果在文件系统和数据库之间进行选择,我会选择文件系统,因为它比数据库更快地从文件系统服务器映像。

当然是文件系统,除非您的目标是关于DailyWTF的故事。最简单的方法是按照可以从文件本身派生的属性组织照片,例如它的SHA-1散列。然后将散列存储在数据库中,附加到照片的主键和其他属性(上传者、上传日期等)

在文件系统中分割照片也是一个好主意,这样就不会在一个目录中有数百万个文件。所以你会有这样的东西:

storage/00/e4/f56c0de1c61fdb926e79e8a0a65bd12930c9.jpg
storage/25/9a/ec1c55bfb660548a6770238668c4b117d92f.jpg
storage/5d/d5/4b01d98f17a9ad9dd1526b49ba39b5aa37a1.jpg
storage/63/49/6f740b6c284ce6685dc17d473a7360ace249.jpg
storage/b1/75/066d178188dde110149a8422ab651b0ee615.jpg
storage/b1/20/a2b7d02b7b0c43530677ab06235382a37e20.jpg
storage/da/39/a3ee5e6b4b0d3255bfef95601890afd80709.jpg

如果您移动到分片存储,这也很容易移植。

我将照片作为blob放入数据库的唯一原因是如果我有一个服务器群集,并且我使用数据库复制将照片自动复制到群集中的每台机器上


如果只将照片存储为文件,并将照片的文件名存储在数据库中,生活会简单得多。如果需要为照片创建唯一的文件名,可以使用数据库中的主键整数作为文件名的一部分。但你也可以像约翰·米利肯建议的那样,只使用照片本身的散列。这很简单,而且简单更好。

一些人指出,如果所有内容都在数据库中,那么管理起来就更容易了:包括进行备份和保持引用完整性。

如果将其存储在数据库中,数据库将快速增长,并且将变得越来越大。从数据库中获取图像以供显示比从文件系统中获取图像要复杂得多。另一方面,您最好确保文件名和路径不会与数据库中存储的内容不同步。在过去,我选择存储在磁盘上而不是数据库上。这使我更容易将数据库移动到不同的框中。结果很好

对于我参与的一个项目,我们也做出了类似的决定。将内容(图像和其他臃肿的东西)塞进数据库中最引人注目的一点是,不太可能有人(有意或无意)删除/更改某些内容。但是,这不是我们做出的选择。相反,我们将路径信息存储在数据库中,并使用它通过UNC path引用数据。数据路径存储在两个部分中—一部分引用数据相对于其所在机器的位置,另一部分指向该组数据所在的机器。当我们需要移动数据时,我们可以更新适当的路径信息


在不从数据库中取出数据的情况下,获取数据肯定很快。最终,这是一个主要的决定因素。

如果你要建立一个关于照片的网站,那么就不要考虑数据库。如果它变得流行,你的数据库将受到沉重的打击,它的大部分时间将用于传送照片。此外,数据库的扩展性也不是很好。将它们保留在文件系统中有很多好处。您可以很好地扩展,使用静态内容服务器,使用服务进行内容交付

此外,AmazonS3或其他云提供商也有自己的优势。例如,S3+Amazon CloudFront将提供良好的性能。CloudFront将您的文件缓存在世界各地的服务器上,因此可以从任何地方轻松/快速地访问这些文件。但是如果我们讨论的是图片,而网站变得流行,你的账单可能会很高

对于S3,每次存储和每次云内外传输。
对于。

如果您使用的是SQL Server 2008,则有一种Filestream数据类型,可以处理前面提到的有关数据库变大的大多数问题。它处理文件系统和表之间同步的所有烦人细节


请在此处查找有关以下主题的博客帖子:

让圣战开始吧……@Locksfree可能有数千张图片。可能会更多,这取决于人们是否实际使用该网站。在你需要备份数据库之前,令人惊讶的是,它有成千上万的二进制垃圾与元数据混合在一起。是的,这应该是任何软件体系结构的主要目标……让开发人员的“生活如此轻松”。忘记那些必须处理多TB数据库的操作人员,或者那些必须等待图像从用于存储数据而不是图像的服务器中取出的用户。你们提供了不存储二进制数据的无效理由。这是多年来一直流传的老生常谈。请告诉我如何使用文件系统更高效或更具可扩展性?文件系统是一个数据库——一个恰好从一开始就被设计用来存储文件/文档的系统,而不是关系存储最初用于存储的小而重复的字段。您可以使用