自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一步一步設(shè)計你的數(shù)據(jù)庫之如何提取業(yè)務(wù)規(guī)則

運維 數(shù)據(jù)庫運維
一步一步設(shè)計你的數(shù)據(jù)庫之不可輕視的需求分析中我們通過多種方法來理解客戶的需求并撰寫了需求文檔。本文我們將回答三個問題。1. 為什么業(yè)務(wù)規(guī)則非常重要。2. 怎樣識別業(yè)務(wù)規(guī)則。3. 如何修改關(guān)系模型并隔離出業(yè)務(wù)規(guī)則。

引言:一步一步設(shè)計你的數(shù)據(jù)庫之不可輕視的需求分析中我們通過多種方法來理解客戶的需求并撰寫了需求文檔。本文我們將回答三個問題。1. 為什么業(yè)務(wù)規(guī)則非常重要。2. 怎樣識別業(yè)務(wù)規(guī)則。3. 如何修改關(guān)系模型并隔離出業(yè)務(wù)規(guī)則。

[[32301]] 

什么是業(yè)務(wù)規(guī)則

業(yè)務(wù)規(guī)則描述了業(yè)務(wù)過程中重要的且值得記錄的對象、關(guān)系和活動。其中包括業(yè)務(wù)操作中的流程、規(guī)范與策略。業(yè)務(wù)規(guī)則保證了業(yè)務(wù)能滿足其目標(biāo)和義務(wù)。

生活中的一些業(yè)務(wù)規(guī)則可能是:

  1. 當(dāng)顧客進入店內(nèi),最近的員工須向顧客打招呼說:“歡迎來到×××”。
  2. 當(dāng)客戶兌換超過200元的獎券時,柜員須要求查看客戶的身份證并復(fù)印。當(dāng)兌換的獎券金額小于25元時,無需客戶簽字。
  3. 早上第一個進辦公室的人需要把飲水機加熱按鈕打開。

本系列我們關(guān)注數(shù)據(jù)庫相關(guān)的業(yè)務(wù)規(guī)則,一些例子如下:

  1. 只有當(dāng)客戶產(chǎn)生第一個訂單時才創(chuàng)建該客戶的記錄。
  2. 若一名學(xué)生沒有選任何一門課程,把他的狀態(tài)字段設(shè)為Inactive。
  3. 若銷售員在一個月中賣出10套沙發(fā),獎勵500元。
  4. 一個聯(lián)系人必須至少有1個電話號碼和1個email郵箱。
  5. 若一個訂單的除稅總額超過1000元則能有5%的折扣。
  6. 若一個訂單的除稅總額超過500元則免運費。
  7. 員工購買本公司商品能有5%的折扣。
  8. 若倉庫中某貨品的存量低于上月賣出的總量時,則需要進貨。

從數(shù)據(jù)庫的視角來看,業(yè)務(wù)規(guī)則是一種約束。簡單的約束如:

所有訂單必須有一個聯(lián)系電話。

上述這類簡單的規(guī)則可以很容易的映射到關(guān)系數(shù)據(jù)庫定義中,為字段確定數(shù)據(jù)類型或設(shè)定某字段為必填(不能為NULL)。某些業(yè)務(wù)規(guī)則表達的約束會復(fù)雜些,如:

學(xué)生每天的上課時間加上項目時間必須在1至14小時之間。

我們可以通過check約束或外鍵約束來實現(xiàn)這類業(yè)務(wù)規(guī)則。對于一些非常復(fù)雜的業(yè)務(wù)規(guī)則,如:

一名教員每周不能少于30小時工作量,其中分為辦公時間、實驗時間和上課時間。每1小時的課需要0.5小時辦公時間進行備課。每1小時實驗需1小時辦公準(zhǔn)備。每周指導(dǎo)學(xué)生論文時間不少于2小時。

類似上述的業(yè)務(wù)規(guī)則需要從多個表中收集數(shù)據(jù),故在程序代碼中實現(xiàn)最為合適。

識別關(guān)鍵業(yè)務(wù)規(guī)則

記錄所有的業(yè)務(wù)規(guī)則并對這些規(guī)則進行分類能幫助我們更好的在系統(tǒng)中實現(xiàn)業(yè)務(wù)邏輯。

