我应该使用 ArrayField 还是 ManyToManyField 作为标签

ali*_*iva 2 django postgresql django-models django-postgresql

我正在尝试为 Django 中的 postgres 数据库的模型添加标签,我找到了两个解决方案:

使用外键:

class Post(models.Model):
    tags = models.ManyToManyField('tags')
    ...

class Tag(models.Model):
    name = models.CharField(max_length=140)
Run Code Online (Sandbox Code Playgroud)

使用数组字段:

from django.contrib.postgres.fields import ArrayField

class Post(models.Model):
    tags = ArrayField(models.CharField(max_length=140))
    ...
Run Code Online (Sandbox Code Playgroud)

假设我不关心在我的代码中支持其他数据库后端,推荐的解决方案是什么?

zai*_*zil 6

如果您使用 Array 字段,

  • 数据库中每一行的大小都会有点大,因此 Postgres 将使用更多的toast 表

  • 每次获取该行时,除非您专门使用延迟字段或以其他方式仅通过或值或其他方式将其从查询中排除,否则每次遍历该行时,您都需要支付加载所有这些值的成本。如果那是你所需要的,那就这样吧。

  • 根据该数组中的值进行过滤,虽然可能不会那么好,而且 Django ORM 并没有像 M2M 表那样明显。

如果您使用 M2M 领域,

  • 您可以更轻松地过滤那些相关值这些字段默认被推迟,如果需要,您可以使用 prefetch_related ,如果您只想加载这些值的子集,则可以使用。

  • 由于键和额外的 id 字段,使用 M2M 时,数据库中的总存储量将略高。

  • 由于键的存在,这种情况下的连接成本完全可以忽略不计。

话虽如此,以上答案不属于我。不久前,我在学习 Django 时偶然发现了这个困境。我在这个问题中找到了答案,Django Postgres ArrayField vs One-to-Many relationship

希望你得到你想要的。