Django BinaryField - 文档中声明的理由

Django BinaryField - Justification for statement in documentation

BinaryField field type 的 Django 1.10 文档中,他们给出了有关其使用的警告:

Abusing BinaryField

Although you might think about storing files in the database, consider that it is bad design in 99% of the cases. This field is not a replacement for proper static files handling.

它没有继续为这个索赔提供任何理由。对于 99% 的“糟糕设计”或 1% 的“不错的设计”案例,是否有任何通用指标?这对 Django 特别适用,因为它有很好的静态文件支持吗?

Django 模型是关系数据库的抽象。这些 excel 以明确定义的格式和关系存储少量数据。它们针对固定长度行和低内存使用进行了优化。

您的数据是固定长度的,小于 4Kb,并且不打算由网络服务器提供服务吗?你可能属于那1%。

我认为这种过早的优化往好里说,货物崇拜编程往坏里说。

虽然关系数据库系统确实没有针对存储大型字段(无论是二进制还是文本)进行优化,并且其中一些系统对它们进行特殊处理或者至少对其使用有一些限制,但大多数系统至少可以处理中等大小的二进制值(比如说最多几百兆字节)非常好。将图片或 PDF 存储在数据库中的效率将低于将它们存储在文件系统中的效率,但对于 99% 的所有应用程序来说,它已经足够高效了。

另一方面,如果将这些文件存储在文件系统中,则会失去几个优势:

  • 更新将在事务之外,因此您不能确定对文件(在文件系统中)和元数据(在数据库中)的更新是原子的。
  • 您失去了参照完整性:您的数据库可能引用了已被删除或重命名的文件。
  • 您有两个不同的地方存储数据。这使访问、备份等变得复杂。

我会尝试将逻辑上属于一起的所有数据存储在一起。通常这意味着将所有内容都存储在数据库中。如果这在技术上不可行(例如因为您的文件太大 - 大多数 RDBMS 对 blob 有大小限制)或者因为测试表明它太慢或不方便,您可以稍后对其进行优化。