在数据库中的Blob或指向文件的指针?

时间:2013-01-16 21:55:11

标签: php mysql

  

可能重复:
  When to store images in a database(mySQL) and when not? (Linking image to item in database)
  Which is the best method to store files on the server (in database or storing the location alone)?

在将MP3 / pdf与数据库存储之间,我应该考虑什么才能做出最佳选择。 将文件作为BLOB存储在数据库中更好吗?或者是否有一个允许我查看文件系统的字段更好?

问题中的文件不可能超过15MiB,但如果需要考虑的话,所有文件都可能至少1MiB。

如果这会产生影响,将通过PHP访问数据......

编辑:我将继续使用数据库中带有文件名的文件系统上的资源。谢谢或输入!

3 个答案:

答案 0 :(得分:5)

过去3年来,我一直致力于一个大型附件存储在数据库中的项目。

优点

  • 管理数据库中的记录比处理相关文件更容易,代码更少。
  • 即使使用CakePHP的行为来自动完成任务。数据库更容易。
  • 某些项目具有将数据保存在数据库中的安全要求(即使它并未真正提高安全性)。
  • 自动构建过程可以轻松备份数据,因为它已经存在于数据库中。

缺点

  • 拍摄数据库快照以进行开发是一件痛苦的事。
  • 传递几个GB的大小后。不管别人告诉你什么。你会开始怀疑数据库引擎是否可以处理它。
  • 转储数据库需要很长时间。
  • 向不同架构的数据迁移开始需要非SQL解决方案。

关于DB Blob的神话

  • 您的数据库无法处理大型数据库文件。
  • 硬盘驱动器上的一个坏扇区意味着您可能丢失所有blob数据。
  • 存储在数据库中的性能成本。
  • 它更安全。
  • 从数据库读取并发送到客户端比读取文件并发送它要慢。

以上所有(根据我的经验) false

关于大型Blob的事实

  • 有一段时间你不再需要它在数据库中。
  • GUID记录标识符是您的朋友。请勿在文件名中使用record(int)ID。
  • 您无需从文件名中反向查找记录,但需要从记录中查找文件。所以你可以使用guid作为文件名。
  • 备份/复制文件系统和小型数据库,然后只是一个大型数据库更容易。
  • 不要将文件存储在您的webroot中。

答案 1 :(得分:4)

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

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

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

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

答案 2 :(得分:-2)

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