数据库设计优化咨询:主键类型选择与复合主键应用
针对你提出的两个数据库设计优化问题,我来分享下一线开发中的经验和建议:
问题1:DATOSREFERENCIAS表主键类型选择
这两种方案绝非无差异,核心是业务主键和代理主键的取舍,咱们具体拆解:
- 保留
REFERENCIA VARCHAR(60)作为主键(业务主键)- 优点:主键自带业务含义,不用额外新增字段,查询时能直接用业务值定位记录
- 缺点:字符串主键的索引占用存储空间更大,查询、关联效率远低于整数类型;如果未来业务需求变更要修改
REFERENCIA的值,会牵连所有关联该主键的外键表,维护成本极高
- 改为
ID INT NOT NULL AUTO_INCREMENT作为主键(代理主键)- 优点:整数类型索引效率极高、占用空间小;主键和业务逻辑完全解耦,哪怕
REFERENCIA字段变更,也不会影响主键和外键关联;外键关联时仅需存储一个整数,更节省空间 - 缺点:多了一个无业务意义的字段,需要额外维护
- 优点:整数类型索引效率极高、占用空间小;主键和业务逻辑完全解耦,哪怕
建议:如果REFERENCIA是绝对稳定、不会变更的业务唯一标识,且你对查询性能要求不高,可以保留原方案;但从长期维护和性能优化的角度,更推荐使用INT自增代理主键,同时给REFERENCIA字段添加唯一约束UNIQUE KEY uk_referencia (REFERENCIA),保证业务层面的唯一性。
问题2:FASESREFERENCIAS表的重复记录约束方案
确实,应尽量避免使用复合主键,原因主要有两点:
- 复合主键会让外键关联变复杂:其他表若要引用这个表的主键,必须同时存储
REFERENCIA和NUM_FASE两个字段,增加了数据冗余和维护成本 - 复合主键的索引效率、扩展性不如单字段主键,且如果其中某个字段需要变更,影响范围会更大
最优方案:
给FASESREFERENCIAS表新增一个INT自增的代理主键(比如ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY),然后创建复合唯一索引来约束重复记录:
ALTER TABLE FASESREFERENCIAS ADD UNIQUE KEY idx_ref_fase (REFERENCIA, NUM_FASE);
这样既通过唯一索引保证了REFERENCIA和NUM_FASE组合的唯一性,又避开了复合主键的弊端,同时让表结构更清晰,后续扩展(比如新增字段、关联其他表)也更灵活。
内容的提问来源于stack exchange,提问作者сами J.D.
相关产品推荐
相关产品推荐

