在电子商务系统中 关于产品属性的问题

会设计如下几个表

产品信息        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中表示呢?的更多相关文章

  1. MVC之前的那点事儿系列(9):MVC如何在Pipeline中接管请求的?

    文章内容 上个章节我们讲到了,可以在HttpModules初始化之前动态添加Route的方式来自定义自己的HttpHandler,最终接管请求的,那MVC是这么实现的么?本章节我们就来分析一下相关的M ...

  2. WebPack系列:Webpack编译的代码如何在tomcat中使用时静态资源路径不对的问题如何解决

    问题:     使用webpack+vue做前端,使用tomcat提供api,然后npm run build之后需要将编译,生成如下文件: |   index.html \---appserver   ...

  3. Octopus系列之各个页面调用示例

    调用首页产品 可选参数如下 New = 1, Hot = 2, Best = 3, Special = 4, Featured = 5, Other = 6 #foreach($item in $oc ...

  4. WPF基础到企业应用系列7——深入剖析依赖属性(WPF/Silverlight核心)

    一. 摘要 首先圣殿骑士非常高兴这个系列能得到大家的关注和支持.这个系列从七月份開始到如今才第七篇,上一篇公布是在8月2日,掐指一算有二十多天没有继续更新了,最主要原因一来是想把它写好,二来是由于近期 ...

  5. Octopus系列之各个页面调用示例2

    判断登陆的调用 #if(${islogin}) <span> ${Oct_Welcome} or <a href="${siteurl}customer/logout/&q ...

  6. Octopus系列之数据上传格式要求说明

    各个数据列要求 价格列:字符串类型[美元价格] 产品名字:可以支持"/"等字符 分类名字:去空格处理 不得包含"&"符号 主图:一定要有主图列 不为空 ...

  7. WPF快速入门系列(2)——深入解析依赖属性

    一.引言 感觉最近都颓废了,好久没有学习写博文了,出于负罪感,今天强烈逼迫自己开始更新WPF系列.尽管最近看到一篇WPF技术是否老矣的文章,但是还是不能阻止我系统学习WPF.今天继续分享WPF中一个最 ...

  8. Octopus系列之如何让前台的js脚本变得灵活重用

    Octopus系列如何让前台的js脚本变得灵活,重用 方式1:ajax方式 方式2:form表单方式 面向对象的脚本封装 jQuery的封装 做Web开发的少不了前台Ajax的使用, 返回true:f ...

  9. Octopus系列之更新历史记录

    更新笔记历史 2015.2.3 更新了产品价格的计算方法     --采用了通用化的一个处理[支持各个国家货币]更新产品价格,增加两组价格:一组用来进行前台的展示:一组用来进行后台的计算更新了产品分类 ...

随机推荐

  1. 常见Android测试工具简介

    在进行android设备测试过程中,在进行系统测试时候,往往需要关注到很多方面,导致一个崩溃或者运行一段时间自动重启或者停止的问题很多.最简单来看,影响因素就有:底层硬件设备.OS层.上层app层.另 ...

  2. spring的自动装配(default-autowire="byName")

    自动装配,官方给出的定义是这样:Spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系.因此,如果可能的话,可以自 动让Spring通过检查BeanFactory中的内 ...

  3. Spring的DI(Ioc) - 注入bean 和 基本数据类型

    注入bean有两种方式: 注入其他bean: 方式一 <bean id="orderDao" class="cn.itcast.service.OrderDaoBe ...

  4. oracle的基本查询~上

    SQL> --查询一下当前登录的用户名SQL> show user;USER 为 "SCOTT"SQL> --查询当前用户下有哪些表SQL> select ...

  5. sqlcmd 登录和执行语句。

    sqlcmd -U sa -P atc@2014 -S HK-DB01 -d msdb -Q "exec sp_start_job @job_name='3PL_OUT_TEST'" ...

  6. jsp的el表达式

    el表达式的英文(Expression Language) 1.访问 javabean,list,map,数组 2.可以进行一些运算 3.获得web开发的常用对象 导入jstl.jar和stander ...

  7. 转!!sql server 数据库 索引的原理与应用

    索引的概念 索引的用途:我们对数据查询及处理速度已成为衡量应用系统成败的标准,而采用索引来加快数据处理速度通常是最普遍采用的优化方法. 索引是什么:数据库中的索引类似于一本书的目录,在一本书中使用目录 ...

  8. 各种U启网启什么的都是浮云

    对于支持BIOS的电脑,优盘启动,网络启动的各种方案感觉都是浮云,从硬盘启动PE进行维护才是最可靠的.不点在开发wee的过程中给了我们很多维护的灵感,不用费劲地折腾fbinst/U+/量产/PXE/I ...

  9. 利用php的序列化和反序列化来做简单的数据本地存储

    利用php的序列化和反序列化来做简单的数据本地存储 如下程序可以做为一个工具类 /** * 利用php的序列化和反序列化来做简单的数据本地存储 */ class objectdb { private ...

  10. iOS AVCaptureVideoDataOutputSampleBufferDelegate 录制视频

    iOS AVCaptureVideoDataOutputSampleBufferDelegate 录制视频 应用场景: 使用AVFoundation提供的API, 我们可以从 AVCaptureVid ...