论坛首页 Java企业应用论坛

关于商品分类 商品表和属性表的设计

浏览 11643 次
精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-03-15  
以前有这样的一个需求,不考虑像京东或者淘宝这样分类下有子分类的情况,只考虑一层分类的情况下,可以随便添加分类,可以任意给商品添加属性,而不需要更改表的结构. 于是设计了一个这样的结构,实现还是可以实现,一直在用,但是在操作上比较麻烦,大家讨论下有没有更好的方式.

----------------------------- 以下是几个关联的对象 省去了 getter/setter 方法 ------------------
Field.java 属性
public class Field{
   private Integer id;
   private String name; // 属性名称
}


ProductField.java 商品属性
public class ProductField{
     private Integer id;
     private Field field; // 属性对象
      private String value; // 属性值 这里的值不管是整数 小数 还是什么类型都是用 String 类型

}


Product.java 商品表
public class Product{
   private Integer id;
   private String name; //商品名称
   //根据商品 加载这个商品的所有属性 和属性值
   private Set<ProductField> productFields = new HashSet<ProductField>();//商品属性集合
}


Type.java
public class Type{
   private Integer id;
   private String name; //分类名称
   //通过类型 可以加载这个类型下的所有商品  一种类型对应多种商品
   //(暂时不考虑一种商品属于多种类型 例如手机属于电器类,也属于通讯类产品)
   private Set<Product> products = new HashSet<Product>();
}


----------------------  Hibernate 配置文件就不帖出来了,以下是由POJO和hbm配置文件生成出来的表 示例-


//表关系
Type      
id name   
1  电脑     
3  手机      
4  脑残       
        
Product
id  name  typeid
1   SONY    1(fk) 
2   DELL    1
3   韩国猪   4
4   叁欣     3

Fields   
id name  
1  颜色
2  重量
3  型号
...
ProductFields
id pdctid  fieldid   value
1  (fk)1   (fk1)1    红色
2      1        2    500g
3      2        3    XYZ
4      2        1    白色
5      3        4    1000.00

--加载的测试数据

+++++++++ 商品信息 ++++++++
Name:Sony
价格 - 2000.00
型号 - YY-1939
名称 - 锁你牌手机


  • 大小: 28 KB
   发表时间:2010-03-15  
我要补充的是,当商品越来越多的时候,属性的增加也是自然的,有肯能属性增加到1000种,
那么我在后台管理 新增加一个商品,给它添加属性时,这时就需要从已经存在的属性中选出
它所需要的那么10种或者20种属性。

我的想法是,程序处理中:
1.在页面输出可选择的属性时按属性名称排序,这样可能选择快一些。
2.提供属性搜索,看数据库中有没有这么一属性,如果有直接使用,如果没有就添加
3.修改此数据库表,属性应该和大的类型相关联,作为常用属性。 次要属性可以从后续的属性列表中选择。
0 请登录后投票
   发表时间:2010-04-19  
性能如何解决?
动态列总是有性能问题的,可是想不到什么好主意。
0 请登录后投票
   发表时间:2010-04-19  
动态列性能上确实可能会有点问题。比如你要统计:红色的手机的一个月销售额就需要至少在四个表(类型、产品、属性、销售)进行联合查询。

我以前遇到类似问题,而且时间上不允许更改设计了,当时只是采取了一些简单的处理方式,比如针对需要的统计生成中间表,对库进行索引优化,根据时间进行分表等等。不过我个人感觉出问题的地方往往是一些特定统计,如果你能确定或基本上确定最终这些表的统计查询的方式,我觉得问题不大。你可以预估下数据量,假设半年后的运营, 类型、产品、属性、销售等数据大概是多少,联合查询的总记录数是多少。如果这个数据比较恐怖,那你再可以考虑更换其他方式。
0 请登录后投票
   发表时间:2010-04-30  
敢问楼主,为什么要单独抽取一个Field呢?
public class ProductField{  
     private Integer id;  
     private String fieldName; // 属性对象  
      private String fieldValue; // 属性值 


这样不可以吗
0 请登录后投票
   发表时间:2010-04-30  
darrendu 写道
敢问楼主,为什么要单独抽取一个Field呢?
public class ProductField{  
     private Integer id;  
     private String fieldName; // 属性对象  
      private String fieldValue; // 属性值 


这样不可以吗

取决于打算不打算复用field定义了。
个人看复用的原因更多些。可以跟着定义值的集合或限定,要改显示名字也是一起改。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics