自增ID
自增ID的赋值一般由数据库实现,有以下优点:
- 生成的主键是有顺序的,每次新插入的数据都在最后,这对性能是一个巨大的提升,会减少很多B+Tree的分裂,(详见B+Tree的插入实现)
- 占用空间小,主键长度短,利于检索
缺点也很明显:
-
容易被人知道业务量
-
必须得在持久化的时候才能赋值
-
遇到手动赋予主键的情况很麻烦
-
没有提供任何关于记录的信息
-
高并发时,自增主键会导致竞争锁冲突的问题
UUID
UUID是通用唯一识别码(Universally Unique Identifier),能够保证在一定范围内唯一性
优点是:
- 全局唯一性
- 含有如创建时间之类的信息
- 在数据迁移的时候,不会有主键冲突
缺点在于:
-
占用空间大,一个完整的UUID占用128字节
-
长度长,检索效率低
-
无序,插入效率低
使用场景
- 可以看出,自增ID有很大的限制,但对于性能的提升是很大的,适用于数据量多,插入、检索频繁,建立索引多的情况。
- 而UUID最大的缺点就是占用资源多,无论是时间还是空间,但自身富含信息,限制小,适合数据量小,需要保证全局唯一的场景。
- 而在DDD场景中,持久化实例之后才返回实例的唯一标识,是十分致命的: 由于领域事件先于持久化发布,此时事件中的数据是不包含实例的唯一标识的,会导致订阅领域事件方认为所有实体都是一个实体。
- 所以在DDD设计中一般使用UUID。