非主键的自增id列在数据库表中存在哪些实际作用?
你给出的us_states表建表语句如下:
create table us_states ( id serial, name varchar(256) not null constraint us_states_pk primary key, code varchar(256) not null );
你将name设为了主键,serial类型的自增id未用作主键,该列的实际落地价值主要有以下几点:
- 降低关联查询的存储与性能开销:如果有其他表需要关联州表(比如用户地址表、线下门店表),用int类型的id作为外键存储,比存varchar类型的州名/州编码至少省80%的存储空间,join查询时整数比对的效率也远高于字符串匹配,关联字段的索引体积更小、查询速度更快。
- 作为增量同步的天然锚点:自增id是单调递增的,不管是同步数据到缓存、数仓还是其他业务库,直接按id范围拉取增量数据即可,不需要处理时间戳重复、时钟回拨、字符串排序规则不一致的问题,同步逻辑实现简单,踩坑概率极低。
- 降低数据操作的出错概率:如果后续需要修改州名、删除重复的脏数据,直接用id作为where条件定位行,比用字符串匹配稳妥很多,不会因为大小写、前后空格、特殊字符匹配问题导致误改/误删多行数据,操作安全性更高。
- 作为对外对接的无业务含义标识:如果要给第三方系统提供州的唯一标识,用自增id比直接传州名、州编码更合适,一是不会泄露内部业务字段的命名规则,二是后续就算调整州名、州编码,对外的id不需要变更,对接方不需要做任何适配,兼容性更好。
- 降低老系统迁移的改造成本:如果是从老系统迁移过来的表,原有老业务逻辑原本就是用自增id作为州的唯一标识,保留id字段可以直接兼容老业务代码,不需要大范围改造,平滑过渡的成本非常低。
内容的提问来源于stack exchange,提问作者2Clutch
相关产品推荐
相关产品推荐

