把业务逻辑变成数据结构和SQL语句的例子。自然架构改成自然框架
2009-05-22 22:14 金色海洋(jyk)阳光男孩 阅读(...) 评论(...) 编辑 收藏
更正:和大家交流了一下,发现现在就叫做架构有一点大,还是叫做框架更准确一些,就叫做自然框架吧。
目前自然框架的内容包括三个部分:使用自定义控件快速实现增删改查和导出Excel、通用权限、个性化设置。
上一篇里 球球 同学询问“不太明白需求是怎么转化为数据库的。比如一个最简单的会员例子,累计1万消费以上是一级会员,5000消费以上是2级会员,买商品属于1级会员的8折,属于2级会员的9折,这个业务逻辑要怎么转化成数据库?”那我就以这个作为例子说一下吧。
根据这个需求我们可以得到以下几个已知条件:
1、有会员信息——会员表。
2、会员要有等级,建立一个会员等级表。
3、会员的等级是依据累计消费金额而定。5000元以上是二级会员,10000元以上是一级会员。
4、有产品信息——产品表。
5、会员购买产品可以享受折扣,折扣根据会员的级别而定。
问题:
1、会员级别的确定?
2、如何获得会员购买商品的折扣?
我们可以在数据库里面建立四个表:【会员表】、【会员等级表】、【产品表】、【会员享受的折扣表】。
【示意图】。
(这里的商品表怎么还有商品等级ID呢?折扣表里面也有?这个后面的需求扩展里面的,本来要做两套图的,俺就偷懒了)
回答:
1、会员级别是依据会员的消费累计金额来确定的,那么当前的会员消费金额就是已知条件,我们可以把它作为函数的参数,于是我们可以写一个函数:
{
DataAccessLayer dal = new DataAccessLayer();
// 依据累计的消费金额,确定会员的等级
sql = " SELECT TOP 1 会员级别ID FROM Demo_会员级别表 WHERE (消费金额 < " + money + " ) " ;
string 会员级别ID = dal.RunSqlGetID(sql);
// 修改会员的等级
sql = " update Demo_会员表 set 会员级别ID = " + 会员级别ID + " where memberID= " + memberID.ToString();
dal.RunSql(sql);
}
当然我们也可以把第一个SQL语句作为一个子查询,加在第二个SQL语句里面。
或者如果我们可以知道会员原先的级别的话,我们可以先做一下比较,会员级别变化的时候在修改会员的等级。
2、这个就简单了,会员享受的折扣是和等级相关的,我们有了会员享受的折扣表,写一条SQL语句就出来了。
不知道这个是不是求求想要的。
功能扩展
这个会员折扣的例子,让我想起来了去年看的一篇帖子,和这个很像,区别在于商品也是分等级的,不同的会员等级对应不同的产品等级可以享受不同的折扣,比如会员有三个等级——一级、二级、三级,产品有两个等级——优等、一般。
那么就会出现一个笛卡尔乘积的形式:
一级会员购买优等商品享受九折,
一级会员购买一般商品享受八折,
二级会员购买优等商品享受九五折,
二级会员购买一般商品享受八五折,
三级会员购买优等商品享受九九折,
三级会员购买一般商品享受九折。
以前的那个帖子的要求就是如何依据会员的等级和商品的等级来判断享受的折扣。
我们看看如何来解决这个问题。我们的商品表里面加上商品等级字段,在【会员享受的折扣表】里面也加上一个商品等级ID字段。剩下的就不用说了吧,只需要稍稍改一下那个SQL语句就可以了。
如果您也看多那篇帖子的话,您会发现那篇帖子用了好长的代码才解决,当然人家是用了OO的方法,好像解决的还挺巧妙地,我的OO水平还不够,没有看懂。
FAQ
1、为什么要建立【会员等级表】、【商品等级表】?
因为建立表以后,就可以做一个维护程序让客户自己维护这两个级别。
2、为什么要建立【会员享受的折扣表】?
理由同上,我们也可以做一个维护程序,这样享受什么样的折扣,客户就可以随时修改了。
ps: 博客园北京俱乐部第三次技术活动(2009/05/23)