在电子商务系统中 关于产品属性的问题
会设计如下几个表
产品信息 Product
选项信息表 Option 存储 Size Color....
选项值信息表 OptionValue 存储每个选项的值信息 比如 X,XL;red blue 等值信息
选项--选项值信息表 OptionToValue 存储选项和选项值之间的关系【一对多的关系】
产品属性信息表 将产品ID 选项ID 选项值ID 关联起来 ProductAttribute
下面贴出几个表的信息
CREATE TABLE [Product] ( ,) NOT NULL, Name --当然我简写了 )
CREATE TABLE [Option] ( ,) NOT NULL, ) NOT NULL DEFAULT (''), )) )
CREATE TABLE [OptionValue] ( ,) NOT NULL, ) NOT NULL DEFAULT (''), )) )
CREATE TABLE [OptionToValue] ( ,) NOT NULL, )), )) )
CREATE TABLE [ProductAttribute] ( ,) NOT NULL, )), )), )), )) )
现在我在程序中 使用这几个东西
关系也是明确的
选项--选项值 一对多
产品--选项 一对多
好创建系统中的VO 对象
先来创建 选项 ---选项值 Option类维护一个List<OptionValueInfo> Values 的一个引用 完成一对多关系的维护
public class OptionInfo : EntityInfo { public int OptionID { get; set; } public string Name { get; set; } public int SortOrder { get; set; } public List<OptionValueInfo> Values { get { return OptionManager.GetOptionValueList(OptionID); } } } public class OptionValueInfo : EntityInfo { public int OptionValueID { get; set; } public string Value { get; set; } public int SortOrder { get; set; } }
产品--选项
我通过产品ID 查询该产品的多个选项【也叫做属性】 通过 List<OptionInfo> Attributes 来维护引用关系
查询SQL语句如下
select * from [Option] where OptionID in ()
实现
public List<OptionInfo> GetOptionList(int productID) { string cmdText = "select * from [Option] where OptionID in "; cmdText += "(select distinct OptionID from ProductAttribute where ProductAttribute.ProductID=@ProductID)"; SqlParameter[] parms = { SQLHelper.MakeInParam(, productID) }; return DbEntityHelper.DataReaderToEntities<OptionInfo>(SQLHelper.ExecuteReader(cmdText, parms)); }
public class ProductInfo : EntityInfo { private string _code; private CurrencyInfo _currencyInfo; public ProductInfo() { this._code = Utils.GetCookie(OCKeys.COOKIE_CURRENCY); if (!string.IsNullOrEmpty(_code)) { _currencyInfo = CurrencyManager.GetCurrencyByCode(_code); //这样获取有问题 因为CurrencyInfo构造器并没有任何的初始化 应该再次读取一次 //if (_currencyInfo == null) //{ // this._currencyInfo = new CurrencyInfo(); //} } } #region 基础属性 public int ProductID { get; set; } public string Name { get; set; } public int CategoryID { get; set; } public decimal Price { get; set; } public decimal SingleDiscount { get; set; } public decimal GroupDiscount { get; set; } public int Status { get; set; } public int CustomAttribute { get; set; } public List<OptionInfo> Attributes { get { return OptionManager.GetOptionList(ProductID); } } }
呵呵 说了这么多 好像有点罗嗦对吧 还没有说问题呢
产品的多选属性说完了,下面说说一个业务上的问题
"属性价格" 就是属性影响产品的价格 这个在 开源电子商务程序 zencart中有设计
比如我卖一双鞋子,鞋子有红色和黑色,当我选择红色时,我希望多收取5美金 ,黑色时,收取10美金
还有如果卖内存条,4G和8G的属性 将会收取不同的属性价格
还有如果卖球衣,球衣有一个 “球衣号码”的多选属性,我希望在客户在购买的时候,他可以自己输入自己想要的球衣号码,这个时候属性要求设置为
不同号码的球衣将会加收不同美金
上面是这个需求,下面我们看设计
使用 options_values_price 表示要加收的属性价格;使用price_prefix表示价格前缀“+”--表示加收几美金;“-”表示少收取几美金
那么我们将属性价格这个字段,放在那个表呢?
显然这个好像不应该放在OptionValue表中,因为同一个属性值在不同产品上设置的属性价格 是不同的
比如产品A和产品B -A产品的属性红色款 加收5$, B产品的属性红色款 加收10美金,如果将options_values_price 放在OptionValue中那么就是就是同一个价格了
看了zencart的设计,options_values_price 放在了products_attributes表中,也就说属性价格 是属于产品 属性 属性值 之间关系的描述 是一个关系属性【不知道说的对不对
,大神勿喷】
那么这个时候我在创建VO对象的时候 该怎么表示 options_values_price 这个属性呢?
前面有了 产品类Product 属性类Option 属性值类OptionValue 之间的关系也是清楚的
那么options_values_price 该怎么表示出来了呢?