SQL address表唯一约束设置 解决同坐标多公寓录入冲突问题
地址表设计优化方案
首先修正你当前的基础设计缺陷:将address_id纳入多字段联合主键完全冗余,address_id本身为唯一标识,单独作为主键即可,地址唯一性可通过额外的联合唯一约束实现。以下是两种可满足需求的优化方案:
方案1:轻量调整(无需新增表,改造成本低)
仅调整原表的约束规则即可解决问题:
- 保留
address_id作为单字段主键 - 新增
street_number、street_name、apt、city、state、zipcode的联合唯一约束,保证完全相同的地址不会重复录入 - 取消原
x_cords、y_cords的独立唯一约束,改为创建x_cords、y_cords、street_number、street_name、city、state、zipcode(不含apt字段)的联合唯一约束 - 约束逻辑:坐标相同的记录,必须对应同一个楼栋地址(门牌号、街道、城市、州、邮编完全一致),既允许同一楼栋下不同楼层的公寓共享同一坐标,也避免了不同地址的记录复用相同坐标。
方案2:结构化拆分(适合有楼栋管理需求的场景)
新增楼栋表做分层管理,数据冗余度更低,可扩展性更强:
- 新增
building表存储楼栋级公共信息,字段如下:building (building_id, street_number, street_name, city, state, zipcode, x_cords, y_cords) - 原
address表调整:删除x_cords、y_cords字段,新增building_id字段关联building表的主键 - 约束设置:
building表设置street_number、street_name、city、state、zipcode联合唯一约束,避免同一楼栋重复录入building表设置x_cords、y_cords唯一约束,保证不同楼栋不会复用相同坐标address表设置building_id、apt联合唯一约束,避免同一楼栋下重复录入相同公寓号address表保留原有地址字段的联合唯一约束做双重校验
两种方案均可满足需求,仅做约束调整优先选方案1,后续要做楼栋维度的业务管理优先选方案2。
内容的提问来源于stack exchange,提问作者anonymous
相关产品推荐
相关产品推荐

