消息关闭
    暂无新消息!

关于商品无限极分类Mysql表设计

问题作者 : 嗒D2017-05-04发布

目前有三张表, 1: goods 商品主表 id name price

          2: goods_type 商品类型表  tid name 
          3:  goods_type_map  商品和商品类型关系表  id gid gtid

之前的表结构如上,现由于商品对应类型可以为一对多,一件商品可以对应多个类型,我每次更新商品所属类型时需要现将关系表已存在的内容删除再插入新的类型关系。

goods 表:

    id  name  price  goods_type
    1   洗面奶    22    1,8
    2   面膜      33    11

goods_type表

    tid name 
    1    化妆品
    8    护肤品
    11   保健品

故想更改为: 在商品主表中增加 goods_type 字段,来取代goods_type_map表,多个类型使用逗号隔开.

但目前出现问题,当查询某个类型的商品时,使用Like查询会经常查询错误。 所以想问下这种情况应该怎么处理


9个回答

︿ 0

你在使用like的时候 比如有这样一个值 1,2,11 like 1 会like到 1和11
这种情况请使用find_in_set

如果你非要使用like,字段值 可以这样 ,1,2,11, 你like的时候 like ,1, 也可以达到目的

︿ 0

你这个已经明显是个多对多的关系了。
所以我感觉,你还是保留三张表比较好。
这样比较符合范式。

︿ 0

不要用like
如果数据库中某字段存储为1,2,3,或者2,1,3或者3,1,2等值时,你要查找为2的就需要用到find_in_set了
select * from table where FIND_IN_SET('4',字段名)

︿ 0

也可以考虑用存储过程递归实现,不过不推荐这么做,无限级分类本身就不是一种良好的用户体验设计,更何况会增大服务器和数据库压力。

︿ 0

符合范式应该更加合理,如果你硬要按原来想法的话,在每个分类Id前后加上分隔符,用like匹配时加上分隔符就可以了

︿ 0

就用mysql 的find_in_set 函数吧。实在不行就再拆分出来。或者,单独维护一张表,专门用来维护商品和商品类型关系的表。新增一张 goods_relevance_goodsType :goods_id goods_type_id