Python Django:unique_合在一起是否意味着db_index=True,与ForeignKey的含义相同?
模型上的字段,Python Django:unique_合在一起是否意味着db_index=True,与ForeignKey的含义相同?,python,django,django-models,database-indexes,Python,Django,Django Models,Database Indexes,模型上的字段,foo=models.ForeignKey(foo)将自动为列添加数据库索引,以加快查找速度。这很好,但是Django的文档没有说明模型meta的unique\u中的字段是否接受相同的处理。我碰巧有一个模型,其中一个列在unique\u中的char字段需要一个索引来快速查找。我知道在字段定义中添加重复的db_index=True不会有任何影响,但我很好奇。根据,它只会在数据库级别强制执行唯一性。我认为通常使字段唯一并不意味着它有索引。不过,如果索引存在,也可以简单地检查db级别。所
foo=models.ForeignKey(foo)
将自动为列添加数据库索引,以加快查找速度。这很好,但是Django的文档没有说明模型meta的unique\u中的字段是否接受相同的处理。我碰巧有一个模型,其中一个列在unique\u中的char字段需要一个索引来快速查找。我知道在字段定义中添加重复的db_index=True
不会有任何影响,但我很好奇。根据,它只会在数据库级别强制执行唯一性。我认为通常使字段唯一并不意味着它有索引。不过,如果索引存在,也可以简单地检查db级别。所有内容都表明它没有添加索引。如果unique\u together
添加了索引,则它将是一个多列索引
如果希望对其中一列进行单独索引,我认为需要在字段定义中指定db_index=True
。在Django 1.5及更高版本中,可以同时使用{Model}.Meta.index\u
类属性。如果您有两个名为foo
和bar
的字段,您将添加:
class Meta(object):
index_together = unique_together = [
['foo', 'bar']
]
如果只有一组唯一字段,则可以将一维iterable一起用于unique\u
。但是,这并不表示这同样适用于索引\u一起
这也可以:
class Meta(object):
unique_together = 'foo', 'bar'
index_together = [
['foo', 'bar']
]
但是,文档不支持这一点:
class Meta(object):
unique_together = 'foo', 'bar'
index_together = 'foo', 'bar'
如果有人想知道,除了要获得索引的性能优势,他们是否还需要一个unique\u-together
索引,Postgres的答案是,他们是unique\u-together
不会自动为列表中的每个字段添加索引
Django的新版本建议改用索引和约束元选项:
我问题的“暗示”部分与Django特有的行为有关models.ForeignKey
默认情况下在字段定义中设置db_index=True
。我还相信,unique=True
字段也会创建一个索引(数据库级别),这就是唯一检查如何快速运行(如果我错了,请纠正我)。我认为这取决于数据库引擎如何处理唯一约束。如果我是对的,大多数人都会设置索引。这与Django无关。事实上,模型.ForeignKey
部分与Django有关,而不是unique=True
。我提到了unique=True
作为旁白,因为使字段唯一并不…
答案的一部分。unique\u合起来也在数据库级别强制执行,而不是在Django中。假设数据库引擎自动支持唯一列上的索引,则将设置索引。如果不是,那就不是。这就是你的答案。另外,浏览Django的代码并不意味着他们会在一个unique\u上一起设置db索引,以下是一个来自postgresql控制台的uniquere_toguether索引示例:public |注册|注册|注册|注册|字段590B3BDB9D08B87C | uniq |创建唯一索引注册590B3BDB9D08B87C |使用btree注册Ɏ字段590B3BDB9D08B87C | uniq(字段1,字段2)
将两个字段一起索引
与相同两个字段的db\u index=True
不同index_合在一起
允许您将多个索引合并为1,这样在数据库扫描单个索引时,就可以比较像中a=5和b=10这样的子句。添加得很好,Tom。谢谢。谢谢你提供更多信息!试图修复断开的链接,但找不到工作链接。你们能,请,修复链接或删除它吗?嘿,好了,谢谢这个新的答案。新的约束API非常棒。我在你的答案上面加了一点直接回答原来的问题,这样我就可以把这个作为新的正确答案,因为它现在更相关了。