搜索

首页  >  问答  >  正文

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

目前有三张表, 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查询会经常查询错误。 所以想问下这种情况应该怎么处理

黄舟黄舟2757 天前671

全部回复(6)我来回复

  • 大家讲道理

    大家讲道理2017-05-16 12:04:51

    用like并不是一个好的选择,推荐一个Mysql函数find_in_set应该能解决楼主需求。官方文档:https://dev.mysql.com/doc/ref...

    回复
    0
  • PHP中文网

    PHP中文网2017-05-16 12:04:51

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

    回复
    0
  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-05-16 12:04:51

    先用like查出部分数据,再循环in_array()过滤,要不就改表结构吧

    回复
    0
  • 伊谢尔伦

    伊谢尔伦2017-05-16 12:04:51

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

    回复
    0
  • 淡淡烟草味

    淡淡烟草味2017-05-16 12:04:51

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

    回复
    0
  • PHPz

    PHPz2017-05-16 12:04:51

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

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

    回复
    0
  • 取消回复