Django: подразумевает ли unique_together db_index=True так же, как ForeignKey?
Поле на модели, foo = models.ForeignKey(Foo)
автоматически добавит индекс базы данных для столбца, чтобы ускорить поиск. Это хорошо и хорошо, но в документах Django не указано, есть ли поля в мета-модели модели. unique_together
получить такое же лечение. У меня есть модель, в которой одно символьное поле указано в unique_together
требуется индекс для быстрого поиска. Я знаю, что добавление дубликата не повредит db_index=True
в определении поля, но мне любопытно.
4 ответа
Если unique_together
действительно добавляет индекс, это будет индекс из нескольких столбцов.
Если вы хотите, чтобы один из столбцов был проиндексирован индивидуально, я считаю, что вам нужно указать db_index=True
в определении поля.
Для тех, кто приезжает сюда, интересно, нужно ли им index_together
в дополнение к unique_together
Чтобы получить выигрыш в производительности индекса, ответ для Postgres - нет, они функционально одинаковы.
unique_together
не добавляет автоматически индексы для каждого поля, включенного в список.
Новые версии Django предлагают вместо этого использовать мета-параметры Index & constraint:
В Django 1.5 и выше вы можете использовать {Model}.Meta.index_together
атрибут класса. Если у вас было два поля с именем foo
а также bar
, вы бы добавили:
class Meta(object):
index_together = unique_together = [
['foo', 'bar']
]
Если у вас есть только один набор уникальных полей, вы можете использовать одномерные итерации для unique_together
, Тем не менее, документация не указывает, что то же самое относится к index_together
,
Это также было бы хорошо:
class Meta(object):
unique_together = 'foo', 'bar'
index_together = [
['foo', 'bar']
]
Это, однако, НЕ подтверждается документацией:
class Meta(object):
unique_together = 'foo', 'bar'
index_together = 'foo', 'bar'
Согласно документам, он будет обеспечивать уникальность только на уровне базы данных. Я думаю, что в целом создание уникального поля не означает, что оно имеет индекс. Хотя вы также можете просто проверить на уровне БД, существует ли индекс. Все указывает, хотя это не так.