近期看了idilent的文章《使用面向对象技术解决商品打折问题》,文后有读者提出要求:如果不同商品的折扣不同怎么办? 或者有买一百送五十这种方式,或不同会员等级的折扣不同。 怎么处理?”idilent认为打折这个问题并不是能够通过一个数据库的字段就可以解决的。有不同的会员,不同的产品,不同的销售计划,而这些也是在不停的不变化和增加的。而会员和产品的打折,以及店庆等打折,虽然都是折扣,但是很难抽象成数据库中的一个字段或者几个字段,不使用程序解决,而希望只是通过改变数据库中的数据,在目前阶段实现起来可能还比较困难。
之前我曾参与过一个影碟出租销售管理系统的项目开发,负责其中的架构设计和数据建模工作,尽管最后该项目由于某些客观原因而被放弃,但是该项目中也有打折优惠这方面的功能需求,我也思考过这一块的数据建模。其实,我们可以把商品销售打折这样的商务规则分解成几个部分,分析各个部分之间的关系,从中找出关键点,再将其泛化数据建模,即可实现让用户自己定义打折规则。下面开始分析商品销售打折的商业规则:
一套商品销售管理信息系统,必定存在下面两个实体:顾客,商品,打折这种商业规则一定是围绕着这两个实体以及相互间的关系而制定的。回顾我们的购物经历,打折的需求应该可以分为三种:
1)对特定商品的折扣一般有如下几种情况:按售价进行一定百分比的打折;原价->特价(某个时间段内进行的)的打折;捆绑优惠销售(如购买某一(几)种商品后即可按较低的价格或折扣购买另一(几)种商品)。
2)对顾客的的打折方式一般采用会员制,即是按会员等级在交费时直接给与一定的折扣优惠,或者在会员累积消费一定金额后给以一定比例的返点优惠,该方式需要顾客办理会员卡之类的身份标识卡。
3)对总额的打折方式一般是顾客消费后送出的限定最后使用期限的代金券。
注意到上面三大类折扣方式分解开来,都离不开商品,所以这三种打折方式都是商品的共有属性,应该归入到商品表中。另外,一般大型超市多拥有多个分店,而且可能出现各个分店的打折规则略有不同的情况,上面的三种打折规则得同相应的分店一一对应。最后,数据建模大致如下:
店铺表(Shop)
名称 类型 约束条件 说明
shop_id int 无重复 店铺标识,主键
shop_name varchar(40) 不允许为空 店铺名称
shop_addr varchar(80) 不允许为空 店铺地址
……
商品类别表(Ware_type)
名称 类型 约束条件 说明
type_id int 无重复 商品类别标识,主键
type_name varchar(20) 不允许为空 商品类别名称
father int 不允许为空 该类别的父类别标识,如果是顶节点的话设定为某个唯一值
layer char(6) 限