UUIDFields 是否应该在 Django 中唯一并编制索引?

Should UUIDFields be made unique and indexed in Django?

我有一个模型有一个 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)

该字段将主要用作外部标识符,其中通常不首选 id。

我认为只有一个重要问题。如果你的程序以某种方式在数据库中出现重复的 UUID,它会中断吗?如果答案是肯定的,那么您应该申请 unique=True.

使用db_index=True更多见仁见智。我会说当然,去吧。听起来您正计划使用该字段来替代 id 字段。对其编制索引不会造成太大伤害,而且可能会有所帮助。

您需要一个唯一标识符,但您似乎让 Django 执行其默认操作,并且单独使用 UUID 访问该系统的服务。那是多余的。只需在 UUID 字段上设置 primary=True 并将其设为您的 PK(这意味着 unique=True)。

如果需要根据任何字段访问记录,您需要声明该字段是唯一的。UUID 可能会发生冲突,但这种可能性介于非常低和可以忽略不计之间,它不为零;考虑到围绕这种情况进行编码的成本非常低,您应该为未来的自己——以及实际将要使用该系统的人——做这件事。