Django Postgres ArrayField 与一对多关系

Posted

技术标签:

【中文标题】Django Postgres ArrayField 与一对多关系【英文标题】:Django Postgres ArrayField vs One-to-Many relationship 【发布时间】:2015-01-18 20:00:48 【问题描述】:

对于我数据库中的模型,我需要为特定字段存储大约 300 个值。如果我使用 Postgres 特定的 ArrayField 而不是具有一对多关系的单独表,那么在 性能查询简单性 方面会有什么缺点?

【问题讨论】:

【参考方案1】:

如果你使用数组字段

数据库中每一行的大小会有点大,因此 Postgres 将使用更多的 toast 表 (http://www.postgresql.org/docs/9.5/static/storage-toast.html) 每次获取该行时,除非您专门使用defer (https://docs.djangoproject.com/en/1.9/ref/models/querysets/#defer) 字段或通过onlyvalues 或其他方式将其从查询中排除,否则您将支付全部加载的成本每次遍历该行时这些值。如果这是你需要的,那就这样吧。 根据该数组中的值进行过滤,虽然可能不会那么好,而且 Django ORM 并不像 M2M 表那样明显。

如果你使用 M2M

您可以更轻松地过滤这些相关值 默认情况下,这些字段会被推迟,如果需要,可以使用 prefetch_related,如果您只想加载这些值的子集,请使用它们 由于键和额外的 id 字段,使用 M2M 时数据库中的总存储量将略高 在这种情况下,由于键的原因,连接的成本完全可以忽略不计。

我个人会说使​​用 M2M 表,但我不知道您的具体应用。如果您要处理大量数据,可能值得获取一个有代表性的数据集并用它测试这两种方法。

【讨论】:

以上是关于Django Postgres ArrayField 与一对多关系的主要内容,如果未能解决你的问题,请参考以下文章

AttributeError:模块 'django.contrib.postgres.fields' 没有属性 'JSONField'

Django/Postgres:在 RangeField 上聚合

Django:Postgres 连接未关闭

Postgres:使用 django 对 json 键进行值查询

Django 无法在 Docker 设置中连接到 Postgres

Django 从 MySQL 迁移到 Postgres