django模型中的任意类型数据

时间:2010-04-14 12:50:14

标签: django

我有一个模型,比如,项目。我想在其上存储任意数量的属性,如title,description,release_date。我希望它们不仅仅是字符串而是python类型,所以字符串,布尔值,日期时间等等。

我有什么选择?具有单独名称 - 值表的EAV模式将无法工作,因为所有值都具有相同的DB类型。例如,JSONField可能有所帮助,但它不知道datetime。我也在看PickeField,它非常适合,但我对性能有点担忧。

1 个答案:

答案 0 :(得分:4)

你有几个选择,但没有一个是好的。其中一些已在Stack Overflow上讨论before

首先,正如您所建议的那样,您拥有实体 - 属性 - 值设计模式。

  • 您可以通过为VARCHAR提供表格来添加数据库类型检查,一个用于INT,一个用于BOOLEAN等等。
  • EAV让选择非常痛苦。您必须查询大量表以实际获取对象,如果必须在查找中使用EAV表中的值,则会随着大小的增加而遇到性能问题。
  • 但是,一般情况下,EAV应该只用于非常稀疏的数据,而另一种选择根本不起作用。
  • 在PyPI上有一个Django包,但我还没有使用它。
  • 我看到一些非常大规模的商业产品,在绝对需要很大的灵活性时使用这种方法

稍微好一点的方法是拥有一个架构发生变化的表和一个描述该表的元数据表。对于大多数项目具有大部分属性的密集数据,这比EAV具有很多优势。这种方法有时称为动态表或动态行。

  • INSERT,UPDATE和DELETE更快,因为所有内容都在1-2个表中
  • 可以添加类型检查和可能的约束
  • 然而,这种方法留下了一个非常复杂的数据库,可能更难以使用
  • 我不知道任何方式Django会将ORM用于这种数据库,因为你的模型会随时改变。
  • 您正在使用ALTER TABLE即时更改数据库。您最好对交易非常小心

如果您不需要基于这些动态属性执行查找,那么一种好方法是将动态数据存储在JSONField中,或者更好地存储模式验证的XMLField。但是,如果必须基于作为JSON或XML一部分的动态属性进行查找,则查找将非常痛苦。

最佳方法取决于您的数据稀疏程度以及您将如何查找数据。另外,一个非常好的问题是,你是否绝对需要这种灵活性。我参与过一些我们认为需要EAV的项目,但由于项目进入生产属性很少添加,很少被删除所以我们有所有的缺点,没有任何恩惠。