DB中的Blob或指向文件的指针


Blob in DB or pointer to file?

可能重复:
何时将图像存储在数据库(mySQL(中,何时不存储?(将图像链接到数据库中的项目(
在服务器上存储文件的最佳方法是哪种(在数据库中还是单独存储位置(?

在用数据库存储MP3和PDF之间,我应该考虑什么是最好的选择。将文件作为BLOB存储在DB中更好吗?还是只提供一个允许我查看文件系统的字段更好?

有问题的文件不太可能超过15MiB,但都可能至少是1MiB,以防这是一个考虑因素。

数据将通过PHP访问,如果这有区别的话。。。

编辑:我将使用我已经在做的:(文件系统上的资源和数据库中的文件名。谢谢你的意见!

在过去的3年里,我一直在做一个项目,其中大型附件存储在数据库中。

优点

  • 管理数据库中的记录比处理相关文件更容易,代码更少
  • 即使使用CakePHP的行为来自动化任务。数据库更容易
  • 有些项目有将数据保存在数据库中的安全要求(即使这并不能真正提高安全性(
  • 自动化的构建过程可以很容易地备份数据,因为数据已经在数据库中了

缺点

  • 获取数据库快照进行开发是一件痛苦的事
  • 在你通过几GB大小之后。不管别人告诉你什么。你会开始担心DB引擎是否能处理它
  • 转储数据库开始需要很长时间
  • 数据迁移到不同的模式开始需要非SQL解决方案

DB Blob的神话

  • 您的数据库无法处理较大的数据库文件大小
  • 硬盘上的一个坏扇区意味着你可能会丢失所有的blob数据
  • 存储在数据库中会带来性能成本
  • 它更安全
  • 从数据库中读取并发送到客户端的速度比读取并发送文件的速度慢

以上所有(根据我的经验(都是错误

关于大斑点的事实

  • 总有一天,你不再希望它出现在数据库中
  • GUID记录标识符是您的朋友。不要在文件名中使用记录(int(ID
  • 您不需要从文件名反向查找记录,但需要从记录中查找文件。因此,您可以只使用guid作为文件名
  • 备份/复制文件系统和小型数据库比备份/复制大型数据库更容易
  • 不要将文件存储在您的webroot中

我认为对于大多数用例来说,只存储文件路径是最好的方法。对我来说,这种方法的优点包括:

  • 对于用户可以下载的图像或其他文件,您可以让客户端直接下载/缓存这些文件
  • 如果将来需要,允许实施CDN(即只需更新数据库中的文件引用
  • 它将大大减少在应用程序和数据库之间传递的数据量,有可能消除额外的带宽使用(如果数据库在远程服务器上(,并使查询响应更快(从而不会占用数据库(
  • 它使数据库备份速度更快
  • 它允许您对资产使用传统的文件管理技术

有一些存储Blob的潜在用例:

  • 也许你想对资产执行某种二进制搜索(尽管可以很容易地说,有比MySQL更好的解决方案(
  • 出于某种原因,您需要保证没有孤立的文件,或者没有实际文件的条目(即,使图像的提交成为事务性的(

最好的办法是将文件保存在上传目录中,并将该位置传递到MySQL