一个商品四个分类,用逗号拼在一格里
一个商品四个分类:3、7、12、45。用逗号拼在一格里。
老项目里常见这种字段:
category_ids varchar "3,7,12,45"一个商品属于多个分类,不建关联表,直接逗号拼在一个字段里。代码里再切开。
科班的第一反应是「这违反第一范式」。 但这种字段在真实项目里活得挺好,
而且往往比关联表活得久。
java
List<Integer> ids =
Arrays.stream(str.split(","))
.map(Integer::parseInt)
.collect(toList());科班的反应是「这违反第一范式」。但它在真实项目里活得很好,值得说清楚什么时候能忍、什么时候必须拆。
能忍的情况:
- 这串 ID 只跟着主记录一起读写,从不单独查
- 数量确定很小(比如最多十几个)
- 不需要按它做筛选、统计、排序
商品的图片顺序、一个配置里的白名单 ID——这类拿出来就是整体使用的,拆成表纯属增加 join。
必须拆的情况,只要中一条就得拆:
- 要反查。 「查所有属于分类 7 的商品」——用
LIKE '%7%'会把 17、70、27 全查出来。用FIND_IN_SET能对,但走不了索引,数据量一上来就是全表扫。 - 要统计。 「每个分类下有多少商品」,逗号字段做不了
GROUP BY。 - 数量会涨。 今天十几个,明天几百个,字段长度就成了隐雷。
判断有两句话:这个字段会不会出现在 WHERE 或 GROUP BY 里?
会 → 拆表。不会 → 逗号存着挺好,别为了范式而范式。
