數(shù)據(jù)建模與業(yè)務(wù)建模
無(wú)論是企業(yè)信息系統(tǒng)還是web網(wǎng)站,各種大小程序的原始功能都是對(duì)數(shù)據(jù)的操作,可以看做是某一群體對(duì)一些數(shù)據(jù)的各種需求造就了一個(gè)又一個(gè)的程序,或者說(shuō)是軟件系統(tǒng)。
回頭想想,第一刻起我們就開(kāi)始和數(shù)據(jù)打交道了,新項(xiàng)目開(kāi)始的時(shí)候我們先要做什么呢?用第三方依賴(lài)搭個(gè)框架,設(shè)計(jì)目錄結(jié)構(gòu)嗎?不對(duì),這些都是技術(shù)儲(chǔ)備,應(yīng)該是在項(xiàng)目啟動(dòng)之前就完成的了。項(xiàng)目啟動(dòng)的一刻我們?cè)谧龅墓ぷ骺偸菍?duì)數(shù)據(jù)的分析。
我們要分析數(shù)據(jù)結(jié)構(gòu),理清數(shù)據(jù)關(guān)系,確定數(shù)據(jù)類(lèi)型,還要兼顧數(shù)據(jù)量的大小,現(xiàn)在至少不用考慮數(shù)據(jù)的存儲(chǔ)媒介了,因?yàn)槭邪司哦家脭?shù)據(jù)庫(kù),除了極少數(shù)情況應(yīng)該不會(huì)有人選擇自己編寫(xiě)文件系統(tǒng)進(jìn)行數(shù)據(jù)的存儲(chǔ)了吧?
上
面的這些步驟就叫做數(shù)據(jù)建模,搞程序的同志們肯定相當(dāng)輕車(chē)熟路了,從拿到用戶的第一個(gè)表單開(kāi)始,在ER圖中拖出第一個(gè)Table,我們就開(kāi)始進(jìn)行數(shù)據(jù)模型
的設(shè)計(jì),設(shè)計(jì)好的數(shù)據(jù)模型將固化在某一種媒介中(基本都是數(shù)據(jù)庫(kù)),應(yīng)用系統(tǒng)的用途就是為用戶提供一個(gè)界面,讓他們對(duì)固化在媒介中(一般都是數(shù)據(jù)庫(kù))的數(shù)
據(jù)進(jìn)行操作。

怎
么才算是良好的數(shù)據(jù)模型呢?首先它要滿足數(shù)據(jù)固化的基本要求,所有必須的數(shù)據(jù)都必須能夠保存在數(shù)據(jù)庫(kù)里,其次這些數(shù)據(jù)的結(jié)構(gòu)應(yīng)該是容易被應(yīng)用程序操作的,
無(wú)論是增刪查改、數(shù)據(jù)校驗(yàn)、數(shù)據(jù)安全、搜索查詢、統(tǒng)計(jì)匯總、數(shù)據(jù)導(dǎo)出等等功能都是可以實(shí)現(xiàn)的,而且效率不能太低。如果能夠?qū)崿F(xiàn)以上兩條,基本就可以算是一
個(gè)良好的數(shù)據(jù)模型了,這樣用戶就可以借助應(yīng)用程序?qū)?shù)據(jù)庫(kù)中自己所需的數(shù)據(jù)進(jìn)行管理、操作。

