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) 字段或通过only
或values
或其他方式将其从查询中排除,否则您将支付全部加载的成本每次遍历该行时这些值。如果这是你需要的,那就这样吧。
根据该数组中的值进行过滤,虽然可能不会那么好,而且 Django ORM 并不像 M2M 表那样明显。
如果你使用 M2M
您可以更轻松地过滤这些相关值 默认情况下,这些字段会被推迟,如果需要,可以使用prefetch_related
,如果您只想加载这些值的子集,请使用它们
由于键和额外的 id 字段,使用 M2M 时数据库中的总存储量将略高
在这种情况下,由于键的原因,连接的成本完全可以忽略不计。
我个人会说使用 M2M 表,但我不知道您的具体应用。如果您要处理大量数据,可能值得获取一个有代表性的数据集并用它测试这两种方法。
【讨论】:
以上是关于Django Postgres ArrayField 与一对多关系的主要内容,如果未能解决你的问题,请参考以下文章
AttributeError:模块 'django.contrib.postgres.fields' 没有属性 'JSONField'
Django/Postgres:在 RangeField 上聚合
Postgres:使用 django 对 json 键进行值查询