走近复杂数据库计算型软件的设计与制作(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
相关文章
|
1月前
|
存储 SQL 关系型数据库
【MySQL 数据库】9、存储过程
【MySQL 数据库】9、存储过程
204 0
|
2月前
|
存储 数据库
Navicate 如何导出数据库中的存储过程、事件、视图等?
Navicate 如何导出数据库中的存储过程、事件、视图等?
|
2月前
|
存储 监控 安全
内网屏幕监控软件的数据存储与管理:使用SQLite数据库保存监控记录和配置信息
在当今数字化时代,安全和监控在企业和组织中变得至关重要。内网屏幕监控软件作为一种关键工具,帮助组织监视员工的活动并确保信息安全。这种软件不仅需要高效地记录和管理监控数据,还需要能够方便地进行配置和调整。本文将讨论如何使用SQLite数据库来保存监控记录和配置信息,并介绍如何通过自动化机制将监控到的数据提交到指定网站。
150 2
|
3月前
|
存储 Java 数据库
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数(二)
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数
36 0
|
8天前
|
SQL 监控 数据库
数据库管理与电脑监控软件:SQL代码优化与实践
本文探讨了如何优化数据库管理和使用电脑监控软件以提升效率。通过SQL代码优化,如使用索引和调整查询语句,能有效提高数据库性能。同时,合理设计数据库结构,如数据表划分和规范化,也能增强管理效率。此外,利用Python脚本自动化收集系统性能数据,并实时提交至网站,可实现对电脑监控的实时性和有效性。这些方法能提升信息系统稳定性和可靠性,满足用户需求。
32 0
|
28天前
|
存储 SQL 数据挖掘
视图、触发器和存储过程:提升数据库功能
视图、触发器和存储过程:提升数据库功能
19 1
|
2月前
|
存储 数据库
【数据库】分支与循环&函数&存储过程
【数据库】分支与循环&函数&存储过程
21 1
|
2月前
|
存储 Linux 数据库
期末速成数据库极简版【存储过程】(5)
期末速成数据库极简版【存储过程】(5)
17 0
|
2月前
|
监控 关系型数据库 MySQL
PHP与MySQL的结合:实现局域网上网行为监控软件的数据库管理
在当今信息化时代,网络安全日益成为重要的话题。为了有效监控和管理局域网上网行为,开发一个基于PHP和MySQL的数据库管理系统是一个理想的选择。本文将介绍如何结合PHP和MySQL,开发一款简单而高效的局域网上网行为监控软件,并重点关注数据库管理方面的实现。
184 0
|
16天前
|
SQL 数据可视化 关系型数据库
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)