天天看點

走近複雜資料庫計算型軟體的設計與制作(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

更新父節點的推薦人數,目前的更新一直跟蹤到樹的根部,

       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