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 可能会发生冲突,但这种可能性介于非常低和可以忽略不计之间,它不为零;考虑到围绕这种情况进行编码的成本非常低,您应该为未来的自己——以及实际将要使用该系统的人——做这件事。
我有一个模型有一个 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 可能会发生冲突,但这种可能性介于非常低和可以忽略不计之间,它不为零;考虑到围绕这种情况进行编码的成本非常低,您应该为未来的自己——以及实际将要使用该系统的人——做这件事。