我有一个模型,比如,项目。我想在其上存储任意数量的属性,如title,description,release_date。我希望它们不仅仅是字符串而是python类型,所以字符串,布尔值,日期时间等等。
我有什么选择?具有单独名称 - 值表的EAV模式将无法工作,因为所有值都具有相同的DB类型。例如,JSONField可能有所帮助,但它不知道datetime。我也在看PickeField,它非常适合,但我对性能有点担忧。
答案 0 :(得分:4)
你有几个选择,但没有一个是好的。其中一些已在Stack Overflow上讨论before。
首先,正如您所建议的那样,您拥有实体 - 属性 - 值设计模式。
稍微好一点的方法是拥有一个架构发生变化的表和一个描述该表的元数据表。对于大多数项目具有大部分属性的密集数据,这比EAV具有很多优势。这种方法有时称为动态表或动态行。
如果您不需要基于这些动态属性执行查找,那么一种好方法是将动态数据存储在JSONField中,或者更好地存储模式验证的XMLField。但是,如果必须基于作为JSON或XML一部分的动态属性进行查找,则查找将非常痛苦。
最佳方法取决于您的数据稀疏程度以及您将如何查找数据。另外,一个非常好的问题是,你是否绝对需要这种灵活性。我参与过一些我们认为需要EAV的项目,但由于项目进入生产属性很少添加,很少被删除所以我们有所有的缺点,没有任何恩惠。