【问题标题】:arbitrary typed data in django modeldjango模型中的任意类型数据
【发布时间】:2023-04-05 14:59:01
【问题描述】:

我有一个模型,比如说,Item。我想在上面存储任意数量的属性,比如标题、描述、发布日期。而且我希望它们不仅仅是字符串,而是具有 python 类型,所以字符串、布尔值、日期时间等。

我在这里有什么选择?由于所有值的数据库类型相同,具有单独名称-值表的 EAV 模式将不起作用。 JSONField 可能会有所帮助,但它不知道日期时间,例如。我也在看 PickeField,它非常适合,但我有点担心性能。

【问题讨论】:

    标签: django


    【解决方案1】:

    您有几个选择,但都不是很好。其中一些已经在 Stack Overflow 上讨论过 before

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

    • 您可以添加 DB 类型检查,方法是为 VARCHAR 设置一个表,为 INT 设置一个表,为 BOOLEAN 设置一个表,依此类推。
    • EAV 使选择非常痛苦。您必须查询多个表才能实际获取对象,如果必须在查找中使用 EAV 表中的值,随着大小的增加,您将遇到性能问题。
    • 不过,一般而言,EAV 应该只用于非常稀疏的数据,而其他选项根本不起作用。
    • PyPI 上有一个 Django 包,但是我没有用过。
    • 我见过一些相当大规模的商业产品在绝对需要很大的灵活性时使用这种方法

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

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

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

    最佳方法取决于您的数据有多稀疏以及您将如何查找该数据。另外,一个很好的问题是您是否绝对需要这种灵活性。我曾参与过一些我们认为需要 EAV 的项目,但由于项目进入生产阶段,因此很少添加也很少删除属性,因此我们遇到了所有的缺点,没有任何好处。

    【讨论】:

      猜你喜欢
      • 2011-08-04
      • 2015-09-15
      • 2019-05-26
      • 1970-01-01
      • 2011-08-21
      • 2018-12-05
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多