如何實現(xiàn)業(yè)務(wù)規(guī)則不僅與當(dāng)前的業(yè)務(wù)邏輯有關(guān),而且與該業(yè)務(wù)邏輯將來如何變化有關(guān)。當(dāng)一個規(guī)則在將來很可能變化時,我們需要使用更復(fù)雜但更靈活的方式構(gòu)建該規(guī)則。

舉例來說,假設(shè)公司只能向當(dāng)?shù)卦O(shè)有倉庫的城市發(fā)貨,這些城市包括:南京、長沙、西安、廣州。業(yè)務(wù)規(guī)則要求訂單中的發(fā)貨城市字段必須為NJ、CS、XA、GZ之一。

我們可以把該規(guī)則簡單的實現(xiàn)為check約束。但將來公司若在上海有了一個新倉庫,就必須從后臺數(shù)據(jù)庫端修改該check約束。若公司隨后設(shè)立更多新倉庫或業(yè)務(wù)規(guī)則變化為可以向沒有倉庫的城市發(fā)貨,每次我們都需要修改該約束。

考慮另一種實現(xiàn)該業(yè)務(wù)規(guī)則的方法——使用外鍵。我們創(chuàng)建一張ShippingCities表,其中存放值:NJ、CS、XA、GZ,并讓訂單表中的發(fā)貨城市字段外鍵引用ShippingCities表中的主鍵。這樣訂單的發(fā)貨城市列只能接受ShippingCities中存在的城市。當(dāng)支持的發(fā)貨城市增加或減少時,只需要在ShippingCities中插入或刪除記錄。

兩種方式的實現(xiàn)難度差異不大,但前一種方式每次都需要修改數(shù)據(jù)庫結(jié)構(gòu),后一種只需要修改數(shù)據(jù)。修改數(shù)據(jù)不僅更省力而且技術(shù)要求也更低。

上述業(yè)務(wù)規(guī)則實現(xiàn)為check約束可能如下:

ShippingCity = ‘NJ’ or ShippingCity = ‘CS’ or ShippingCity = ‘XA’ or ShippingCity = ‘GZ’

上述代碼并不復(fù)雜,但只有熟悉數(shù)據(jù)庫的程序員從后臺才能修改。ShippingCitis表中的數(shù)據(jù)相對更易于理解,我們可以提供一個界面來讓用戶自己維護其中的城市。

要識別關(guān)鍵業(yè)務(wù)規(guī)則,我們可以問自己兩個問題。

第一、修改規(guī)則會有多困難。越是復(fù)雜的規(guī)則,修改起來越困難且更容易出錯。

第二、規(guī)則變化的可能性有多大。變化頻繁的規(guī)則需要額外的設(shè)計來更好的應(yīng)對將來的變化。

需要特別注意的規(guī)則(關(guān)鍵業(yè)務(wù)規(guī)則):

  1. 枚舉值。例如:有效的發(fā)貨城市,訂單狀態(tài)(Pending, Approved, Shipped)等。
  2. 計算參數(shù)。例如:對500元以上的訂單免運費。這一數(shù)值可能在將來會調(diào)整為300元或600元。
  3. 有效參數(shù)。例如:項目組可由2至5人組成。某些項目是否可能由1個人完成或有更多人參與。
  4. 交叉記錄和交叉表檢查。例如:訂單中可訂購的貨品數(shù)量不能超過該貨品的當(dāng)前庫存數(shù)。
  5. 可概括性約束。如果可預(yù)見到將來需應(yīng)用一些類似的約束,我們可以考慮把這些約束抽象出來進行管理。例如:某保險公司最近主推保險產(chǎn)品A。對每月能賣出20份A產(chǎn)品的銷售人員給予1000元獎金。對于不同的保險產(chǎn)品在不同的時間段可能有不同的推廣獎勵規(guī)則。我們可以把產(chǎn)品名稱、編號、銷售量、獎金數(shù)額、促銷時間段提取出來放到一張獨立的表中作為計算獎金的參數(shù)。
  6. 非常復(fù)雜的檢查。有些檢查規(guī)則非常復(fù)雜,把這些規(guī)則放到程序代碼中實現(xiàn)更為容易和清晰。例如:學(xué)生選擇理學(xué)院的謂詞演算課程的前提是已通過理學(xué)院的命題演算課程或已通過社科院的邏輯I和II課程或者需要導(dǎo)師的允許。該規(guī)則在某些數(shù)據(jù)庫產(chǎn)品中可以通過表級的check約束實現(xiàn),但放到程序中更易于維護和理解。

