存储上传的照片和文档 - 文件系统 vs 数据库 blob
我开始开发一个 Web 应用程序,其主要目的是显示照片。用户也可以上传照片。
首先需要解决的问题是在哪里存储这些照片:文件系统还是数据库。
我将使用 Windows 主机托管该站点。数据库是 MySQL,后端代码使用 ASP.NET MVC 实现的 C#。
我开始开发一个 Web 应用程序,其主要目的是显示照片。用户也可以上传照片。
首先需要解决的问题是在哪里存储这些照片:文件系统还是数据库。
我将使用 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
如果你将来需要迁移到分片存储,这也很容易移植。
通常情况下,人们将像图片这样的二进制数据存储在文件系统中,而不是数据库中。他们通过文件系统路径引用数据库中的数据。从数据库检索二进制大对象(BLOBs)比允许Web服务器从文件系统提供静态文件速度更慢。
我会使用类似亚马逊S3的服务。
但是,如果选择在文件系统和数据库之间,我会选择文件系统,因为从文件系统提供图片比从数据库提供更快。
只有当我拥有一组服务器并且正在使用数据库复制将照片自动复制到群集中的每台机器时,我才会将照片作为BLOBs存储在数据库中。
如果您只是将照片存储为文件,并在数据库中存储照片的文件名,则生活会更加简单。如果您需要为照片创建唯一的文件名,可以使用数据库的主键整数作为文件名的一部分。但是,您也可以像John Milliken建议的那样,仅使用照片本身的哈希值。这很简单,而且简单通常更好。
有些人指出,如果所有的东西都在数据库中,包括备份和保留引用完整性,那么管理起来会更容易。
当你拥有一个Blob数据库时,生活变得非常容易。你应该忘记文件系统管理所带来的噩梦。
编辑
ID
VARBINARY
从经验来看,这是一种有效管理二进制文件的方法。你只需要一个只包含二进制文件的数据库。这样备份会更加困难吗?