C军

不玩博客了!

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  496 随笔 :: 0 文章 :: 634 评论 :: 571万 阅读

  多媒体文件已经广泛应用在很多程序当中。比如用户的头像,汽车的产品图片等等。

  从我个人以往的经验来看,将文件的路径存储入数据库,然后文件本身存储于硬盘当中已是万年不变的解决方案。

  其实,存储图片路径与存储图片文件本身,两种方案都有很好的立足点,但是大部分程序员都是将文件存储于数据库之外。虽然,这种方法没有什么大问题,但的确是存在一定的风险的。

一、问题描述

  下面就来论述一下关于将文件存储于数据库外部的缺点。

  1、垃圾回收问题。

    当你想删除一张图片时,你只能够删除掉数据库中的记录,图片文件是没有办法由SQL语句删除的,你必须在你的高级程序中维护着这些图片。保证在删除数据行的同时删除掉图片文件。

  2、文件不支持数据库备份工具

    当我们备份数据库的时候,是没有办法连同外部文件一起备份的。所以在备份时,必须使用文件系统备份工具来同时备份外部图片。

  3、文件不支持SQL的访问权限设置

    外部文件会绕开通过GRANT和REVOKE SQL语句设定的访问权限。SQL权限管理这对表和列的访问,但它们并不能应用到外部文件。

  4、图片路径不是SQL数据类型

    图片路径并不是SQL的数据类型,它只是一个字符串,数据库并不会验证这是否是一个有效的文件路径。如果这个文件被重命名、移动或者删除了,数据库并不会自动更新对应的路径。

  同样文件存储于数据库外部也有其优点:

  1、数据库在没有图片的时候能够经意很多,因为图片相比于简单数据类型说更大。

  2、当不包含图片时,备份数据库会更快并且备份的文件更小,虽然必须执行一次额外的文件备份,但比备份一个大型数据库更容易管理。

  3、图片如果存储于数据库之外,那么对图片的预览或者编辑就能够使用更简单直接的处理方式。比如,经常要编辑或修改图片,那么存储于数据库之外就是很好的选择。

二、解决方案 在需要时使用BLOB类型

  存储时,使用二进制BLOB存储文件。

  图片存储在数据库中,不需要额外加载,也就不会存在文件路径不正确的风险。

  删除一条记录的同时也删除了图片。

  更新记录的时候会加锁,因此不会有别的客户端并发更新图片。

  数据库备份会包含所有的图片。

  SQL权限控制对图片也有效。

  各种优缺点都有,依据自己的程序,斟酌选择正确的解决方案吧。

posted on   逆心  阅读(1787)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示