Php 数据库中的Blob还是指向文件的指针?

Php 数据库中的Blob还是指向文件的指针?,php,mysql,Php,Mysql,可能重复: 在存储MP3s/PDFS与数据库之间,我应该考虑什么样的选择。 将文件作为BLOB存储在DB中是否更好?还是只需要一个允许我查看文件系统的字段就更好了 有问题的文件不太可能超过15MB,但如果考虑到这一点,所有文件都可能至少为1MB 数据将通过PHP访问,如果这有什么不同 编辑:我将继续我已经在做的事情:文件系统上的资源和数据库中的文件名。谢谢你的意见 最好的办法是将文件保存在upload directoy中,并将该位置传递到MySQL上最好的办法是将文件保存在upload dir

可能重复:

在存储MP3s/PDFS与数据库之间,我应该考虑什么样的选择。 将文件作为BLOB存储在DB中是否更好?还是只需要一个允许我查看文件系统的字段就更好了

有问题的文件不太可能超过15MB,但如果考虑到这一点,所有文件都可能至少为1MB

数据将通过PHP访问,如果这有什么不同


编辑:我将继续我已经在做的事情:文件系统上的资源和数据库中的文件名。谢谢你的意见

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

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

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

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

也许您想对资产执行某种二进制搜索,尽管很容易认为有比MySQL更好的解决方案。 出于某种原因,您需要保证没有孤立文件,或者没有实际文件的条目,例如,使映像提交成为事务性的
我认为对于大多数用例,只存储文件路径是最好的方法。对我来说,这种方法的优点包括:

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

也许您想对资产执行某种二进制搜索,尽管很容易认为有比MySQL更好的解决方案。 出于某种原因,您需要保证没有孤立文件,或者没有实际文件的条目,例如,使映像提交成为事务性的
在过去的3年里,我一直在从事一个项目,其中大型附件存储在数据库中

优势 与处理相关文件相比,管理数据库中的记录更简单,代码更少。 即使使用CakePHP的行为来自动化任务。数据库更简单。 有些项目有将数据保存在数据库中的安全性要求,即使这并不能真正提高安全性。 自动构建过程可以轻松地备份数据,因为它已经在数据库中了。 缺点 拍摄数据库快照进行开发是一件痛苦的事情。 在通过几GB的大小后。不管别人告诉你什么。你会开始怀疑DB引擎是否能处理它。 转储数据库开始需要很长时间。 数据迁移到不同的模式开始需要非SQL解决方案。 关于DB Blob的神话 您的数据库无法处理较大的数据库文件大小。 硬盘上的一个坏扇区意味着您可能会丢失所有blob数据。 存储在数据库中会带来性能成本。 这样更安全。 从数据库读取并发送到客户端比读取并发送文件要慢。 根据我的经验,以上所说的都是假的

关于大斑点的事实 总有一天,您将不再希望它出现在数据库中。 GUID记录标识符是您的朋友。不要在文件名中使用记录intID。 您不需要从文件名中反向查找记录,但需要从记录中查找文件。因此,您可以只使用guid作为文件名。 备份/复制一个文件系统和一个小数据库比备份/复制一个大数据库更容易。 不要将文件存储在webroot中。
在过去的3年里,我一直在从事一个项目,其中大型附件存储在数据库中

优势 与处理相关文件相比,管理数据库中的记录更简单,代码更少。 即使是结块 HP的行为使任务自动化。数据库更简单。 有些项目有将数据保存在数据库中的安全性要求,即使这并不能真正提高安全性。 自动构建过程可以轻松地备份数据,因为它已经在数据库中了。 缺点 拍摄数据库快照进行开发是一件痛苦的事情。 在通过几GB的大小后。不管别人告诉你什么。你会开始怀疑DB引擎是否能处理它。 转储数据库开始需要很长时间。 数据迁移到不同的模式开始需要非SQL解决方案。 关于DB Blob的神话 您的数据库无法处理较大的数据库文件大小。 硬盘上的一个坏扇区意味着您可能会丢失所有blob数据。 存储在数据库中会带来性能成本。 这样更安全。 从数据库读取并发送到客户端比读取并发送文件要慢。 根据我的经验,以上所说的都是假的

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

