摘要:接着昨天的数据库的函数的设计,今天叙述存储过程的设计。
存储过程是整个软件中最核心的部分,实现了几乎全部的商业业务规则。这里所说的业务规则不是指数据库中的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 <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />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
这个存储过程中的大部分内容已经讲述完毕,每一个步骤都涉及数据库的操作,如果把这些操作放在程序中之行,则会出现频繁打开数据库操作,导致性能下降,放入数据库中并且使用事务则相对提高效率。因此笔者认为,使用存储过程是实现商业规则的良好方案。
整个系列就讲完了,也许有空的话我把数据库的测试程序也讲解一下。如果你能学到一些东西或者指出笔者的一些不足之处,笔者会十分高兴。
转载于:https://blog.51cto.com/tianli/42844