0

关于在 PHP/MySQL CMS 中处理图像的最佳实践的快速问题。每个项目将有不同数量的关联图像,这些图像将存储在项目 ID 引用的文件夹中。验证在上传时完成,因此所有文件都应该是有效的。我的问题是我是否还应该将 ID 和文件名存储在数据库表中并从数据库中提取源数据,或者是否可以简单地遍历文件夹并直接插入源文件名?

我希望这是有道理的。提前感谢您的任何建议。

4

1 回答 1

1

这在很大程度上取决于您想要多少故障点以及响应时间的速度。

如果将其存储在文件系统上:

  1. 传入的 HTTP 请求
  2. PHP查询数据库
  3. 数据库找到行
  4. PHP破译查询响应
  5. PHP 读取文件
  6. PHP 发送文件的二进制内容作为对 HTTP 请求的响应

但是,如果将其作为二进制 blob 存储在数据库中:

  1. 传入的 HTTP 请求
  2. PHP查询数据库
  3. 数据库找到行
  4. PHP破译查询响应
  5. PHP 将二进制内容作为对 HTTP 请求的响应发送

在这两种情况下,只要设置了正确的索引/键,第 3 步(数据库找到行)就可以与我们的 WITHOUT blob 列一样快。MySQL 会在内部将指针移动到精确的索引位置——它实际上不会遍历每个字节,直到找到正确的字节(这是索引的全部点)。这与 PHP 手动读取文件一样耗时。但是,我目前没有支持性能数据来支持这一点。

现在让我谈谈失败点:

  • 假设您迁移数据。如果您的二进制图像数据存储在数据库中,您只需移动数据库。但是,如果您的二进制图像数据存储在文件系统上,则必须记住移动两者。另请注意,迁移的 SIZE 将相同(或至少略有不同)。
  • 考虑重命名资产 - 您不仅要在数据库中重命名它,还要在文件系统中重命名它。这是 2 个总步骤,而不是在 DB 中重命名它只有 1 个。
  • 考虑删除资产 - 您必须在两个位置都将其删除。

出于可移植性、灵活性和最大程度地减少故障或损坏的目的,我一直将二进制数据作为 blob 存储在数据库中。

如果您选择将文件作为 blob 存储在数据库中,请考虑不同的 blob 存储要求:http ://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html#id656744

  • TINYBLOB - 256 字节
  • MEDIUMBLOB - 64 KB
  • LONGBLOB - 4 GB

最后,值得深思的是:我有使用 Adob​​e's Day CQ 的经验,这是一个新兴的企业级内容管理系统。它主要是用 Java 编写的,但需要注意的是数据架构。它使用 JCR(Java 内容存储库),或多或少类似于多维 MySQL 数据库(有点酷?)。其 DAM(数字资产管理器)中的所有图像数据都存储为 JCR 中的一个节点。

于 2012-06-29T00:44:07.570 回答