摘要:接着昨天的資料庫的函數的設計,今天叙述存儲過程的設計。
存儲過程是整個軟體中最核心的部分,實作了幾乎全部的商業業務規則。這裡所說的業務規則不是指資料庫中的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
更新父節點的推薦人數,目前的更新一直跟蹤到樹的根部,
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)
insert into award_level(m_id,rm_id,turns,c_times, level,award_type,amount,money,enabled)
update shop
set next_groupId=next_groupId+1
where m_id=@rm_id
如果為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
end
這個存儲過程中的大部分内容已經講述完畢,每一個步驟都涉及資料庫的操作,如果把這些操作放在程式中之行,則會出現頻繁打開資料庫操作,導緻性能下降,放入資料庫中并且使用事務則相對提高效率。是以筆者認為,使用存儲過程是實作商業規則的良好方案。
整個系列就講完了,也許有空的話我把資料庫的測試程式也講解一下。如果你能學到一些東西或者指出筆者的一些不足之處,筆者會十分高興。
本文轉自淩輝部落格51CTO部落格,原文連結http://blog.51cto.com/tianli/42844如需轉載請自行聯系原作者
lili00okok