Skip to content

一个商品四个分类,用逗号拼在一格里 ​

一个商品四个分类: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 里?

会 → 拆表。不会 → 逗号存着挺好,别为了范式而范式。

签名-B

大粽子