一些直接可以在數(shù)據(jù)庫中實現(xiàn)的業(yè)務(wù)規(guī)則:

  1. 固定枚舉值。例如:性別(男、女),用手習(xí)慣(左撇子、右撇子)。
  2. 數(shù)據(jù)類型要求。每個字段具有確定的數(shù)據(jù)類型是關(guān)系型數(shù)據(jù)庫的重要特性之一。濫用通用的數(shù)據(jù)類型(如string)對性能和數(shù)據(jù)防錯都會帶來損害。
  3. 必填值。例如:會員必須有手機聯(lián)系方式。
  4. 合理性檢查。合理性檢查設(shè)定的范圍基本不會變化。例如:商品的價格大于等于0。

作為軟件從業(yè)人員不要拒絕或回避變化。世界上唯一不變的就是變化。在收集業(yè)務(wù)規(guī)則時多去了解該規(guī)則的業(yè)務(wù)背景與歷史變化歷程,而不是逼迫客戶保證規(guī)則不會變化。盡可能發(fā)現(xiàn)所有的業(yè)務(wù)規(guī)則并記錄下來。對這些業(yè)務(wù)規(guī)則按變化的可能性和修改難度進行分類,精心設(shè)計那些將來可能變化且修改困難的規(guī)則。

#p#

提取關(guān)鍵業(yè)務(wù)規(guī)則

識別并分類業(yè)務(wù)規(guī)則之后,我們需要在數(shù)據(jù)庫中或數(shù)據(jù)庫外來實現(xiàn)關(guān)鍵業(yè)務(wù)規(guī)則。我們可以參考如下方法:

1. 若規(guī)則為檢驗一組有效值時,把該規(guī)則轉(zhuǎn)化為外鍵約束。先前舉例中的有效發(fā)貨城市就是一個很好的例子。創(chuàng)建ShippingCities表,填入允許的發(fā)貨城市。然后把Orders表的ShippingCity列設(shè)為外鍵,引用ShippingCities表的主鍵。

2. 若規(guī)則為參數(shù)可能變化的計算式時,把這些參數(shù)提取到一張表中。例如:一個月內(nèi)賣出總價超過100萬元汽車的銷售員能獲得500元獎金。把參數(shù)100萬元和500元提取到一張表中,如果需要甚至可以把一個月的時間段也作為參數(shù)提取出來。

我還見過一些軟件系統(tǒng)在數(shù)據(jù)庫中有一張通用的參數(shù)表。該通用參數(shù)表中存放系統(tǒng)需要的各種參數(shù),一些是用于計算、一些是作為檢驗、另一些決定系統(tǒng)的行為。每一條記錄有兩個字段:Name和Value。例如需要確定一名銷售員能獲得多少獎金,我們先要查找Name字段為BonusSales的記錄,檢查該銷售員的銷售額是否達到了Value字段的金額,若答案是肯定的再查找Name字段為BonusAward的記錄來確定獎金數(shù)額。這種設(shè)計另有一好處,在程序啟動時可以把通用參數(shù)表讀入內(nèi)存的某集合中,此后使用參數(shù)值時就無需再次連接數(shù)據(jù)庫。

3. 若邏輯或計算規(guī)則很復(fù)雜時,則提取到代碼中進行實現(xiàn)。這里說的代碼可以是應(yīng)用程序端代碼,還可以是數(shù)據(jù)庫端存儲過程。把規(guī)則放到代碼中實現(xiàn)的意義在于業(yè)務(wù)規(guī)則與數(shù)據(jù)庫表結(jié)構(gòu)分離了,規(guī)則的變化不會影響到數(shù)據(jù)庫表結(jié)構(gòu)。通過結(jié)構(gòu)化編程或面向?qū)ο缶幊虂韺崿F(xiàn)復(fù)雜的規(guī)則更易于維護。

舉一個綜合性的例子:

一本關(guān)于數(shù)據(jù)庫設(shè)計的書籍賣出前5000本的版稅為5%,5000本至10000本之間的版稅為7%,超過10000本后的版稅為10%,不同類型書籍的版稅可能不同。

上述規(guī)則比較復(fù)雜且包含多個可能變化的參數(shù),故使用第1、2條方法。我們可以通過存儲過程來實現(xiàn)該規(guī)則,并把參數(shù)隔離到一張參數(shù)表中進行維護。創(chuàng)建的參數(shù)表為RoyaltyRates,并通過BookId與Books關(guān)聯(lián)(如圖1所示)。這樣為不同書籍創(chuàng)建新的版稅規(guī)則就非常容易了。

 

