軟件設計是怎樣煉成的(6)——打造系統的底蘊(數據庫設計)(下篇)


摘要:

數據庫是系統的根基,如果需求變更導致你要經常修改數據庫的字段,甚至需要修改表及表關系,相信多折騰幾次誰都受不了!因為數據庫結構的變化,不僅僅是數據庫本身的變更,實體類、數據操作層、邏輯層和表現層的代碼都需要改。更麻煩的是數據庫中如果已經存在大量的舊數據時,這些舊數據是不會“自動”適應新的數據庫結構的,你需要想辦法來“升級”這些舊數據。本文為你分享如何打造好系統的根基——做好數據庫設計!文章太長,分成上下兩篇了,此乃下篇。

 

大綱:

1.什么是優秀的設計?
2.優秀的設計能節省項目工作量
3.優秀設計從分析需求開始
4.軟件系統不是木桶型的
5.軟件設計的“大道理”
6.規划系統骨架——架構設計
7.打造系統的底蘊——數據庫設計
8.細節決定成敗——詳細設計
9.用戶感覺好才是真的好——用戶體驗設計
10.持續提升設計水平

 

本文章是系列文章之一,如果你還沒有看過之前的文章,建議先看完前面的文章再看本篇,這樣效果更好。

 

 

7.打造系統的底蘊——數據庫設計

 
 
7.4 考勤系統的業務建模及數據庫設計
 
學生選課系統這個案例比較簡單,主要是幫助大家理解”業務概念模型驅動數據庫設計“。接下來我們繼續用”考勤系統“這個例子為你分享,我的主要目的有:
1)對考勤系統進行行為建模;
2)通過另外一個例子再次體會如何用類圖分析業務概念模型;
3)根據業務概念模型,同時考慮到我們的現實情況,我們要做一個“老土”的數據庫設計;
4)深挖業務概念模型,做一個“高端大氣”的數據庫設計。
本小節為你分享第1、2、3點。
 
這個考勤系統的需求請參考前面的文章,如果忘記了一定要重新看看噢!
你可以會發現,前面的文章沒有詳細描述請假(外出)的審批流程,下面我們通過一個圖來看看這個流程吧,這個圖就是業務行為建模的其中一個結果。
 
圖7.6 請假審批流程活動圖
 
了解這個流程后,我們將會對業務概念模型有更加清晰的認識,下面直接上兩個業務建模的圖:
 
圖7.7 考勤系統的業務概念建模1
 
圖7.8 考勤系統的業務概念建模2
 
上面兩個圖結合一起看才是完整的業務建模,因為一張圖太大可能會顯示不下,或者顯示出來不好看,所以才拆分成兩張圖。
 
根據上述業務建模,如何來設計數據庫呢?如果照搬學生考勤系統的做法,那么一個類至少要對應一個數據表,這樣設計的話似乎有點麻煩,后續寫起代碼來也可能挺麻煩的。我們要思考這個系統的主要需求是什么?這個系統主要是圍繞請假(外出)的審批流程進行的,其實就是一個簡單的工作流,我們要解決提出申請以及多個層次的審批問題。現實項目中進度壓力是很大的,也會受制於各種限制條件,所以能解決需要當中主要矛盾的設計就是一個好設計,所以我有這樣的一個老土的設計,能滿足需求,實現起來也比較簡單。請看下面的兩個圖,節選了部分的數據庫設計。
 
圖7.9 考勤系統的數據庫設計1
 
圖7.10 考勤系統的數據庫設計2
 
這個設計相當老土,本來應該拆分為多張表的全部弄到一張表去:
1)當提出請假申請時,請假申請表就多了一條記錄,這條記錄審批相關的字段全部都是空的;
2)當去到某個審批環節時,該申請記錄只需要更新相應的字段就行了。
 
這個程序的代碼寫起來也比較簡單,例如:表現層不需要針對不同的流程環節設計不同的界面,直接可以通過一個界面搞定,當然還要寫一堆 If Else 或 Switch Case。表現層的代碼思路如下圖:
7.11 考勤系統的表現層代碼思路
 
當員工提出請假申請時,他只能看到1這部分的內容,2、3、4部分隱藏;當部門經理審批申請時,1部分只讀,2部分可編輯,3、4部分隱藏,副總和總經理審批時也進行類似的處理。
 
數據庫設計不能單純僅僅從數據庫的角度來考慮,還需要整體平衡這個項目的工作量,一般來說能解決需求當中的主要矛盾,能讓整個開發工作量降下來,並且是項目團隊有能力做到的設計,這樣的數據庫設計及軟件設計才是好的設計。
 
