走近复杂数据库计算型软件的设计与制作(5)—存储过程的设计

简介:
摘要:接着昨天的数据库的函数的设计,今天叙述存储过程的设计。
存储过程是整个软件中最核心的部分,实现了几乎全部的商业业务规则。这里所说的业务规则不是指数据库中的rule那样的业务规则,而是公司规定的奖金计划等商业规则。在本软件设计中,涉及了大量的业务规则,每个业务规则都对应一种奖金类型,大约有35种奖金类型。在此只讲解一个存储过程,当中涉及了5种业务规则。
业务规则中有一项规则是一个节点之下,每产生3个节点即为一组,每一组中的前两个节点产生的时候奖励2000,产生第三个节点的时候奖金4000元,如果下面有3个节点,则为A级代理,如果3个节点下面有13个节点,则当前节点为B级代理,如果3个节点下面有50个节点,则为C级代理,当前节点在每一组中的级别是不一样的。每一种代理都有不同的优惠政策,为了简化描述,其他相关的规则就不再一一叙述了。
根据业务规则定义相应的表如下:
create table shop(
m_ID                                         D_M_ID, --当前节点ID
rm_ID                                        D_M_ID, --上一级节点ID
turns                                          D_INT,
groupId                               D_INT,--当前节点所属的上一级节点的组编号
next_groupId         int default 1, -----当前节点的下级节点的下一个组编号
allCommends                D_INT,---所有的推荐人数
enabled                                D_bit,
regDate                        D_REGDATE,
deal_flag                       D_BIT,
constraint pk_shop primary key(m_id)
)
Go
数据库中设计的字段在上面已经注释,下面详细讲述整个存储过程,首先找到没有被处过的Shop实体,取得m_id@rm_id
set @m_id=(select top 1 m_id from shop where enabled=1 and turns=@turns and deal_flag=0 order by regdate asc)
                     set @rm_id=(select rm_id from shop where m_id=@m_id)
                     set @bm_id=@m_id
获得并设置当前节点在父节点中的组号
update sh1
                     set sh1.groupId=sh2.next_groupId
                     from shop sh1,shop sh2
                     where sh1.m_id=@m_id and sh2.m_id=@rm_id
更新父节点的推荐人数,当前的更新一直跟踪到树的根部,
       update shop
                            set allCommends=allCommends+1
                            where m_id=@rm_id
如果当前节点为第一层的节点@level=1并且在当前组中为第一个或者第二个,则奖励2000元,设置奖金类型,这个在数据表的设计中有说明。
set @award_type=70
                           
                            if @level=1 and exists(select 1 from shop  where  rm_id=@rm_id and groupId=@groupId and enabled=1  having count(1) between 1 and 2)                            
                            begin
                                                                     
                                                 insert into award_level(m_id,rm_id,turns,c_times,level,award_type,amount,money,enabled)
                                                 select sh.m_id,@m_id,@turns,@c_times, @groupId,@award_type,1,1*a.award_num,sh.enabled
                                                 from award_about a,shop sh
                                         where a.award_type=@award_type
                                                       and sh.m_id=@rm_id
                            end
如果当前节点第一层为第三个,则奖励4千元,并且更新父节点的下一个组号,重要的是条件语句,请注意,
set @award_type=71
                            if @level=1 and exists(select 1 from shop  where  rm_id=@rm_id and groupId=@groupId and enabled=1  having count(1)=3)                            
                            begin
                                                                     
                                                 insert into award_level(m_id,rm_id,turns,c_times, level,award_type,amount,money,enabled)
                                                 select sh.m_id,@m_id,@turns,@c_times, @groupId,@award_type,1,1*a.award_num,sh.enabled
                                                 from award_about a,shop sh
                                         where a.award_type=@award_type
                                                       and sh.m_id=@rm_id
                                        
                                         update shop
                                                 set next_groupId=next_groupId+1
                                                 where m_id=@rm_id
                            end
如果为B级代理,则进行相应的奖励,注意条件语句中的sum()count()函数的应用。
set @award_type=72
                      if exists(select 1 from shop where rm_id=@rm_id and groupId=@groupId and enabled=1 having sum(allCommends)>=13 and count(1)=3)
                             and not exists (select 1 from award_level where m_id=@rm_id and award_type=@award_type and level=@groupId)
                             and @groupId>0
                             begin
                                          insert into award_level(m_id,rm_id,turns,c_times,level,award_type,amount,money,enabled)
                                                 select sh.m_id,@m_id,@turns,@c_times,@groupId,@award_type,1,1*a.award_num,sh.enabled
                                                 from award_about a,shop sh
                                         where a.award_type=@award_type
                                                       and sh.m_id=@rm_id
                             end
