Django中非主键UUIDField是否需设置唯一约束与数据库索引?
关于Django UUID字段的unique与索引设置建议
好问题!结合你把这个UUID用作外部标识符的场景,咱们来明确这两个设置的必要性:
1. 要不要加unique=True?
必须加!哪怕UUID碰撞的数学概率极低,但从业务和数据一致性角度来说:
- 作为外部系统识别你的模型实例的唯一标识,业务逻辑上要求每个实例的UUID必须独一无二,否则会导致外部调用时出现歧义(比如两个不同实例返回同一个UUID,外部系统根本分不清要操作哪个)。
- 数据库层面的唯一约束能兜底防止意外情况(比如代码bug、批量导入数据时的失误)导致重复UUID插入,避免脏数据产生。
Django文档没默认设unique=True是因为UUID字段不一定都用来做唯一标识,但你的场景完全符合需要唯一的要求。
2. 要不要加db_index=True?
强烈建议加(或者说,其实你设置unique=True后数据库已经自动创建了唯一索引,但显式写上更清晰):
- 既然你“通常不使用默认id”,而是用这个UUID来做查询(比如
MyModel.objects.get(uuid=xxx)),没有索引的话,每次查询都会触发全表扫描,数据量一旦上去,性能会暴跌。 - 注意:在Django中,当你设置
unique=True时,数据库会自动为该字段创建唯一索引,这时候db_index=True属于冗余设置,但写上也不会有问题,反而能让代码阅读者一眼看出这个字段会被用来做查询。
修改后的推荐代码
import uuid from django.db import models from django.utils.translation import gettext_lazy as _ class MyModel(models.Model): uuid = models.UUIDField( _('uuid'), default=uuid.uuid4, editable=False, unique=True, db_index=True # 可选,但显式声明更清晰 )
内容的提问来源于stack exchange,提问作者darkhorse
相关产品推荐
相关产品推荐