考虑如何在文件系统中复制/移动/备份文件。用数据库中的文件来考虑痛苦的数据库备份。这已经被问了一百万次了。这两种解决方案都有很好的理由。对于中小型文件,DB实际上可能更快。至少有一个DBMS是这样的:如果在这里找不到其他DBMS(如Postgres、Oracle或MySQLor)的类似阈值,我也不会感到惊讶:公平地说,我确实在寻找重复的。我猜我的stackoverflow fu不如我的谷歌fu好!我希望我能给出两个答案的要点,但由于马修·福斯卡里尼有更深入和广泛的考虑,我觉得我必须选择他的答案。非常感谢Mike Brant额外的信息要考虑!考虑如何在文件系统中复制/移动/备份文件。用数据库中的文件来考虑痛苦的数据库备份。这已经被问了一百万次了。这两种解决方案都有很好的理由。对于中小型文件,DB实际上可能更快。至少有一个DBMS是这样的:如果在这里找不到其他DBMS(如Postgres、Oracle或MySQLor)的类似阈值,我也不会感到惊讶:公平地说,我确实在寻找重复的。我猜我的stackoverflow fu不如我的谷歌fu好!我希望我能给出两个答案的要点,但由于马修·福斯卡里尼有更深入和广泛的考虑,我觉得我必须选择他的答案。非常感谢Mike Brant额外的信息要考虑!请允许我解释一下,希望删除这个讨厌的-1:p,在一个整合的位置进行管理比处理损坏的或其他类似的问题要容易得多。存储blob您的评论如何改变一切。仍为-1;斯塔克,一个如此严厉的情妇。也许op可以阅读与同一主题相关的10k其他问题,然后自己选择。文件系统中有文件并不能整合任何东西。你实际上是在四处传播。当您拥有数据库中的所有内容时,您可以真正地进行整合,因为您只需要一个备份和恢复策略来维护和测试,在一个整合的位置进行管理要容易得多,然后处理损坏的或其他类似的问题存储blobWhow您的评论会改变一切。仍为-1;斯塔克,一个如此严厉的情妇。也许op可以阅读与同一主题相关的10k其他问题,然后自己选择。文件系统中有文件并不能整合任何东西。你实际上是在四处传播。当您拥有数据库中的所有内容时,您就真正实现了整合,因为您只需要一个备份和恢复策略来维护和测试。您还应该列出缺点:没有事务存储。要求进行内部管理,两种不同的备份和恢复计划,要求在目录中均匀分布文件,因为没有文件系统可以在一个单独的时间内处理数百万个文件directory@a_horse_with_no_name这些都是正确的观点。实际情况是,一旦你拥有数百万个文件,你真的应该使用不同的存储解决方案,而不是像Amazon S3那样使用服务器本地存储。你还应该列出缺点:没有事务存储。要求进行内部管理,两种不同的备份和恢复计划,要求在目录中均匀分布文件,因为没有文件系统可以在一个单独的时间内处理数百万个文件directory@a_horse_with_no_name这些都是正确的观点。事实是,一旦你到了警察局
拥有数百万个文件,你真的应该使用一个不同的存储解决方案,而不是像AmazonS3那样的服务器本地存储。在这个Q关闭之前,我能得到+1吗。哈哈哈!我认为这个答案绝对值得一个好的总结。不过,我不确定我是否认为备份存在问题。DBMS还可以执行非常高效的差异/增量备份。当您需要获得数据库的完全转储时,您可能也需要文件的转储,而且复制所需的时间与数据库转储所需的时间一样长,可能甚至更长,因为文件太多了。转储1GB比复制100000个文件快,总共1MB,但我的生产数据库是远程的。所以下载一个20GB的转储文件只是为了验证一个bug是一件痛苦的事。谢谢Mathew Foscarini。这回答了我的问题。在这个Q结束之前我能得到a+1吗。哈哈哈!我认为这个答案绝对值得一个好的总结。不过,我不确定我是否认为备份存在问题。DBMS还可以执行非常高效的差异/增量备份。当您需要获得数据库的完全转储时,您可能也需要文件的转储,而且复制所需的时间与数据库转储所需的时间一样长,可能甚至更长,因为文件太多了。转储1GB比复制100000个文件快,总共1MB,但我的生产数据库是远程的。所以下载一个20GB的转储文件只是为了验证一个bug是一件痛苦的事。谢谢Mathew Foscarini。这回答了我的问题。