圖1 參數(shù)表RoyaltyRates與Books表的關(guān)系

多層應(yīng)用的概念大家都不會陌生。三層應(yīng)用是最常見的分層方法。對于復(fù)雜的業(yè)務(wù)邏輯一般會在中間層(即業(yè)務(wù)層)中實現(xiàn)。對于一些基本的驗證,如必填信息、數(shù)字有效區(qū)間等,需要在最上層用戶界面以及最底層數(shù)據(jù)庫端進行雙重檢驗。數(shù)據(jù)庫端的約束是阻隔臟數(shù)據(jù)進入系統(tǒng)的最后一道防線,而用戶界面處的檢驗可以避免錯誤數(shù)據(jù)傳輸?shù)较到y(tǒng)后端才被拒絕,節(jié)省了系統(tǒng)資源。

注:關(guān)于多層應(yīng)用的更多資料請參見最后的“總結(jié)與參考”部分。

[[32302]] 

主要內(nèi)容回顧

1. 業(yè)務(wù)規(guī)則決定了業(yè)務(wù)如何運行,其涵蓋從簡單明了的入門打卡到復(fù)雜的獎金計算公式。

2. 對于數(shù)據(jù)庫而言,業(yè)務(wù)規(guī)則將影響到數(shù)據(jù)模型。業(yè)務(wù)規(guī)則確定了每個字段的域(值的類型和范圍),是否是必須的,以及該字段要滿足的其他條件。

3. 理解業(yè)務(wù)規(guī)則并識別那些需要特別處理的關(guān)鍵規(guī)則至關(guān)重要。

4. 有些規(guī)則簡單且基本不變,它們可以很容易的用數(shù)據(jù)庫特性來實現(xiàn)。其他的一些規(guī)則可能復(fù)雜或時常變化,我們可以把它們從數(shù)據(jù)庫中邏輯的或物理的隔離出來(隔離到參數(shù)表、存儲過程或業(yè)務(wù)層中),使它們易于修改。

 

多層應(yīng)用參考

1. 談?wù)剬τ谄髽I(yè)級系統(tǒng)架構(gòu)的理解(http://www.cnblogs.com/liping13599168/archive/2011/05/11/2043127.html)

2. Multitier architecture(http://en.wikipedia.org/wiki/Multitier_architecture)

3. Software Architecture, Architects and Architecting(http://www.bredemeyer.com/)

原文鏈接:http://www.cnblogs.com/DBFocus/archive/2011/06/08/2075795.html

【編輯推薦】

  1. 數(shù)據(jù)庫設(shè)計,你了解多少 
  2. 一步一步設(shè)計你的數(shù)據(jù)庫之不可輕視的需求分析

 

責(zé)任編輯:艾婧 來源: DBFocus的博客
相關(guān)推薦

2011-10-13 10:18:50

設(shè)計數(shù)據(jù)庫

2011-03-28 13:47:12

數(shù)據(jù)庫設(shè)計

2011-04-25 15:22:26

數(shù)據(jù)庫設(shè)計

2011-05-10 09:19:55

數(shù)據(jù)庫設(shè)計

2011-05-30 14:07:36

2011-04-11 14:51:25

數(shù)據(jù)庫設(shè)計

2012-03-22 10:33:33

思杰XenDesktop

2021-03-17 07:07:21

系統(tǒng)程序員SDI

2022-08-29 15:19:09

CSS煙花動畫

2018-03-07 15:24:41

PythonMySQL

2009-07-06 19:29:37

云計算私有云服務(wù)器虛擬化

2023-09-05 07:52:43

2017-08-24 08:31:41

2013-03-18 16:09:27

JavaEEOpenfire

2017-11-29 11:14:52

離線緩存URL協(xié)議緩存

2017-09-28 09:40:36

圖像分類準(zhǔn)確率

2015-10-08 11:25:55

2020-02-02 19:53:57

數(shù)據(jù)庫數(shù)據(jù)庫優(yōu)化SQL優(yōu)化

2017-07-15 21:10:58

CTOCEO技術(shù)

2024-07-22 11:43:28

LVMPnetLab網(wǎng)絡(luò)
點贊
收藏

51CTO技術(shù)棧公眾號