考勤系統的業務建模及數據庫設計,也說明了這樣的最佳實踐:
1)業務結構建模和行為建模是很有必要的,業務建模這一步可以多深入一些,不要因為項目進度緊而壓縮你的時間,這里的時間投入所帶來的回報是超值的;
2)業務建模讓我們對需求的理解更深,讓我們的數據庫設計及軟件設計”進可攻退可守“;
3)遇到進度壓力及各種限制條件時,你不一定非要照這個業務模型來設計你的數據庫和代碼,你可以退一步,用一個”老土“的數據庫設計及程序設計來解決問題;
4)你也可以采取更加進取的設計策略,這點下一小節為你分享。
 
 
7.5 業務建模更上一層樓,打造更具彈性的數據庫設計
 
本小節為你分享前文提到的第 4 個目標:深挖業務概念模型,做一個“高端大氣”的數據庫設計。但這個目標實在太“偉大”了,這里能僅為你分享開始的一部分,后續有機會我再發文章分享更多內容。
 
我們有更多的思考:如果請假(外出)審批流程改變了,例如增加了審批環節,怎么辦?按照前面的“老土”設計的話就麻煩了,我們需要增加“請假申請表”的字段,而表現層的代碼也需要修改,需要更多的If Else。
當然我們可能還有一個更好的處理辦法,就是認為這是需求變更,對客戶說:no money no talk(沒有錢沒商量)。只要前期我們的業務分析足夠到位,將流程圖、業務概念圖等全部畫出來,並且跟客戶確認好了,客戶就不能賴賬了,增加審批環節,這明顯就是需求變更嘛,是需要工作量,需要付錢滴!但是我們為什么不能將程序做得更有彈性呢?為什么不能做一個“全活”的工作流呢?這樣我們的軟件將會更有競爭力,幫助我們賺到更多的錢。
 
前文的文章提到的工作流,分為三種層次:
1)死的工作流:就是代碼寫死的(hard code),數據庫設計也是死的,流程或表單有任何變化,都可能需要改代碼和數據庫設計。
2)半死不活的工作流:部分地方寫死,部分地方是靈活的,能適應部分需求變化。
3)全活的工作流:代碼和數據庫設計等都是靈活的,能基本適應流程及表單的變化,不需要修改代碼或數據庫設計,只要配置一下就可以搞定。
前面這個老土的設計,是屬於那種一種層次呢?
我都不好意思說了了,這是“死的工作流”,彈性最差的!流程稍微改變,就要到處修改,包括修改數據庫設計和代碼。
 
下面我們嘗試一下做“活的工作流”,我們需要再進一步分析業務模型,找出流程的規律,針對規律來設計數據庫和軟件!
 
圖7.12 考勤系統業務概念模型的深入挖掘
上圖紅色虛線框框里面的內容就是規律,而且其他部分可以看成是這種規律的一個“實例”。
這個圖揭示了這樣的規律:
1)從提出申請開始,后續的審批其實就是一個”審批鏈”;
2)“申請”對應一個“首次審批”,“首次審批”后續是“下一個審批”;
3)對應某一個“審批”來說,如果它不是“首次審批”,它對應一個“上一個審批”。
如果數據庫及程序能針對這樣的規律進行設計,那么只要是符合這個規律的情況,系統都可以適應,這樣就不怕審批流程的變化了!
 
圖7.12 可能有點難度,如果沒有應用類圖分析業務的經驗,會更加難理解此圖,但這僅僅是挑戰的開始!當我們需要打造更具彈性的系統的時候,我們面臨兩大挑戰:
1)透視需求發現需求本質的能力,建立更深層次的業務模型;
2)根據第1)點的業務模型,設計出相應的數據庫設計及軟件設計。
這兩大挑戰都是難度很高的,圖 7.12 僅僅是業務模型進一步深挖的開始,打造“活的工作流”難度是很大的,將來有機會再分享更多文章。
 
 
7.6 數據庫設計小結
 
數據庫設計的好壞決定了系統的底蘊,無論是“老土”的設計還是“高端大氣”的設計,都是為項目的目標服務的。
一般來說我們應該達到以下基本要求:
1)意識上要重視數據庫設計,數據庫設計上的時間投資是超值的;
2)良好的業務建模(包括結構建模和行為建模)是良好數據庫設計的基礎,並且可以讓你在后續工作中“進可攻退可守”;
3)在業務概念模型的基礎上搭建數據庫,你可以采用類似學生選課系統的數據庫設計方法(業務實體類與數據表一一對應),也可以采用考勤系統的“老土”設計方法(合並業務實體類到一個表中)。
當條件成熟時,我們可以考慮進一步提升我們的業務深挖能力及彈性設計的能力,讓我們的軟件更好賣,讓我們可以賺取更高的薪金!
 
 

本文是系列文章的其中一篇,要做軟件設計師一點都不簡單啊,請留意后續文章!

 

如果本文對你有幫助,麻煩點一下“推薦”啦,謝謝!

 

 

作者:張傳波

創新工場創業課堂(敏捷課程)講師

軟件研發管理資深顧問

CMMI首席專家

《火球——UML大戰需求分析》作者

軟件知識原創基地創辦人


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM