把业务逻辑变成数据结构和SQL语句的例子。自然架构改成自然框架

 

    更正:和大家交流了一下,发现现在就叫做架构有一点大,还是叫做框架更准确一些,就叫做自然框架吧。

    目前自然框架的内容包括三个部分:使用自定义控件快速实现增删改查和导出Excel、通用权限、个性化设置。

 

    上一篇里 球球 同学询问“不太明白需求是怎么转化为数据库的。比如一个最简单的会员例子,累计1万消费以上是一级会员,5000消费以上是2级会员,买商品属于1级会员的8折,属于2级会员的9折,这个业务逻辑要怎么转化成数据库?”那我就以这个作为例子说一下吧。

 

     根据这个需求我们可以得到以下几个已知条件
1、有会员信息——会员表。
2、会员要有等级,建立一个会员等级表。
3、会员的等级是依据累计消费金额而定。5000元以上是二级会员,10000元以上是一级会员。
4、有产品信息——产品表。
5、会员购买产品可以享受折扣,折扣根据会员的级别而定。

 

    问题
1、会员级别的确定?
2、如何获得会员购买商品的折扣?

我们可以在数据库里面建立四个表:【会员表】、【会员等级表】、【产品表】、【会员享受的折扣表】。
【示意图】。

 

 

 

(这里的商品表怎么还有商品等级ID呢?折扣表里面也有?这个后面的需求扩展里面的,本来要做两套图的,俺就偷懒了)

 

    回答
1、会员级别是依据会员的消费累计金额来确定的,那么当前的会员消费金额就是已知条件,我们可以把它作为函数的参数,于是我们可以写一个函数:

 