这个存储过程中的大部分内容已经讲述完毕,每一个步骤都涉及数据库的操作,如果把这些操作放在程序中之行,则会出现频繁打开数据库操作,导致性能下降,放入数据库中并且使用事务则相对提高效率。因此笔者认为,使用存储过程是实现商业规则的良好方案。
整个系列就讲完了,也许有空的话我把数据库的测试程序也讲解一下。如果你能学到一些东西或者指出笔者的一些不足之处,笔者会十分高兴。
本文转自凌辉博客51CTO博客,原文链接http://blog.51cto.com/tianli/42844如需转载请自行联系原作者

lili00okok
相关文章
|
SQL NoSQL 关系型数据库
超强数据库管理软件推荐-没有之一-还在用Navicat管理本地数据库的吗?还在为Navicat寻求绿色版或者购买正版的费用望而却步吗?DBeaver让你解决所有数据库本地编写问题-优雅草央千澈-DBeaver下载和安装
超强数据库管理软件推荐-没有之一-还在用Navicat管理本地数据库的吗?还在为Navicat寻求绿色版或者购买正版的费用望而却步吗?DBeaver让你解决所有数据库本地编写问题-优雅草央千澈-DBeaver下载和安装
1234 18
超强数据库管理软件推荐-没有之一-还在用Navicat管理本地数据库的吗?还在为Navicat寻求绿色版或者购买正版的费用望而却步吗?DBeaver让你解决所有数据库本地编写问题-优雅草央千澈-DBeaver下载和安装
|
SQL 数据库
软考软件评测师——数据库系统应用
本文介绍了关系数据库的基础知识与应用,涵盖候选码定义、自然连接特点、实体间关系(如1:n和m:n)、属性分类(复合、多值与派生属性)以及数据库设计规范。同时详细解析了E-R图转换原则、范式应用(如4NF)及Armstrong公理体系。通过历年真题分析,结合具体场景(如银行信用卡额度、教学管理等),深入探讨了候选键求解、视图操作规范及SQL语句编写技巧。内容旨在帮助读者全面掌握关系数据库理论与实践技能。
|
存储 缓存 关系型数据库
阿里云数据库 SelectDB 多计算集群核心设计要点揭秘与场景应用
在云原生存算分离架构下,多计算集群的实现从技术方案上看似乎并不存在过多难题。但从产品的角度而言,具备成熟易用的多计算集群能力且能运用于用户实际业务场景中,还有较多核心要点需要深度设计
634 23
阿里云数据库 SelectDB 多计算集群核心设计要点揭秘与场景应用
|
存储 安全 数据管理
时序数据库TDengine 与中移软件达成兼容性互认证,推动虚拟化云平台与时序数据库的深度融合
在数字化转型和智能化升级的浪潮下,企业对数据的需求日益增长,尤其是在物联网、大数据和实时分析等领域。随着设备数量的激增,时序数据的管理和处理变得愈发复杂,企业亟需高效、稳定的数据解决方案来应对这一挑战。时序数据库作为专门处理时间序列数据的工具,正逐渐成为各行业数字化转型的重要支撑。
365 4
|
Cloud Native 关系型数据库 分布式数据库
PolarDB 分布式版 V2.0,安全可靠的集中分布式一体化数据库管理软件
阿里云PolarDB数据库管理软件(分布式版)V2.0 ,安全可靠的集中分布式一体化数据库管理软件。
|
SQL 数据采集 监控
局域网监控电脑屏幕软件:PL/SQL 实现的数据库关联监控
在当今网络环境中,基于PL/SQL的局域网监控系统对于企业和机构的信息安全至关重要。该系统包括屏幕数据采集、数据处理与分析、数据库关联与存储三个核心模块,能够提供全面而准确的监控信息,帮助管理者有效监督局域网内的电脑使用情况。
295 2
|
存储 SQL 关系型数据库
MySql数据库---存储过程
MySql数据库---存储过程
305 5
|
存储 SQL 安全
【数据库高手的秘密武器:深度解析SQL视图与存储过程的魅力——封装复杂逻辑,实现代码高复用性的终极指南】
【8月更文挑战第31天】本文通过具体代码示例介绍 SQL 视图与存储过程的创建及应用优势。视图作为虚拟表,可简化复杂查询并提升代码可维护性;存储过程则预编译 SQL 语句,支持复杂逻辑与事务处理,增强代码复用性和安全性。通过创建视图 `high_earners` 和存储过程 `get_employee_details` 及 `update_salary` 的实例,展示了二者在实际项目中的强大功能。
320 1
|
JSON 数据格式 Java
化繁为简的魔法:Struts 2 与 JSON 联手打造超流畅数据交换体验,让应用飞起来!
【8月更文挑战第31天】在现代 Web 开发中,JSON 成为数据交换的主流格式,以其轻量、易读和易解析的特点受到青睐。Struts 2 内置对 JSON 的支持,结合 Jackson 库可便捷实现数据传输。本文通过具体示例展示了如何在 Struts 2 中进行 JSON 数据的序列化与反序列化,并结合 AJAX 技术提升 Web 应用的响应速度和用户体验。
570 0
|
存储 SQL 数据库