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