使用Django的unique_together

时间:2015-05-21 08:14:41

标签: django postgresql

我有一个在PostgreSQL v9.4和Django 1.6上运行的项目(计划很快升级到v1.8 ......)

假设我有以下型号:

class Product(models.Model):
    x = models.ForeignKey(Shop)
    y = models.PositiveIntegerField()
    class Meta:
        unique_together = (("x", "y"), )

据我所知:

  1. 字段x是外键,因此除非另有要求,否则Django会自动为(x)
  2. 添加db索引
  3. 由于unique_together语句,PostgreSQL隐式生成(x,y)的组合索引
  4. 通常,(x,y)的索引也用作(x)
  5. 的索引
  6. 在SQL INSERT操作中复制索引会消耗额外的时间
  7. 我的结论是,在这种情况下,最好为字段x显式声明db_index = false,以避免重复索引。

    这是一个有效的结论吗?

1 个答案:

答案 0 :(得分:0)

根据documentation,(x,y)上的索引也将作为针对x的查询的索引。由于索引将x作为第一列,因此它也比(y,x)更有效。所以从这个意义上说你是对的。

具有多个索引的表将在插入时消耗更多时间,因为将更新更多索引。时间量取决于表格结构。

最后,它取决于y将导致的数据量。如果y上有很多变化,则索引大小可能比x上的索引大很多。在这种情况下,基于此索引进行查询将导致从索引加载和处理更多数据。如果变化较小且索引大小不是很大,那么只需要(x,y)索引就可能更好。

但是,与往常一样,这需要基准测试,基准测试和基准测试。

有关数据完整性的说明

如果您决定在x上删除索引并且只在(x,y)上具有唯一索引,那么只要y不同,x本身可能包含非唯一值。根据具体实施情况,这可能也可能不重要。