存储CF_LEVER表行组合的表结构优化设计技术咨询
最优表设计方案(完全无需应用层维护LEVER_COMBO_ID)
两种落地方式可根据业务场景选,都不需要应用层生成或维护组合ID:
方案1:三级表结构(扩展性最强,推荐)
不需要修改你现有CF_LEVER表,只需新增2张表:
CF_LEVER_COMBO(杠杆组合主表)- 字段:
LEVER_COMBO_ID设为数据库自增主键,完全由数据库自动生成,不需要应用层介入;后续如果需要给组合加属性(如所属客户、创建时间、启用状态)直接在这张表加字段即可
- 字段:
CF_LEVER_COMBO_REL(组合-杠杆关联表)- 字段:
REL_ID(可选主键)、LEVER_COMBO_ID(关联组合主表主键)、LEVER_ID(关联CF_LEVER表的主键ID) - 加联合唯一约束
(LEVER_COMBO_ID, LEVER_ID),避免同一个组合下重复添加同一个杠杆;加外键约束保证数据一致性
- 字段:
操作逻辑(全数据库层完成,零应用层ID维护)
当你需要存入一个新的杠杆组合时:
- 先校验该组合是否已存在,用如下SQL查询即可(以杠杆ID为1、3、5的组合为例):
SELECT LEVER_COMBO_ID FROM CF_LEVER_COMBO_REL GROUP BY LEVER_COMBO_ID HAVING COUNT(DISTINCT LEVER_ID) = 3 AND GROUP_CONCAT(DISTINCT LEVER_ID ORDER BY LEVER_ID ASC) = '1,3,5'
- 若查询到结果,直接复用返回的
LEVER_COMBO_ID即可;若未查询到结果,先给CF_LEVER_COMBO插入一条空记录拿到自动生成的自增ID,再批量把组合对应的杠杆ID插入关联表即可。
方案2:哈希值作为组合ID(轻量无额外主表)
如果不需要给杠杆组合加额外业务属性,可以直接用排序后的杠杆ID拼接生成哈希值作为LEVER_COMBO_ID,也不需要应用层维护ID序列:
- 操作方式:将本次要组合的所有杠杆ID按升序排序后拼接为字符串,生成MD5/SHA1哈希值作为组合唯一标识
- 注意点:必须先排序再拼接,否则相同组合因为ID顺序不同会生成不同哈希,出现重复存储问题
- 适用场景:几千个组合的量级下,哈希碰撞概率可以忽略,性能完全足够
内容的提问来源于stack exchange,提问作者AVI
相关产品推荐
相关产品推荐

