多媒体文件已经普遍应用在不少程序当中。好比用户的头像,汽车的产品图片等等。javascript
从我我的以往的经验来看,将文件的路径存储入数据库,而后文件自己存储于硬盘当中已经是万年不变的解决方案。html
其实,存储图片路径与存储图片文件自己,两种方案都有很好的立足点,可是大部分程序员都是将文件存储于数据库以外。虽然,这种方法没有什么大问题,但的确是存在必定的风险的。java
下面就来论述一下关于将文件存储于数据库外部的缺点。git
一、垃圾回收问题。程序员
当你想删除一张图片时,你只可以删除掉数据库中的记录,图片文件是没有办法由SQL语句删除的,你必须在你的高级程序中维护着这些图片。保证在删除数据行的同时删除掉图片文件。数据库
二、文件不支持数据库备份工具并发
当咱们备份数据库的时候,是没有办法连同外部文件一块儿备份的。因此在备份时,必须使用文件系统备份工具来同时备份外部图片。数据库设计
三、文件不支持SQL的访问权限设置工具
外部文件会绕开经过GRANT和REVOKE SQL语句设定的访问权限。SQL权限管理这对表和列的访问,但它们并不能应用到外部文件。post
四、图片路径不是SQL数据类型
图片路径并非SQL的数据类型,它只是一个字符串,数据库并不会验证这是不是一个有效的文件路径。若是这个文件被重命名、移动或者删除了,数据库并不会自动更新对应的路径。
一样文件存储于数据库外部也有其优势:
一、数据库在没有图片的时候可以经意不少,由于图片相比于简单数据类型说更大。
二、当不包含图片时,备份数据库会更快而且备份的文件更小,虽然必须执行一次额外的文件备份,但比备份一个大型数据库更容易管理。
三、图片若是存储于数据库以外,那么对图片的预览或者编辑就可以使用更简单直接的处理方式。好比,常常要编辑或修改图片,那么存储于数据库以外就是很好的选择。
存储时,使用二进制BLOB存储文件。
图片存储在数据库中,不须要额外加载,也就不会存在文件路径不正确的风险。
删除一条记录的同时也删除了图片。
更新记录的时候会加锁,所以不会有别的客户端并发更新图片。
数据库备份会包含全部的图片。
SQL权限控制对图片也有效。
各类优缺点都有,依据本身的程序,斟酌选择正确的解决方案吧。