但
是還有一個(gè)問(wèn)題,是否只要提供了這些功能就足以滿足用戶的要求了呢?從上面列出的功能中我們就可以了解到,無(wú)論是CRUD增刪查改,還是查詢統(tǒng)計(jì),無(wú)非是
“更新(update)”,“查詢(Read)”,“校驗(yàn)(Check)”三個(gè)基本操作的實(shí)現(xiàn),這些操作都是基于靜態(tài)數(shù)據(jù)的單步操作,應(yīng)用程序只是在數(shù)據(jù)
外面簡(jiǎn)單包裝了薄薄的一層,用戶面對(duì)的和要操作管理的依然是后面整個(gè)數(shù)據(jù)模型。
這個(gè)問(wèn)題可以歸結(jié)到:我們解決了用戶想要什么(What),但是并沒(méi)有了解用戶需要怎么做(How)。
數(shù)
據(jù)建模解決了數(shù)據(jù)如何存儲(chǔ),存儲(chǔ)的格式,以及怎么獲得已經(jīng)存儲(chǔ)的數(shù)據(jù)的問(wèn)題,數(shù)據(jù)建模完成了數(shù)據(jù)固化和檢索的任務(wù),數(shù)據(jù)建模歸根結(jié)底是對(duì)靜態(tài)數(shù)據(jù)的建模,
給你一張ER圖,你很容易就可以了解到數(shù)據(jù)的類(lèi)型、數(shù)據(jù)的關(guān)系,但是你無(wú)法從這些數(shù)據(jù)格式數(shù)據(jù)關(guān)系中弄明白客戶到底需要利用這些數(shù)據(jù)完成什么樣的任務(wù)。不
清楚這些數(shù)據(jù)從何而來(lái),到何處去,也就決定了你編寫(xiě)的應(yīng)用系統(tǒng)只能包含一個(gè)錄入界面,一個(gè)查詢界面,無(wú)法再為最終用戶提供更多的功能,因?yàn)槟闶种兄挥徐o止
不動(dòng)的數(shù)據(jù)而已。
因此,為了讓?xiě)?yīng)用系統(tǒng)可以肩負(fù)起更多的功能,我們需要在業(yè)務(wù)模型的基礎(chǔ)之上進(jìn)行業(yè)務(wù)建模,比如一個(gè)文章發(fā)布系統(tǒng)中的表結(jié)構(gòu)如下所示:

從
表結(jié)構(gòu)中可以看到一個(gè)文章包含主鍵(ID),作者(author),內(nèi)容(content),狀態(tài)(status),創(chuàng)建時(shí)間(create_time)
和修改時(shí)間(update_time)。狀態(tài)(status)字段類(lèi)型為整形,可能的值為0, 1, 2,
3四種。單單從數(shù)值上來(lái)說(shuō),除了建表的人誰(shuí)也搞不清楚這四個(gè)狀態(tài)到底有什么作用,但是只要配合下面的流程圖這個(gè)問(wèn)題就可以迎刃而解了。

業(yè)
務(wù)建模的目標(biāo)是在數(shù)據(jù)模型的基礎(chǔ)上,讓?xiě)?yīng)用程序幫助最終用戶解決實(shí)際業(yè)務(wù)中出現(xiàn)的問(wèn)題,它所感興趣的方面數(shù)據(jù)的流向和狀態(tài)的變遷,從上面的流程圖我們就可
以看到,雖然status擁有4個(gè)狀態(tài),但是這4個(gè)狀態(tài)并不是可以隨意轉(zhuǎn)換的,“文章起草”(status=0)只能轉(zhuǎn)變?yōu)?#8220;提交待審批”
(status=1),而“審批完成”(status=2)作為一個(gè)終止?fàn)顟B(tài)是不能再發(fā)生改變的。這些功能需求都是數(shù)據(jù)建模階段無(wú)法解決的,只有通過(guò)對(duì)業(yè)
務(wù)邏輯,業(yè)務(wù)流程的梳理分析才能在應(yīng)用程序中為最終用戶提供這些功能。
業(yè)務(wù)建模讓數(shù)據(jù)模型變得有血有肉,結(jié)合了業(yè)務(wù)的數(shù)據(jù)不再是單薄的骨架,而是變成了鮮活的生靈。
我
們借助一個(gè)最簡(jiǎn)單的發(fā)文審批流程向大家介紹了數(shù)據(jù)建模與業(yè)務(wù)建模的關(guān)系,希望大家能夠借此了解軟件開(kāi)發(fā)中業(yè)務(wù)流程與數(shù)據(jù)模型之間的關(guān)系,別小看文章表結(jié)構(gòu)
中的status狀態(tài)位,它已經(jīng)初具了有限狀態(tài)機(jī)(FSM, Finite State
Machine)的雛形,很多簡(jiǎn)易的工作流引擎都是基于FSM來(lái)實(shí)現(xiàn)的,所以請(qǐng)切實(shí)體會(huì)一下實(shí)際開(kāi)發(fā)中流程的作用,你可能沒(méi)有使用工作流,但是我們所面對(duì)
的問(wèn)題和解決的方式卻是大同小異的。