各有利弊。
电脑配件太繁杂,如果每类一个表虽说检索方便些,但维护量太大。
而且不断有新品出现,给分类建表带来很多麻烦个人倾向于用一个表存储,只需有:分类、品名、型号、规格、单价等几个基本字段就可以了
规格中保存用逗号分开的该产品的技术指标即可
注意是“逗号”,因为需要用mysql的find_in_set函数进行检索
当然也可以用序列化数组保存技术指标,好处在于可连同指标名一同保存。灵活性更大些。不过检索时只能用like了,略微慢些

解决方案 »

  1.   

    产品表Products(Id, ProductName,ProductType等基本属性)产品属性表ProdAttr
    column1   | column2  | column3 |  column4 | ......属性字典表
    产品类别 | columnID | 对应column名称 查询的时候根据某个产品的类别ID查找属性字典表,取出产品属性表的每个column所对应的属性名称。
    比如产品类别ID为1,属性字典表中相应的数据为:
    1        | column1    |  长度
    1        | column2    |  宽度则产品属性表ProdAttr中的column1和column2分别代表“长度”和“宽度”两个属性。
    这样,就把所有的属性填充到一张表中,而不需要单独为每个类别建表。
      

  2.   

    FIND_IN_SET(str,strlist) 
    Returns a value 如果字符串 str 在由 N 个子串组成的列表 strlist 中,返回一个 1 到 N 的值。一个字符串列表是由通过字符 “,” 分隔的多个子串组成。如果第一个参数是一个常数字符串,并且第二个参数是一个 SET 列类型,FIND_IN_SET() 函数将被优化为使用位运算!如果 str 在不 strlist 中或者如果 strlist 是一个空串,返回值为 0。如果任何一个参数为 NULL,返回值也是 NULL。如果第一个参数包含一个 “,”,这个函数将完全不能工作: 
    mysql> SELECT FIND_IN_SET('b','a,b,c,d');
            -> 2----------------顺便贴一下,呵.
      

  3.   

    谢谢各位!唠叨的方法看得不是太明白,如果用逗号来分开那些技术指标,我如何知道第一个的就是cpu的频率呢?还是要自己手写一个说明来分呢?如果是这样的话,当cpu改频率的说法的时候,就加多一个数据在后面,然后就不读第一个,而读最后一个?对吗?bingofei(bingo)的方法看上去不错,ProdAttr表里的是具体的数据,字典表就是产品的指标名字对吗?bingofei的方法看上去好像比较好,大家觉得呢?真的很感谢大家等我的疑问都解决了,就马上给分。
      

  4.   

    collins_nz(小强) ,对,ProdAttr表里的是具体的数据,字典表就是产品的指标名字。这种方法需要在ProdAttr表中预先多设计几个column,以满足所有可能的指标。并且考虑到扩展性,也就是以后可能增加更多的指标,还需要预留几个空的column以备后用。另一个方法就是产品数据不多的情况下:
    ProdAttr设计成这样:
    ProductID  |  AttrName  | AttrValue  
    -----------------------------------
    0001       |  长度      | 30
    0001       |  宽度      | 60
    ....这样的好处是扩展性、直观性比第一种方法强,但数据冗余度太大,查询效率很低。
      

  5.   

    如果用逗号来分开那些技术指标,我如何知道第一个的就是cpu的频率呢?还是要自己手写一个说明来分呢?
    是的,当然需要你来指定。数据的含义是由排列的顺序来决定的如果是这样的话,当cpu改频率的说法的时候,就加多一个数据在后面,然后就不读第一个,而读最后一个?
    不是。是修改对应位置的值所以我建议用数组保存数据,序列化后入库
      

  6.   

    从数据库思想上来说,那个bingofei的思想也可以,但是太过繁琐(最多两个表,他却用了三个)。而从实际意义上将,分出一个属性表来,程序处理上繁琐很多。
      

  7.   

    hehe 没给我分没关系了,我也学了东西,而且,我只是把MYSQL手册上的东西贴一下,没什么技术含量.....呵