private int SetMemberLevelID(int memberID,int money)
        {
            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语句就出来了。

 

sql = "select 折扣 from Demo_会员级别折扣表 where 会员级别ID = 1";

 

 

    不知道这个是不是求求想要的。

 

    功能扩展

     这个会员折扣的例子,让我想起来了去年看的一篇帖子,和这个很像,区别在于商品也是分等级的,不同的会员等级对应不同的产品等级可以享受不同的折扣,比如会员有三个等级——一级、二级、三级,产品有两个等级——优等、一般。
那么就会出现一个笛卡尔乘积的形式:

一级会员购买优等商品享受九折,
一级会员购买一般商品享受八折,
二级会员购买优等商品享受九五折,
二级会员购买一般商品享受八五折,
三级会员购买优等商品享受九九折,
三级会员购买一般商品享受九折。

 

    以前的那个帖子的要求就是如何依据会员的等级和商品的等级来判断享受的折扣。

    我们看看如何来解决这个问题。我们的商品表里面加上商品等级字段,在【会员享受的折扣表】里面也加上一个商品等级ID字段。剩下的就不用说了吧,只需要稍稍改一下那个SQL语句就可以了。

 

sql = "select 折扣 from Demo_会员级别折扣表 where 会员级别ID = 1 and 商品级别ID = 1";

 

    如果您也看多那篇帖子的话,您会发现那篇帖子用了好长的代码才解决,当然人家是用了OO的方法,好像解决的还挺巧妙地,我的OO水平还不够,没有看懂。

 

FAQ

1、为什么要建立【会员等级表】、【商品等级表】?
     因为建立表以后,就可以做一个维护程序让客户自己维护这两个级别。

2、为什么要建立【会员享受的折扣表】?
    理由同上,我们也可以做一个维护程序,这样享受什么样的折扣,客户就可以随时修改了。

 

ps: 博客园北京俱乐部第三次技术活动(2009/05/23) 

 

时间: 2024-10-06 09:47:54

把业务逻辑变成数据结构和SQL语句的例子。自然架构改成自然框架的相关文章

mysql部分替换sql语句的例子

有时候需要对mysql中的内容进行部分替换,那么可以参考下面的文章. 将cdb_pms表subject字段中的Welcom to替换成 欢迎光临 UPDATE `cdb_pms` SET `subject` = REPLACE(`subject`, 'Welcome to', '欢迎光临') WHERE INSTR(`subject`,'Welcome to') > 0 替换cdb_posts表的message字段,将"viewthread.php?tid=3989"替换成&qu

存储过程与SQL语句如何选择

58到家数据库30条军规,有一条是"禁止使用存储过程.视图.触发器.Event", 高并发大数据的互联网业务,架构设计思路是"解放数据库CPU,将计算转移到服务层", 并发量大的情况下,这些功能很可能将数据库拖死,业务逻辑放到服务层具备更好的扩展性,能够轻易实现"增机器就加性能". 数据库擅长存储与索引,在目前的互联网系统架构中,服务器的扩展要比存储的扩展更简单, 需要考虑系统可能的瓶颈在服务器还是数据存储,存储过程有它的优点,应该在开发中合理的

查询mysql中执行效率低的sql语句的方法_Mysql

一些小技巧1. 如何查出效率低的语句?在MySQL下,在启动参数中设置 --log-slow-queries=[文件名],就可以在指定的日志文件中记录执行时间超过long_query_time(缺省为10秒)的SQL语句.你也可以在启动配置文件中修改long query的时间,如: 复制代码 代码如下:  # Set long query time to 8 seconds    long_query_time=8 2. 如何查询某表的索引?可使用SHOW INDEX语句,如: 复制代码 代码如

SQL语句中where 1=1的基本用法

刚才有一位网友说了本文的不足,我再此重新编辑重发一篇整理过的,希望多提意见.   与where 1=1等效的类似语句有1<>2,'a'='a','a'<>'b',其目的是where的条件为永真,得到的结果就是未加约束条件的.那么where 1=1 有什么用处呢? 使用一 拼接SQL语句   一个简单拼接SQL语句的例子: String sql = select * from table student where 1=1; StringBuffer buffer = new Str

jdbc 动态sql语句拼接 查询不出结果

问题描述 jdbc 动态sql语句拼接 查询不出结果 public List queryByCondition(String command String description) { // message列表 List messageList = new ArrayList(); try { // 加载驱动 Class.forName(""com.mysql.jdbc.Driver""); // 数据库的连接 Connection conn; conn = Dri

《Java EE核心框架实战》—— 2.5 将SQL语句作为字符串变量传入

2.5 将SQL语句作为字符串变量传入 Java EE核心框架实战 在MyBatis中也支持将SQL语句当成变量传入. 新建名为sqlStringVar的Java项目,映射文件userinfoMapping.xml的内容如下. <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" &

oracle-Oracle中如何只用一条sql语句查询下面的例子

问题描述 Oracle中如何只用一条sql语句查询下面的例子 解决方案 select_statement UNION [ALL] selectstatement [UNION [ALL] selectstatement][-n]其中selectstatement为待联合的SELECT查询语句.用联合查询足以 解决方案二: 这个只能在后台代码判断并组装语句,然后联表查询 解决方案三: Oracle SQL语句查询例子用一条SQL语句查询分组前三名数据常用的sql语句查询例子

SQL语句查询结果集中的动态修改案例(临时表+游标)

本文转载:http://www.cnblogs.com/Charles2008/archive/2008/03/04/1090314.html 曾经一位朋友问我这样一个问题:怎样在查询出来的结果集中增加一个新列(有规律)? 如:数据库中的结构和数据如下: (tableName : People)Name           Age                                                                                    

一次SQL语句优化的反思:技术和业务的脱节如何解决?

作者介绍 罗敏,从事Oracle技术研究.开发和服务工作20余年,在Oracle中国公司的10多年,分别在顾问咨询部.技术服务部担任资深技术顾问.曾参与国内银行.电信.政府等多个行业大型IT系统的建设和运维服务工作,为国内主要软件开发商和集成商进行过多场Oracle高级技术应用培训和交流活动.著有书籍<品悟性能优化>.<感悟Oracle核心技术>.<Oracle数据库技术服务案例精选>.   今天本人不妨对一条不太复杂的SQL语句在技术上进行深入剖析,与大家共同分享其中