`

关于产品动态属性的做法

    博客分类:
  • Java
阅读更多

      最近在做一个电子商务网站( http://www.legendesign.net/ ),暂时叫 LegendShop吧,网站支持多个商家发布产品,类似 于淘宝等商城,不同点在于 LegendShop的整个界面内容是可以自定义的,没有任何植入式的主网站的广告。

     产品有一些固定属性,但是每个商家所销售的产品是不一样的,例如卖家具的有大小,颜色等,卖家电的有大小,品牌等。因此要为每个产品增加动态属性,商家在 建立产品的时候可以自定义该产品的属性。

     思路是每个产品对应 0..n个动态属性,每个属性有 0..n个选项。


 

为了满足需求上要求,有些属性要求客户是直接填写的,有些是多选项,有些是要单选的。因此设计了 4中属性类型 Select(选择框) , Text(文本框) , Radio(单选框) , CheckBox(多选框)。

         方法一:可以将以上实体定义为一个数据库表,每次读取产品的时候再装载动态属性,需要做表关联。此方法需要增加 2张表,但方便于采用 SQL做数据统计。 但每个产品都建立一次动态属性显然是没有必要而且很麻烦,因为相关的产品的动态属性是一致的,没有必要重复创建。 为了用户更容易增加动态属性,最好增加一个动态属性的模板,每次新建产品的时候直接指定采用那一个属性模板,但是模板一旦使用则不能轻易删除,否则动态属性就不见了。另外客户在订购的时候将填写或者选择这些动态属性,并将结果存入产品订购表。

      方法二:采用对象数据库的方式,将动态属性以对象形式存到产品表中。此法不需要新建产品属性表和属性选项表,查询产品的时候可以直接把动态属性查询出来,但需要自己动手将对象和页面功能对应起来。 该字段可以直接存放 Java的对象,或者将对象转化为 JSON对象或者 XML再行存放。 如果采用 Oracle的话,那需要采用 BLOB的字段来存放对象,或者采用 CLOB来存放 JSON XML。下面用代码来展示如何实现方法二的。

 

属性类型定义:

public enum ModelType {

    Select , Text , Radio , CheckBox ;

}

 

属性定义:

public class Model implements Serializable {

 

    private String id ;

    /**

     * may by select text radio checkbox

     */

    private ModelType type ;

 

private Item[] items ; // 属性选项

 

选项定义:

public class Item implements Serializable {

 

    private boolean nullEnabled = false ;

 

    private boolean selected = false ;

 

    private String key = null ; // 后台定义的选项关键字

 

private String value = null ; // 用户输入的属性值

 


      界面说明:后台可以自定义上面提到的 4种属性类型。点击提交的时候通过 JSON将属性数组保存为产品表中的属性。当客户浏览产品的时候可以看到后台动态属性的定义,当然客户是不知道这些属性是动态增加的还是固定的。他们订购的时候选择对应的选项再提交,如果需要对选项做 validate的话,那在 Item中增加 needValidate属性,再页面中再行判断。

     

提交之后以 JSON方式交给 DWR处理,直接得到 Model[]数组。或者采用 DOM的方式得到 XML传到后台的 controller进行处理。下面的例子是采用 JSON的方式实现的。具体看附件。

 

DWR的配置文件,否则不能通过 DWR来传输对象。

      < dwr:configuration >

            < dwr:init >

            < dwr:converter id = "date" class = "bingo.vasms.bizstreet.dwr.CalendarConverter" />

        </ dwr:init >

            < dwr:convert type = "date" class = "java.util.Calendar" ></ dwr:convert >

        < dwr:convert type = "bean" class = "com.done.entity.Model" ></ dwr:convert >  

        < dwr:convert type = "bean" class = "com.done.entity.Item" ></ dwr:convert >

        < dwr:convert type = "enum" class = "com.done.entity.ModelType" ></ dwr:convert >

      </ dwr:configuration >

 

 

  • 大小: 6.6 KB
  • 大小: 23.1 KB
0
0
分享到:
评论
3 楼 onecan 2011-04-30  
我们没有对产品属性进行全文检索
2 楼 danny99899 2010-07-12  
补充:
如果正如刚刚所说的,用数据表 来实现key-value 这样的结构的话,那么这个索引表应该怎么样去维护呢?
1 楼 danny99899 2010-07-12  
想请教一下楼主,关于第二种方式,我在CSDN程序员杂志里看过一位架构师,是taobao 的,他也提到用xml 来描述产品属性是比较好的,因为xml 的特点容易扩展

但有一个问题就是怎么样实现全文搜索??
例如有一件T Shirt
包含的属性有:
大小 , 颜色,款式等
如果把这些属性都以 xml格式 存放到数据库里的话那怎么搜索?(这里的xml 格式跟第二个方案里所提到的面向对象的情况相同)

我记得那篇文章里提到有一个东西,不知道是否为全文搜索关键所在,他是把数据实体用xml 格式来存放,然后参照 Key-Value 结构的方式,建立针对该实体XML数据的 N张 索引表,反正需要按照多少个属性来搜索,就有多少张表,

请问楼主都是这样实现的吗???

如果有机会望得到楼主的指点~小弟QQ:86508962
(PS:我都系广州噶,越秀区呢边)

相关推荐

    大数据与银行数字化转型.doc

    在实际应用中,静态属性也并非一成不变,会随着具体情况 的变化进行动态调整,不过其频率和范围较行为属性的变化要相对稳定。对银行客户来 说,典型的行为信息包括客户通过某一渠道访问或使用银行某一产品、服务的...

    皮肤控件研究文档,破解后的库文件,皮肤设计工具使用教程

    属性,如image的picfile属性即更换图片,text的content属性即文本内容。这种界面需求在界面开发中十分常见。  界面库高效性 DSkinLite与其他界面库相比有以下特点: 没有采用Hook所有进程消息的方式,因此没有替换...

    asp.net知识库

    动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个时间转换的问题,顺便谈谈搜索技巧 .net中的正则表达式使用高级技巧 (一) C#静态成员和...

    测试覆盖率

     • 动态监测 - 在测试执行过程中,实时获取并显示正在执行的各测试脚本的状态。  • 响应时间/吞吐量 - 测试对象针对特定主角和/或用例的响应时间或吞吐量的评测。  • 百分位报告 - 数据已收集值的百分位评测...

    Spring.net框架

    我们的Factory就是利用这种方式根据配置文件动态加载程序集,动态创建对象并设置属性的。有了这个Factory,MainApp中的内容就很简单了: using System; namespace IocInCSharp { public class MainApp { public ...

    IIS6.0 IIS,互联网信息服务

    如果仅需要IIS 7.0支持静态内容,可直接选中“Internet信息服务”,如果希望 Web 服务器支持动态内容,则需展开“万维网服务”分支,将所需的选项全部选中; 点击“确定”,Windows Vista即启动IIS的安装过程; ...

    ssh(structs,spring,hibernate)框架中的上传下载

     •DefaultLobHandler:适用于大部分的数据库,如SqlServer,MySQL,对Oracle 10g也适用,但不适用于Oracle 9i(看来Oracle 9i确实是个怪胎,谁叫Oracle 公司自己都说Oracle 9i是一个过渡性的产品呢)。  •...

    经典SQL语句大全

    15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) select a,b,c from tablename ta where a=(select max(a) from ...

    数据库操作语句大全(sql)

    15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) select a,b,c from tablename ta where a=(select max(a) from ...

    sql经典语句一部分

    15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) select a,b,c from tablename ta where a=(select max(a) from ...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    有近20年使用Oracle技术产品以及Oracle数据库管理员/Oracle数据库应用管理员的经验,是真正应用集群、性能调优以及数据库内部属性方面的专家。同时是一位演讲家及Oracle ACE。  JARED STILL 从1994年就开始使用...

    vc++ 应用源码包_1

    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...

    vc++ 应用源码包_2

    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...

    vc++ 应用源码包_6

    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...

    vc++ 应用源码包_5

    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...

    vc++ 应用源码包_3

    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...

    vc++ 开发实例源码包

    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...

Global site tag (gtag.js) - Google Analytics