可能重复:
storing uploaded photos and documents - filesystem vs database blob
我开始开发一个网络应用程序,其主要目的是显示照片。用户也可以上传照片。
出现的第一个问题是在哪里存储照片:在文件系统或数据库上。
我将使用Windows框来托管该网站。数据库是MySQL,后端代码使用ASP.NET MVC在C#中。
答案 0 :(得分:28)
文件系统,当然,除非你的目标是关于thedailywtf的故事。最简单的方法是让照片按照您可以从文件本身派生的属性进行组织,例如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
如果您转移到分片存储,这也很容易移植。
答案 1 :(得分:4)
如果您要围绕照片构建网站,请忘记数据库。如果它变得流行,你的数据库将受到重创,其大部分时间将用于提供照片。数据库也不能很好地扩展。将它们保存在文件系统上有很多优点。而且,您可以使用静态内容服务器,使用内容交付服务进行扩展。
此外,Amazon S3或其他云提供商确实有其优势。例如,S3 + Amazon CloudFront将提供良好的性能。 CloudFront将您的文件缓存在世界各地的服务器上,因此可以从任何地方轻松/快速地访问它们。但是,如果我们正在谈论图片并且网站变得流行,那么您的账单可能会非常高。
对于每个存储的S3 Amazon charges以及每次进出云的传输。 对于CloudFront per transfer。
答案 2 :(得分:4)
如果您使用的是SQL Server 2008,则会有一个Filestream数据类型可以处理有关数据库变大的大部分问题。它处理文件系统和表之间同步的所有恼人细节。
在这里查看有关该主题的博文:Store any data in SQL Server 2008 (Katmai)
答案 3 :(得分:3)
通常,人们将二进制数据(如图像)存储在文件系统上,而不是数据库中。它们引用数据库中的文件系统路径。从数据库中检索BLOB(二进制大对象)比允许Web服务器从文件系统提供静态文件要慢。
答案 4 :(得分:3)
我会使用像Amazon S3这样的东西。
但是,如果选择在文件系统和数据库之间,我会选择文件系统,因为从文件系统服务器映像比使用数据库更快。
答案 5 :(得分:3)
我将照片作为BLOB放在数据库中的唯一原因是,如果我有一个服务器集群,并且我使用数据库复制来自动将照片复制到集群中的每台机器。
如果您只是将照片存储为文件,并将照片的文件名存储在数据库中,那么生活就会简单得多。如果需要为照片创建唯一的文件名,可以使用数据库中的主键整数作为文件名的一部分。但是你也可以像John Milliken所建议的那样使用照片本身的哈希值。这很简单,也很简单。
答案 6 :(得分:3)
有些人指出,如果数据库中的所有内容都更容易管理:包括进行备份和保留参照完整性。
答案 7 :(得分:3)
如果将它存储在db中,db将快速增长并且会更大,更大。从数据库中获取图像以进行显示只是一种触摸更复杂,然后是从文件系统获取它。另一方面,您最好确保文件名和路径不会与db中存储的内容不同步。在过去,我选择存储在磁盘而不是数据库。这使我更容易将数据库移动到不同的框中。工作得很好。
答案 8 :(得分:2)
当你拥有一个blob数据库时,它会让生活变得如此简单。你应该忘记文件系统管理的噩梦。
修改强>
ID
VARBINARY
根据经验,这是管理二进制文件的有效方法。您有一个只有二进制文件的数据库。这怎么可能更难备份?
答案 9 :(得分:2)
我们有一个类似的决定,为我正在进行的项目。关于将东西(图像和其他BLOBy东西)干扰到数据库中的令人信服的事情是,某人可能不太可能删除/改变某些东西(无论是有意还是无意)。但是,这不是我们做出的选择。相反,我们将路径信息存储在数据库中,并使用它通过UNC路径引用数据。数据路径存储在两个部分中 - 一部分引用数据相对于它所驻留的机器的位置,一部分指向该数据组所在的机器。当我们需要移动数据时,我们可以更新相应的路径信息。
在不退出数据库的情况下获取数据肯定很快。最终这是一个重要的决定因素。