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

标签 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)

使用数组字段:

from django.contrib.postgres.fields import ArrayField

class Post(models.Model):
    tags = ArrayField(models.CharField(max_length=140))
    ...

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

最佳答案

如果你使用数组字段,

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

  • 除非您特别使用 defer,否则每次您都获取该行该字段或仅通过值或其他方式将其从查询中排除,您每次迭代该行时都要支付加载所有这些值的费用。如果这就是您所需要的,那就这样吧。

  • 基于该数组中的值进行过滤,虽然可能不会那么好,而且 Django ORM 不会像它对 M2M 表那样明显。

如果使用M2M字段,

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

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

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

话虽如此,以上答案不属于我。前段时间,我在学习 Django 时无意中遇到了这个困境。我在这里找到了这个问题的答案,Django Postgres ArrayField vs One-to-Many relationship .

希望你得到你想要的东西。

关于django - 我应该为标签使用 ArrayField 还是 ManyToManyField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44382653/

相关文章:

java - 在android studio中解析json

python - OAuth2 客户端(Python/Django)

postgresql - 向后索引扫描与索引扫描

postgresql - 返回记录时,需要在registerOutParameter()中设置什么数据类型

r - 如何导入带有字符列的数据框(RPostgreSQL)?

python - 将元组存储为模型中的字段

python - Django 表单 : integrating a submit button as part of your form

Django 原子事务实际上不是原子的?

Django:货币的 FloatField 或 DecimalField?

Django 对象在查询集中不可迭代