Django BinaryField - 文档中声明的理由

时间:2017-01-30 18:44:31

标签: django database-design django-models blob django-staticfiles

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

  

滥用BinaryField

     

虽然您可能会考虑将文件存储在数据库中,但请考虑在99%的情况下这是不好的设计。此字段不能替代正确的static files处理。

对此声明没有任何理由。是否有任何广义指标可以归结为99%"糟糕的设计"或1%"不错的设计"案件?这对Django来说特别正确,因为它有很好的静态文件支持吗?

1 个答案:

答案 0 :(得分:3)

我认为最好的过早优化和最坏的货物编程。

虽然关系数据库系统确实没有针对存储大字段(无论是二进制还是文本)进行优化,而且其中一些系统专门处理它们或至少对它们的使用有一些限制,但它们中的大多数至少处理中等大小二进制值(假设高达几百兆)非常好。将图片或PDF存储在数据库中的效率低于将它们存储在文件系统中的效率,但对于99%的应用程序而言,它将足够高效。

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

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

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