有个工作项目,要求的产品分类跟阿里巴巴的方式相似,但观察了下它的流程有些不明白来请教下高人。像它这种方式:
供应首页 > 卫浴洗漱日化用品 > 美发造型用品 > 洗发水
http://list.china.alibaba.com/buyer/offerlist/1041075.html比如一瓶“海飞丝洗发水”,在点以上的三个类别它都会出现在列表里,这样是用什么方式做到的呢?依我的肤浅理解,它的类别应是多级分类,可就是想不通当在发布“海飞丝洗发水”时,它的所属类别ID是什么呢,难道是在同一字段里存储多个类ID吗?比如(1,3,5...),如果是的话它又如何查询结果呢?项目是PHP+MYSQL环境,请各位有经验的朋友指点一下,谢谢!
另谁有效率较高的N级分类例子参考一下吗?我现在使用的是递归方式,感觉效率很不好。

解决方案 »

  1.   

    表结构
    类别表: class
    sid  pid  name
    1    0   卫浴洗漱日化用品
    2    1    美发造型用品
    3    2    洗发水产品表:pro
    id sid  pro_name
    1  3    海飞丝洗发水
    这样设计类别表可以实现无限级别,可扩展,查询时需要循环出子类别,然后把相关产品信息显示.
    数据两大可考虑用缓存,介绍服务器开销
      

  2.   

    谢楼上的指点,我现在就是这种设计。可觉得不合理的就是:
    当来路 sid=1时,查pro表就得不到产品了,因为它只存储到最底层的sid,所以我才在想用不用把1、2、3的类ID都存储进去。
      

  3.   

    理论上讲.做一个关系映射表更靠谱.relation_product_catetoryid  catetory_id product_id
      

  4.   

    所以我说了需要循环子类的产品.你可以写一个方法专门查询出该类及其子类:
    比如:来路 sid=1那么你就返回1,2,3
    在查询的时候in(1,2,3) 就可以了至于4楼的关系表是没有必要的,因为产品表里本生就是个关系表.你的设计也不符合楼主的需要
      

  5.   


    明白,这也是一种解决方法。只是担心in()的效率不行,当数据多的时候恐难胜任。
    我当前在试着把关系类ID都存入产品表字段,然后用find_in_set(1,sid),虽然可行,但效率也明显不高。
      

  6.   

    这是 M:N relationship
    正确做法是像4楼所说的...加映射表但映射表中的 id 字段不需要product
    PRIMARY(product_id), product_name ...category
    PRIMARY(category_id), category_name ...product_category_relation
    PRIMARY(product_id, category_id)
      

  7.   

    @yctin谢谢指点,在下水平有限想不出这个关系该如何存储,可否烦请您再说具体点。比如以上例子:product_id
    海飞丝洗发水  =12category_id
    卫浴洗漱日化用品 =1
    美发造型用品 =3
    洗发水 =5那我该在product_category_relation 表中存储什么呢?在前端查询时用什么方法呢?
      

  8.   

    用父节点控制啊 
      结构比如
    ID value   PID
    0    中国     0
    1   北京     0
    2   山东     0 
    3   河南     0
    4   山西     0 
    5   昌平     1
    6   海淀     1
    7   济南     2
    8   青岛     2
    9   日照     2
    10  郑州     3
    11  安阳     3
    12  洛阳     3
    13  晋城     4
    14  太原     4
      

  9.   

    如果是无限分类,感觉还是3楼说的可行,楼主可以搜索下“discuz 无限分类”
      

  10.   


    discuz有无限分类? 别害人家.