Octopus系列之关于多选属性如何在OO中表示呢?
在电子商务系统中 关于产品属性的问题
会设计如下几个表
产品信息 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 该怎么表示出来了呢?
Octopus系列之关于多选属性如何在OO中表示呢?的更多相关文章
- MVC之前的那点事儿系列(9):MVC如何在Pipeline中接管请求的?
文章内容 上个章节我们讲到了,可以在HttpModules初始化之前动态添加Route的方式来自定义自己的HttpHandler,最终接管请求的,那MVC是这么实现的么?本章节我们就来分析一下相关的M ...
- WebPack系列:Webpack编译的代码如何在tomcat中使用时静态资源路径不对的问题如何解决
问题: 使用webpack+vue做前端,使用tomcat提供api,然后npm run build之后需要将编译,生成如下文件: | index.html \---appserver ...
- Octopus系列之各个页面调用示例
调用首页产品 可选参数如下 New = 1, Hot = 2, Best = 3, Special = 4, Featured = 5, Other = 6 #foreach($item in $oc ...
- WPF基础到企业应用系列7——深入剖析依赖属性(WPF/Silverlight核心)
一. 摘要 首先圣殿骑士非常高兴这个系列能得到大家的关注和支持.这个系列从七月份開始到如今才第七篇,上一篇公布是在8月2日,掐指一算有二十多天没有继续更新了,最主要原因一来是想把它写好,二来是由于近期 ...
- Octopus系列之各个页面调用示例2
判断登陆的调用 #if(${islogin}) <span> ${Oct_Welcome} or <a href="${siteurl}customer/logout/&q ...
- Octopus系列之数据上传格式要求说明
各个数据列要求 价格列:字符串类型[美元价格] 产品名字:可以支持"/"等字符 分类名字:去空格处理 不得包含"&"符号 主图:一定要有主图列 不为空 ...
- WPF快速入门系列(2)——深入解析依赖属性
一.引言 感觉最近都颓废了,好久没有学习写博文了,出于负罪感,今天强烈逼迫自己开始更新WPF系列.尽管最近看到一篇WPF技术是否老矣的文章,但是还是不能阻止我系统学习WPF.今天继续分享WPF中一个最 ...
- Octopus系列之如何让前台的js脚本变得灵活重用
Octopus系列如何让前台的js脚本变得灵活,重用 方式1:ajax方式 方式2:form表单方式 面向对象的脚本封装 jQuery的封装 做Web开发的少不了前台Ajax的使用, 返回true:f ...
- Octopus系列之更新历史记录
更新笔记历史 2015.2.3 更新了产品价格的计算方法 --采用了通用化的一个处理[支持各个国家货币]更新产品价格,增加两组价格:一组用来进行前台的展示:一组用来进行后台的计算更新了产品分类 ...
随机推荐
- Mysql数据库实践操作之————批量插入数据(100万级别的数据)
第一种方法:使用insert into 插入 从Redis每次获取100条数据,根据条件去插入到Mysql数据库中: 条件: 如果当前队列中的值大于1000条,则会自动的条用该方法,该方法每次获取从队 ...
- Redis实践操作之—— keyspace notification(键空间通知)
一.需求分析: 设置了生存时间的Key,在过期时能不能有所提示? 如果能对过期Key有个监听,如何对过期Key进行一个回调处理? 如何使用 Redis 来实现定时任务? 二.序言: 本文所说的定时任务 ...
- Jquery 移除 html中绑定的onClick事件
HTML绑定示例: <button class="edit" onClick="showTurnEdit(this)">编辑</button& ...
- JSON入门实例
json和XML很像,但它具有更快,更小,阅读性强等优点.不多说,直接来例子: <html><body><h2>通过 JSON 字符串来创建对象</h3> ...
- caffe中的Blob块
首先说明:Blob定义了一个类模板. 让我们看一下Blob的头文件里有什么哈: 定义了一个全局变量: const ; 看看它的构造函数: Blob() : data_(), diff_(), coun ...
- [js] 跨域
原文链接:http://www.cnblogs.com/scottckt/archive/2011/11/12/2246531.html 什么是跨域? 首先什么是跨域,简单地理解就是因为JavaScr ...
- base64 数据处理
base64 数据处理 1. base64 字母表 2. 原理 处理原理 http://baike.baidu.com/view/469071.htm 3. iOS上的应用 iOS7 之前使用http ...
- cocos2dx与Lua以及quick cocos
1.cocos2dx中的脚本架构与组件 2.quick cocos的开发优势 3.自定义c++类如何导出到lua
- java线程中断和终止线程运行
ava中启动一个线程很容易,通常情况下我们都是等到任务运行结束后让线程自行停止.但有时需要在任务正在运行时取消他们,使得线程快速结束.对此Java并没有提供任何机制.但是我们可以通过Java提供的线程 ...
- 【软件使用】TortoiseSVN版本管理软件使用简单说明
TortoiseSVN版本管理软件使用简单说明 很多时候在写一个小的项目不想使用github等工具,只想简单在本地搭建一个版本管理器.那么TortoiseSVN就非常适合. 第一步:下载Tortois ...