把业务逻辑变成数据结构和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、为什么要建立【会员享受的折扣表】? 理由同上,我们也可以做一个维护程序,这样享受什么样的折扣,客户就可以随时修改了。
- 中小企业如何选择DDoS防御方案?
- “熊医生”出诊正确率超九成 医院:人工智能更多是辅助
- PLC编程优化方法,让程序运行提速!
- 这是硅谷狂人马斯克对未来做出的11个大胆预测,人工智能比核武器更危险
- 在腾讯云上使用自建DNS
- Spring 4.0.2 学习笔记(1) - 最基本的注入
- 关于女神SQLite的疑惑(2)
- WordPress纯代码仿无觅相关文章图文模式功能(增强版)
- 人工智能时代已悄然来临……
- 人民日报发布周鸿祎署名文章:迎接“大安全”时代的新威胁
- Mono 3.2 上跑NUnit测试
- 为WordPress 文章中的链接自动添加 nofollow标签
- 腾讯刘炽平:海外用户破7000万 微信带开发者“出海”
- 研究称性别不均衡或导致人工智能持有性别偏见
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android编程实现状态保存的方法分析
- Android中TextView和ImageView实现倾斜效果
- Notification消息通知 自定义消息通知内容布局
- Android编程实现带渐变效果的圆角矩形示例
- Android仿苹果关机界面实现代码
- Android使用RecycleView实现拖拽交换item位置
- Android编程之计时器Chronometer简单示例
- Android OnFocuChangeListener焦点事件详解
- Android自定义加载圈动画效果
- Android 中ImageView的ScaleType使用方法
- ViewPager实现漂亮的引导页
- Android FTP 多线程断点续传下载上传的实例
- Android如何调用系统相机拍照
- Android开发之设置开机自动启动的几种方法
- Android图片等比例缩放和填充屏幕效果