假设有个商场,里面有很多商铺,产品分类是多级的(树状分类) 如:
服装{
衣服(棉衣、大衣...)
裤子(牛仔裤、内裤...)
鞋子...
}
数码{
电脑(笔记本、台式...)
相机...
}
家居{
...
}
...

而商铺存在卖多种产品的情况 如,又卖服装,又卖家居...
也就是说,这是一个典型的多对多关系类型。

目前我是这样建的:
store(商铺表)
id
storeName 商铺名
...
category (产品分类表)
id
categoryName 分类名
parentId 上级分类id(0为父级分类)
relations (关系表)
id
storeId 商铺id(外键)
categoryId 分类id(外键)注:这里的数据都是叶级分类,也就是不可拆分的分类


问题1:请问我这样的设计方案是否合适呢?有没有比这个更好的设计方案呢?

假设有如下数据:
store(商铺表)
id=1/storeName=店铺A
id=2/storeName=店铺B
... category(产品分类表)
id=1/categoryName=服装/parentId=0;
id=2/categoryName=数码/parentId=0;
...
id=11/categoryName=衣服/parentId=1;
id=12/categoryName=裤子/parentId=1;
...
id=111/categoryName=大衣/parentId=11;
id=112/categoryName=棉衣/parentId=11;

relations (关系表)
id=1/storeId=店铺A/categoryId=111
id=1/storeId=店铺A/categoryId=112
id=2/storeId=店铺B/categoryId=111
...

问题2:如何查询例如所有卖大衣(categoryId=111)的店铺
问题3:如何查询例如所有卖服装(categoryId=1)的店铺假设以我设计的数据库为准,用的是MySql数据库(你用别的数据库语法实现也行,思路应该是相通的)

解决方案 »

  1.   

    问题2:如何查询例如所有卖大衣(categoryId=111)的店铺关键要看你的定义是什么?比如一个商店卖“服装”,那算不算它也买大衣?
    如果算 这个需要写程序,或者用存储过程来第一步取得所有的  categoryId=111 的父类, "111,11,1"如果不算,相信很简单了,你自己就可以写出来了一个普通的SQL语句。
      

  2.   

    问题3:如何查询例如所有卖服装(categoryId=1)的店铺需要写程序,或者用存储过程来第一步取得所有的  categoryId=1 的子类类, "1,11,111"
    参见下贴。MySQL中进行树状所有子节点的查询 
    http://blog.csdn.net/ACMAIN_CHM/archive/2009/05/02/4142971.aspx
      

  3.   


    也谈不上不好,其实很多种设计,包括范式的遵守,也都是在做一种平衡。平衡存储的效率,数据维护的方便和查询的效率之间的问题。仅从ER图上来看,应该是  “类别”实体,加上它们之前的 N:M 关系。这样的话就要设计成二个表类别表,分属表但其中有个概念你可以混淆了。
    男装.棉袄 和 女装.棉袄 并不是一同一个实体,只是名称相同。
      

  4.   

    多加一个产品表产品表
    prod_id  产品id
    产品名称
    分类ID另外 关系表直接存产品id
    relations (关系表) 
    id 
    storeId 商铺id(外键) 
    prod_Id 产品id(外键)
      

  5.   

    不错 你是学JAVA的吗  数据库设计厉害不啊  顶下你
      

  6.   

    好像这两个问题都是自我参照关系啊。
    如果是ERD。Entity自我参照,其中多一个属性“层级”即可
    如果是Class。Class里面多一个: 服装[] fuzhuang = null;
      

  7.   

    只回答后面的两个问题:
    1.select * from store
    where id in
    (
        select storeId from relations 
        where categoryId=111
    )
    2.select * from store
    where id in
    (
        select storeId from relations 
        where categoryId in 
        (
             select id from category 
             where parentId=1
        )
    )
      

  8.   

    我们开过sql的课不过我学得不好
      

  9.   

    问题1:store category relations
    问题2:集合运算,比元素运算快
    select distinct store.* from store,relations
    where store.id =relations.storeid and categoryId=111
    问题3:如何查询例如所有卖服装(categoryId=1)的店铺 
    select store.* from store,relations where store.id =relations.storeid and categoryId in 
        (
             select id from category 
             where parentId=1
        )
      

  10.   

    都说了,产品分类不要用ID: Integer , 这样整死你! 
      

  11.   

    思路和LZ大概相同,偏向树形分类,也考虑过按切割字符串来分大小类。
    衣服有性别之分,考虑末尾用3个值区分,一个表示不分性别
    分类严格按照只有一个父类来,数码相机->相机->数码
    查询用LIKE模糊查询,
    如果分类的层次相同的话就更好了