Должны ли UUIDFields быть уникальными и проиндексированы в Django? - PullRequest
0 голосов
/ 28 июня 2019

У меня есть модель с UUIDField, которая не является первичным ключом. Первичный ключ просто оставлен по умолчанию, большое целочисленное поле.

import uuid

class MyModel(models.Model):
    uuid = models.UUIDField(_('uuid'), default=uuid.uuid4, editable=False)

Теперь мой вопрос: должен ли я явно объявить поле уникальным? Я понимаю, что вероятность столкновений очень мала, поэтому, вероятно, документация Django не делает поле уникальным. Кроме того, я должен также индексировать поле в базе данных? Вот так:

import uuid

class MyModel(models.Model):
    uuid = models.UUIDField(_('uuid'), default=uuid.uuid4, editable=False, unique=True, db_index=True)

Поле будет в основном использоваться в качестве внешнего идентификатора, где идентификатор обычно не является предпочтительным.

Ответы [ 2 ]

2 голосов
/ 29 июня 2019

Вам нужен уникальный идентификатор, но вы, похоже, позволяете Django выполнять свои действия по умолчанию и отдельно использовать UUID для служб, обращающихся к этой системе. Это избыточно. Просто установите primary=True в поле UUID и сделайте его своим PK (что подразумевает unique=True).

Если запись должна быть доступна на основе какого-либо поля, , вам необходимо объявить это поле уникальным. UUID могут сталкиваться, и хотя вероятность находится где-то между очень низким и незначительным, она не равна нулю; учитывая очень низкую стоимость написания кода в этом случае, вы обязаны сделать это для своего будущего я - и того, кто на самом деле собирается использовать эту систему - для этого.

0 голосов
/ 28 июня 2019

Я думаю, что есть только один важный вопрос. Не сломается ли ваша программа, если в базе данных окажется дубликат UUID? Если ответ на это да, то вы должны подать заявление unique=True.

использование db_index=True - это скорее вопрос мнения. Я бы сказал, конечно, пойти на это. Похоже, вы планируете использовать поле в качестве альтернативы поле id. Индексирование не должно сильно ранить и, вероятно, будет полезно.

...