數(shù)據(jù)庫(kù)設(shè)計(jì)模式_第1頁(yè)
數(shù)據(jù)庫(kù)設(shè)計(jì)模式_第2頁(yè)
數(shù)據(jù)庫(kù)設(shè)計(jì)模式_第3頁(yè)
數(shù)據(jù)庫(kù)設(shè)計(jì)模式_第4頁(yè)
數(shù)據(jù)庫(kù)設(shè)計(jì)模式_第5頁(yè)
已閱讀5頁(yè),還剩15頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、什么是模式什么是模式?簡(jiǎn)單說(shuō)來(lái),模式類似于定式,就是遇到反復(fù)出現(xiàn)的同一問(wèn)題時(shí)所固定使用的解決方案。下圍棋的朋友可能對(duì)“定式”這個(gè)詞比較熟悉,定式包含著下棋時(shí)做遇到的各種情況下的下法、急所、手筋及死活等基本原理,例如星定式、小目定式、邊定式等等,定式懂的越多,圍棋下的越好。那么是不是數(shù)據(jù)庫(kù)設(shè)計(jì)模式懂得越多,設(shè)計(jì)工作越完美呢?理論上是這樣,但是在我這里,各位朋友所能看到的數(shù)據(jù)庫(kù)設(shè)計(jì)模式只有四種。為什么只有四種而不是更多?不時(shí)有那句話嗎:“濃縮的都是精華”!在后面的文章中,您會(huì)陸續(xù)看到浩浩蕩蕩的設(shè)計(jì)實(shí)例連篇累牘,卻都是利用這四種基本模式設(shè)計(jì)出來(lái)的。易傳系辭曰:“易有太極,是生兩儀,兩儀生四象,四象生

2、八卦?!崩献釉诘赖陆?jīng)中也說(shuō):“道生一,一生二,二生三,三生萬(wàn)物。”設(shè)計(jì)模式不必多,只要掌握其中關(guān)鍵的幾個(gè),再結(jié)合實(shí)際的業(yè)務(wù)需求,一個(gè)完整的數(shù)據(jù)庫(kù)模型就可以推導(dǎo)出來(lái)。下面讓我們來(lái)逐一介紹這四種主要設(shè)計(jì)模式1、主擴(kuò)展模式主擴(kuò)展模式,通常用來(lái)將幾個(gè)相似的對(duì)象的共有屬性抽取出來(lái),形成一個(gè)“公共屬性表”;其余屬性則分別形成“專有屬性表”,且“公共屬性表”與“專有屬性表”都是“一對(duì)一”的關(guān)系。“專有屬性表”可以看作是對(duì)“公共屬性表”的擴(kuò)展,兩者合在一起就是對(duì)一個(gè)特定對(duì)象的完整描述,故此得名“主擴(kuò)展模式”。 舉例如下(注:這個(gè)例子已經(jīng)作了相當(dāng)程度的簡(jiǎn)化,僅僅是用來(lái)幫助大家理解“主擴(kuò)展模式”這個(gè)概念來(lái)使用的,

3、請(qǐng)大家注意)。假設(shè)某公司包括如下6種類型的工作人員:采購(gòu)員、營(yíng)銷員、庫(kù)房管理員、收銀員、財(cái)務(wù)人員和咨詢專家,采用主擴(kuò)展模式進(jìn)行設(shè)計(jì),如上圖所示。無(wú)論哪種類型的工作人員,都要訪問(wèn)公司的辦公軟件,所以都有“登陸代碼”和“登錄密碼”;并且作為一般屬性,“姓名”、“性別”、“身份證號(hào)”、“入職時(shí)間”、“離職時(shí)間”等屬性,都與個(gè)人所從事的工作崗位無(wú)關(guān),所以可以抽取出來(lái)作為公共屬性,創(chuàng)建“公司員工”表。很顯然,公司委派員工采購(gòu)哪些商品是“采購(gòu)員”的專有屬性,這是由公司的實(shí)際業(yè)務(wù)特點(diǎn)決定的。換句話說(shuō),公司不可能把采購(gòu)任務(wù)放到“營(yíng)銷員”身上,也不可能放到“庫(kù)房管理員”身上,“采購(gòu)商品”屬性就是“采購(gòu)員”的專用

4、屬性?!安少?gòu)員”表的主鍵與“公司員工”表的主鍵是相同的,包括字段名稱和字段的實(shí)際取值;“采購(gòu)員”表的主鍵同時(shí)是“公司員工”表主鍵的外鍵。在PDM圖里可以看到“采購(gòu)員”表中的“員工ID”字段后面有一個(gè)“”標(biāo)記,這個(gè)標(biāo)記就說(shuō)明“員工ID”字段既是“采購(gòu)員”表的主鍵,同時(shí)也是該表的外鍵?!肮締T工”表是主表,“采購(gòu)員”表是擴(kuò)展表,二者是“一對(duì)一”的關(guān)系,兩個(gè)表的字段合起來(lái)就是對(duì)“采購(gòu)員”這個(gè)對(duì)象的完整說(shuō)明。同理,“公司員工”表和其他5個(gè)表之間也都分別構(gòu)成了“一對(duì)一”的關(guān)系。對(duì)于主表來(lái)說(shuō),從表既可以沒(méi)有記錄,也可以有唯一一條記錄來(lái)對(duì)主表進(jìn)行擴(kuò)展說(shuō)明,這就是“主擴(kuò)展模式”。2、主從模式主從模式,是數(shù)據(jù)庫(kù)

5、設(shè)計(jì)模式中最常見(jiàn)、也是大家日常設(shè)計(jì)工作中用的最多的一種模式,它描述了兩個(gè)表之間的主從關(guān)系,是典型的“一對(duì)多”關(guān)系。舉例如下(注:這個(gè)例子已經(jīng)作了相當(dāng)程度的簡(jiǎn)化,僅僅是用來(lái)幫助大家理解“主從模式”這個(gè)概念來(lái)使用的,請(qǐng)大家注意)。比如論壇程序。一個(gè)論壇通常都會(huì)有若干“板塊”,在每個(gè)板塊里面,大家可以發(fā)布很多的新帖。這時(shí)候“板塊”和“發(fā)帖”就是主從模式,主表是“板塊”,從表是“發(fā)帖”,二者是“一對(duì)多”的關(guān)系。多個(gè)潛水員也可以對(duì)感興趣的同一份發(fā)帖進(jìn)行回復(fù),以表達(dá)各自的意見(jiàn),這時(shí)候,一個(gè)“發(fā)帖”就有了多份“回復(fù)”,又構(gòu)成了一個(gè)“主從模式”。3、名值模式名值模式,通常用來(lái)描述在系統(tǒng)設(shè)計(jì)階段不能完全確定屬性

6、的對(duì)象,這些對(duì)象的屬性在系統(tǒng)運(yùn)行時(shí)會(huì)有很大的變更,或者是多個(gè)對(duì)象之間的屬性存在很大的差異。舉例如下(注:這個(gè)例子已經(jīng)作了相當(dāng)程度的簡(jiǎn)化,僅僅是用來(lái)幫助大家理解“名值模式”這個(gè)概念來(lái)使用的,請(qǐng)大家注意)。1. 使用名值模式進(jìn)行設(shè)計(jì)時(shí),如果對(duì)“其他屬性”僅作瀏覽保存、不作其它任何特殊處理,則通常會(huì)設(shè)計(jì)一個(gè)“屬性模板”表,該表的數(shù)據(jù)記錄在系統(tǒng)運(yùn)行時(shí)動(dòng)態(tài)維護(hù)。系統(tǒng)運(yùn)行時(shí),如需維護(hù)“產(chǎn)品其他屬性”,可先從“屬性模板”中選擇一個(gè)屬性名稱,然后填寫“屬性值”保存,系統(tǒng)會(huì)將對(duì)應(yīng)的產(chǎn)品ID、屬性模板ID及剛剛填寫的“屬性值”一起保存在“產(chǎn)品其他屬性”里,這樣就完成了相關(guān)設(shè)置。無(wú)論產(chǎn)品的其他屬性需求發(fā)生怎樣的變化

7、、怎樣增刪改屬性,都可以在運(yùn)行時(shí)實(shí)現(xiàn),而不必修改數(shù)據(jù)庫(kù)設(shè)計(jì)和程序代碼。(見(jiàn)下圖)2.2. 使用名值模式進(jìn)行設(shè)計(jì)時(shí),如果對(duì)“其他屬性”有特殊處理,比如統(tǒng)計(jì)匯總,那么這個(gè)屬性名稱需要在程序代碼中作“硬編碼”,即該屬性名稱需要在程序代碼中有所體現(xiàn),此時(shí)可以在“產(chǎn)品其他屬性”表中直接記錄“屬性名稱”,不再需要“屬性模板”表。系統(tǒng)運(yùn)行時(shí),如需維護(hù)“產(chǎn)品其他屬性”,程序直接列出“屬性名稱”,然后填寫“屬性值”保存,系統(tǒng)會(huì)將對(duì)應(yīng)的產(chǎn)品ID、屬性名稱及剛剛填寫的“屬性值”一起保存在“產(chǎn)品其他屬性”里,這樣就完成了相關(guān)設(shè)置。以后如果需求發(fā)生變更,則只需修改相應(yīng)的程序代碼即可,不必修改數(shù)據(jù)庫(kù)設(shè)計(jì)。(見(jiàn)下圖)4、多

8、對(duì)多模式多對(duì)多模式,也是比較常見(jiàn)的一種數(shù)據(jù)庫(kù)設(shè)計(jì)模式,它所描述的兩個(gè)對(duì)象不分主次、地位對(duì)等、互為一對(duì)多的關(guān)系。對(duì)于A表來(lái)說(shuō),一條記錄對(duì)應(yīng)著B表的多條記錄,反過(guò)來(lái)對(duì)于B表來(lái)說(shuō),一條記錄也對(duì)應(yīng)著A表的多條記錄,這種情況就是“多對(duì)多模式”。“多對(duì)多模式”需要在A表和B表之間有一個(gè)關(guān)聯(lián)表,這個(gè)關(guān)聯(lián)表也是“多對(duì)多模式”的核心所在。根據(jù)關(guān)聯(lián)表是否有獨(dú)立的業(yè)務(wù)處理需求,可將其劃分為兩種細(xì)分情況。1. 關(guān)聯(lián)表有獨(dú)立的業(yè)務(wù)處理需求。舉例如下(注:這個(gè)例子已經(jīng)作了相當(dāng)程度的簡(jiǎn)化,僅僅是用來(lái)幫助大家理解“多對(duì)多模式”這個(gè)概念來(lái)使用的,請(qǐng)大家注意)。比如網(wǎng)上書店,通常都會(huì)有“書目信息”和“批發(fā)單”。一條“書目信息”面

9、對(duì)不同的購(gòu)買客戶、可以存在多張“批發(fā)單”,反過(guò)來(lái),一張“批發(fā)單”也可以批發(fā)多條書目,這就是多對(duì)多模式。中間的“批發(fā)單明細(xì)”表就是兩者的關(guān)聯(lián)表,具備獨(dú)立的業(yè)務(wù)處理需求,是一個(gè)業(yè)務(wù)實(shí)體對(duì)象,因此它具備一些特有的屬性,比如針對(duì)每一條明細(xì)記錄而言的“累計(jì)退貨次數(shù)”、“累計(jì)退貨數(shù)量”、“累計(jì)結(jié)算次數(shù)”、“累計(jì)結(jié)算數(shù)量”;由于批發(fā)單明細(xì)在數(shù)據(jù)產(chǎn)生后已經(jīng)打印出紙質(zhì)清單提供給客戶,因此在“批發(fā)單明細(xì)”表里對(duì)紙質(zhì)清單中打印的書目信息屬性作了冗余(逆標(biāo)準(zhǔn)化),這樣在將來(lái)即使修改了“書目信息”表中的屬性,也不會(huì)影響跟客戶核對(duì)批發(fā)單明細(xì),不會(huì)影響未來(lái)的財(cái)務(wù)結(jié)算業(yè)務(wù)。關(guān)2)聯(lián)表沒(méi)有獨(dú)立的業(yè)務(wù)處理需求舉例如下(注:這個(gè)例

10、子已經(jīng)作了相當(dāng)程度的簡(jiǎn)化,僅僅是用來(lái)幫助大家理解“多對(duì)多模式”這個(gè)概念來(lái)使用的,請(qǐng)大家注意)。比如用戶與角色之間的關(guān)系,一般系統(tǒng)在做權(quán)限控制方面的程序時(shí)都會(huì)涉及到“系統(tǒng)用戶表”和“系統(tǒng)角色表”。一個(gè)用戶可以從屬于多個(gè)角色,反過(guò)來(lái)一個(gè)角色里面也可以包含多個(gè)用戶,兩者也是典型的“多對(duì)多關(guān)系”。其中的關(guān)聯(lián)表“用戶角色關(guān)聯(lián)表”在絕大多數(shù)情況下都是僅僅用作表示用戶與角色之間的關(guān)聯(lián)關(guān)系,本身不具備獨(dú)立的業(yè)務(wù)處理需求,所以也就沒(méi)有什么特殊的屬性。5、使用上述四種模式的一般原則1)什么時(shí)候用“主擴(kuò)展模式”?對(duì)象的個(gè)數(shù)不多;各個(gè)對(duì)象之間的屬性有一定差別;各個(gè)對(duì)象的屬性在數(shù)據(jù)庫(kù)設(shè)計(jì)階段能夠完全確定;各個(gè)擴(kuò)展對(duì)象有

11、獨(dú)立的、相對(duì)比較復(fù)雜的業(yè)務(wù)處理需求,此時(shí)用“主擴(kuò)展模式”。將各個(gè)對(duì)象的共有屬性抽取出來(lái)設(shè)計(jì)為“主表”,將各個(gè)對(duì)象的剩余屬性分別設(shè)計(jì)為相應(yīng)的“擴(kuò)展表”,“主表”與各個(gè)“擴(kuò)展表”分別建立一對(duì)一的關(guān)系。2)什么時(shí)候用“主從模式”?對(duì)象的個(gè)數(shù)較多且不固定;各個(gè)對(duì)象之間的屬性幾乎沒(méi)有差異;對(duì)象的屬性在數(shù)據(jù)庫(kù)設(shè)計(jì)階段能夠完全確定;各個(gè)對(duì)象沒(méi)有獨(dú)立的業(yè)務(wù)處理需求,此時(shí)用“主從模式”。將各個(gè)對(duì)象設(shè)計(jì)為“從表”的記錄,與“主表”對(duì)象建立一對(duì)多的關(guān)系。3)什么時(shí)候用“名值模式”?對(duì)象的個(gè)數(shù)極多;各個(gè)對(duì)象之間的屬性有較大差異;對(duì)象屬性在數(shù)據(jù)庫(kù)設(shè)計(jì)階段不能確定,或者在系統(tǒng)運(yùn)行時(shí)有較大變更;各個(gè)對(duì)象沒(méi)有相互獨(dú)立的業(yè)務(wù)處

12、理需求,此時(shí)用“名值模式”。4)什么時(shí)候用“多對(duì)多模式”??jī)蓚€(gè)對(duì)象之間互為一對(duì)多關(guān)系,則使用“多對(duì)多模式”。6、數(shù)據(jù)庫(kù)物理模型設(shè)計(jì)的其他模式除了上面提到的四種主要設(shè)計(jì)模式,還有一些其他模式,在某些項(xiàng)目中可能會(huì)用到,在這里先簡(jiǎn)單做個(gè)說(shuō)明,暫不做深入討論,等到以后的項(xiàng)目用到這些模式的時(shí)候,再結(jié)合實(shí)際需求詳細(xì)解說(shuō)。(一)繼承模式繼承模式,可以看作是“主從模式”的一種特殊情況(或者說(shuō)是“變形”),它所代表的兩個(gè)對(duì)象也是“一對(duì)多”的關(guān)系。它與“主從模式”的區(qū)別是,“繼承模式”中從表的主鍵是復(fù)合主鍵,并且復(fù)合主鍵中必定包含主表的主鍵列。根據(jù)從表繼承主表的列的數(shù)量,繼承模式又分以下兩種情況:1. 從表繼承主

13、表的全部列在這種情況下,從表除了代表自身的專用字段以外,還冗余了主表的全部字段。這種設(shè)計(jì)方式的缺點(diǎn)顯而易見(jiàn): 數(shù)據(jù)冗余度大 一致性差 磁盤存儲(chǔ)量大它的優(yōu)點(diǎn)也顯而易見(jiàn): 正因?yàn)樗娜哂喽却?、所以它不易丟失數(shù)據(jù)。假設(shè)主表數(shù)據(jù)丟失、或者被誤操作刪改,也能依據(jù)從表數(shù)據(jù)重新生成主表數(shù)據(jù);這種設(shè)計(jì)方式,可以在發(fā)生數(shù)據(jù)損壞的時(shí)候從應(yīng)用的角度進(jìn)行一定程度的數(shù)據(jù)恢復(fù),等于是在SQL Server數(shù)據(jù)庫(kù)級(jí)別的數(shù)據(jù)恢復(fù)功能之上又加了一道保險(xiǎn)。 正因?yàn)樗恢滦圆睢⒅鞅頂?shù)據(jù)被重復(fù)存儲(chǔ),所以可依據(jù)外鍵關(guān)系進(jìn)行數(shù)據(jù)驗(yàn)證。將主從表記錄作關(guān)聯(lián)比較,如果數(shù)據(jù)不一致,就可以得知數(shù)據(jù)要么被人為改動(dòng),或者要么程序代碼中存在bug。 盡

14、管磁盤存儲(chǔ)量大,但是數(shù)據(jù)在查詢統(tǒng)計(jì)的時(shí)候,只需針對(duì)從表進(jìn)行搜索即可,無(wú)需關(guān)聯(lián)操作,可以加快檢索的速度。這就是數(shù)據(jù)庫(kù)模型設(shè)計(jì)中經(jīng)常提到的“以空間換時(shí)間”。2)從表只繼承主表的主鍵列這種設(shè)計(jì)方式,從表只繼承了主表的主鍵列,這種方式的優(yōu)缺點(diǎn)與前面剛好相反。優(yōu)點(diǎn): 數(shù)據(jù)冗余度小 一致性高 磁盤存儲(chǔ)量小缺點(diǎn): 正因?yàn)樗娜哂喽刃?、所以它易丟失數(shù)據(jù)。假設(shè)主表數(shù)據(jù)丟失、或者被誤操作刪改,就只能通過(guò)SQL Server數(shù)據(jù)庫(kù)級(jí)別的數(shù)據(jù)恢復(fù)操作來(lái)找回丟失的數(shù)據(jù)了。 正因?yàn)樗恢滦愿?,所以無(wú)法進(jìn)行應(yīng)用程序級(jí)的數(shù)據(jù)驗(yàn)證。 由于采用了一致性設(shè)計(jì),磁盤存儲(chǔ)量較小,但是數(shù)據(jù)在查詢統(tǒng)計(jì)的時(shí)候,必須要對(duì)兩個(gè)表進(jìn)行內(nèi)連接(IN

15、NER JOIN)操作,才能搜索到相關(guān)數(shù)據(jù)。而內(nèi)連接操作時(shí)需要耗費(fèi)一定的時(shí)間的。這就是數(shù)據(jù)庫(kù)模型設(shè)計(jì)中經(jīng)常提到的“以時(shí)間換空間”。當(dāng)然,在實(shí)際的數(shù)據(jù)庫(kù)模型設(shè)計(jì)過(guò)程中,還會(huì)有介于上述兩者之間的第3種情況出現(xiàn),那就是從表繼承了主表的主鍵列以及部分其他列。這就要求我們?cè)O(shè)計(jì)人員要依據(jù)實(shí)際的業(yè)務(wù)需求進(jìn)行綜合分析、權(quán)衡、折中,給出最符合業(yè)務(wù)需求的設(shè)計(jì)結(jié)果。7、自聯(lián)結(jié)模式自聯(lián)結(jié)模式,也可以看作是“主從模式”的一種特殊情況(或者說(shuō)是“變形”),它在一張表內(nèi)實(shí)現(xiàn)了“一對(duì)多關(guān)系”,并且可以根據(jù)業(yè)務(wù)需要實(shí)現(xiàn)“有限層”或者“無(wú)限層”的主從嵌套。這種模式用得最多的情況就是實(shí)現(xiàn)“樹(shù)形結(jié)構(gòu)”數(shù)據(jù)的存儲(chǔ),比如各大網(wǎng)站上常見(jiàn)的

16、細(xì)分類別、應(yīng)用系統(tǒng)的組織結(jié)構(gòu)、Web系統(tǒng)的菜單樹(shù)等都能用到這種模式。自聯(lián)結(jié)模式有很多變體,且每種變體的優(yōu)缺點(diǎn)同樣鮮明。由于本連載的重點(diǎn)在于對(duì)跨行業(yè)通用數(shù)據(jù)庫(kù)模型設(shè)計(jì)進(jìn)行分析,所以對(duì)每種具體模式的細(xì)節(jié)方面的設(shè)計(jì)技巧不能作詳細(xì)論述,請(qǐng)大家原諒。這里僅舉兩個(gè)例子說(shuō)明:1. 簡(jiǎn)單自聯(lián)結(jié)簡(jiǎn)單自聯(lián)結(jié),就是在一個(gè)表里設(shè)置當(dāng)前類ID、父類ID,同時(shí)規(guī)定最頂層類的父類ID為一個(gè)固定值(比如0),在生成樹(shù)的時(shí)候使用遞歸算法,記錄的前后順序通過(guò)“排序號(hào)”字段來(lái)確定。這個(gè)表用來(lái)存儲(chǔ)菜單樹(shù)很方便。首先會(huì)有一個(gè)主菜單,主菜單下有子菜單,子菜單下面又有孫菜單菜單的數(shù)量不確定、層級(jí)不確定,用戶可以在任意菜單下增加新的子菜單,

17、或者刪除某個(gè)子菜單及其下的所有孫菜單這種設(shè)計(jì)方式很多人都會(huì)用到,短小精悍、維護(hù)方便、且完全滿足用戶需求,而且樹(shù)的層次不限,擴(kuò)展起來(lái)非常容易。這些都是它的優(yōu)點(diǎn)。它的缺點(diǎn)就是樹(shù)結(jié)構(gòu)的生成由于使用了遞歸算法,必然要對(duì)該表進(jìn)行多次讀取(讀取的次數(shù) = 表內(nèi)的記錄數(shù) 最深層級(jí)的記錄數(shù)),多次讀取就來(lái)了比較低的運(yùn)行效率,當(dāng)表里的記錄很多的時(shí)候,這個(gè)缺點(diǎn)可以稱得上是致命的。于是就有了下面的這種設(shè)計(jì)模式。2. 擴(kuò)展自聯(lián)結(jié)擴(kuò)展自聯(lián)結(jié),與簡(jiǎn)單自聯(lián)結(jié)的最大區(qū)別就是通過(guò)附加冗余字段來(lái)避免遞歸運(yùn)算,所要實(shí)現(xiàn)的主要目標(biāo)就是一次讀取就能生成整個(gè)樹(shù),一次提高樹(shù)的生成效率。但是,魚與熊掌不可兼得,凡事都有兩面性。生成樹(shù)的效率提

18、高了,增刪改表內(nèi)記錄的算法就會(huì)相應(yīng)復(fù)雜,并且樹(shù)的層數(shù)也變?yōu)橛邢薜牧?。所以在此類設(shè)計(jì)的時(shí)候,大家還是要認(rèn)真分析業(yè)務(wù)需求,看看實(shí)際業(yè)務(wù)的重點(diǎn)在什么地方,然后再作具體設(shè)計(jì)。比如一些門戶網(wǎng)站在首頁(yè)顯示產(chǎn)品類別是業(yè)務(wù)重點(diǎn),那么我們?cè)谠O(shè)計(jì)的時(shí)候就要盡可能的提高生成樹(shù)的效率,采取擴(kuò)展自聯(lián)結(jié)模式;相反,一些基于Web的業(yè)務(wù)系統(tǒng),要求對(duì)菜單樹(shù)的增刪改維護(hù)操作盡量簡(jiǎn)單,由于菜單的數(shù)目不多,所以菜單樹(shù)的生成效率不是瓶頸,那么我們?cè)O(shè)計(jì)的時(shí)候就可以采取簡(jiǎn)單自聯(lián)結(jié)模式。關(guān)于附加冗余字段實(shí)現(xiàn)擴(kuò)展自聯(lián)結(jié)的方法很多,網(wǎng)上也有很多這方面的帖子,大家可以到Google上搜一下。在這里僅舉一個(gè)例子如下:這個(gè)設(shè)計(jì)與前面的設(shè)計(jì)最大的區(qū)別

19、就是排序字段,前面的簡(jiǎn)單自聯(lián)結(jié)用了一個(gè)整數(shù)型的字段來(lái)實(shí)現(xiàn)排序,這里用了一個(gè)Varchar20型的字段“層級(jí)代碼”來(lái)實(shí)現(xiàn)大排序。這個(gè)字段的取值兩位一組,代表一層,假定最深為5層,初始值為0000000000。按照這樣的設(shè)計(jì),表內(nèi)的數(shù)據(jù)記錄可能就是這樣的: ID TypeName ParentID TypeLevel1 根類別 0 0000002 類別1 1 0100003 類別1.1 2 0101004 類別1.2 2 0102005 類別2 1 0200006 類別2.1 5 0201007 類別3 1 0300008 類別3.1 7 0301009 類別3.2 7 03020010 類別1.

20、1.1 3 010101現(xiàn)在按TypeLevel字段進(jìn)行排序,執(zhí)行如下SQL語(yǔ)句:SELECT * FROM TMP_Type ORDER BY TypeLevel列出記錄集如下:ID TypeName ParentID TypeLevel1 總類別 0 0000002 類別1 1 0100003 類別1.1 2 01010010 類別1.1.1 3 0101014 類別1.2 2 0102005 類別2 1 0200006 類別2.1 5 0201007 類別3 1 0300008 類別3.1 7 0301009 類別3.2 7 030200在控制顯示類別的層次時(shí),只要對(duì)“層級(jí)代碼”字段中的

21、數(shù)值進(jìn)行判斷,每2位一組,如大于0則向右移2個(gè)空格。8、單表模式單表模式,就是把相關(guān)子類的屬性統(tǒng)統(tǒng)集中在一個(gè)表里,通過(guò)“類別”字段來(lái)區(qū)分表內(nèi)記錄所屬的子類以及該類的有效屬性。在實(shí)際案例當(dāng)中,單表模式的應(yīng)用還是很廣泛的。舉個(gè)例子,有車的朋友現(xiàn)在拿出你們的中華人民共和國(guó)機(jī)動(dòng)車行駛證,翻到“副頁(yè)”,看看副頁(yè)登記的檔案指標(biāo)。下圖為推測(cè)設(shè)計(jì)圖、不代表真實(shí)設(shè)計(jì)。我是2006年2月份買的車,我的機(jī)動(dòng)車行駛證副頁(yè)記載了如下檔案指標(biāo):“號(hào)牌號(hào)碼、車輛類型、總質(zhì)量、整備質(zhì)量、核定載質(zhì)量、準(zhǔn)牽引總質(zhì)量、核定載客、駕駛室共乘、貨箱內(nèi)部尺寸、后軸鋼板彈簧片數(shù)、外廓尺寸、檢驗(yàn)記錄?!睘g覽本文的朋友可以跟自己的行駛證對(duì)照一

22、下,尤其是老司機(jī),看看若干年前發(fā)的行駛證和現(xiàn)在的有沒(méi)有區(qū)別。在這里大家可以很清楚的看到,上述指標(biāo)中“號(hào)牌號(hào)碼、車輛類型、總質(zhì)量、整備質(zhì)量、外廓尺寸、檢驗(yàn)記錄”是各種類型的車輛的公共屬性,“核定載質(zhì)量、準(zhǔn)牽引總質(zhì)量、駕駛室共乘、貨箱內(nèi)部尺寸、后軸鋼板彈簧片數(shù)”是貨運(yùn)車輛的專有屬性,“核定載客”是客運(yùn)車輛的專有屬性。根據(jù)經(jīng)驗(yàn)我推測(cè),就此種表現(xiàn)形式而言,公安機(jī)關(guān)交通管理部門的計(jì)算機(jī)系統(tǒng)應(yīng)該就是采用“單表模式”進(jìn)行的設(shè)計(jì)。通過(guò)這一個(gè)表就可以容納包括貨車、客車、轎車、摩托車、農(nóng)用車等所有類型的車輛檔案。這里面有一個(gè)“車輛類型”屬性,這個(gè)屬性就是用來(lái)區(qū)分當(dāng)前記錄所屬類別,程序代碼根據(jù)這個(gè)屬性的值來(lái)確定當(dāng)前

23、檔案記錄的哪些屬性是有效、且需要記錄和打印的,哪些屬性對(duì)當(dāng)前記錄來(lái)說(shuō)是無(wú)效的。比如我行駛證上的車輛類型是“轎車”,除公共屬性以外,只有“核定載客”指標(biāo)打印了一個(gè)“5人”字樣,其余指標(biāo)打印的都是“-”字樣,因?yàn)檫@些指標(biāo)都是貨車才有的,對(duì)轎車而言是無(wú)意義的。這種設(shè)計(jì)有一個(gè)明顯的好處如果事先對(duì)車輛檔案都有哪些指標(biāo)調(diào)研的很充分,且后期基本上不需要擴(kuò)展,那么系統(tǒng)運(yùn)行時(shí)無(wú)論遇上什么類型的車輛檔案都不需要變更程序,具有很強(qiáng)的通用性。很明顯,行駛證是套打的,這種設(shè)計(jì)便于大批量的制作證件底單。因?yàn)椴还苁裁搭愋偷能囕v檔案都是這個(gè)格式,只要開(kāi)動(dòng)機(jī)器印刷便是。凡事有利就有弊,這種設(shè)計(jì)的弊端也很明顯。首先是給人的印象不

24、是很人性化。我明明買的是轎車,你發(fā)給我的證件搞那么多貨車的指標(biāo)在上面干嘛?浪費(fèi)版面!其次,如果一旦后期需要對(duì)某種類型的車輛檔案擴(kuò)充屬性(無(wú)論你前期的需求調(diào)研多么充分,都不能保證以后不會(huì)變化),假設(shè)國(guó)家新頒布一部法規(guī)或者國(guó)標(biāo),要求必須在行駛證上記載客車的“發(fā)動(dòng)機(jī)排量”、其他類型的車輛不作要求,那么按照這種設(shè)計(jì),所有車輛(包括“無(wú)辜的”貨車在內(nèi))都要換證(呵呵,不知道這種換證收不收工本費(fèi))!聲明:以上例子僅僅是我的推測(cè),用以說(shuō)明“單表模式”。我沒(méi)有交通管理部門的工作經(jīng)歷,如果與實(shí)際情況不符,歡迎同行批評(píng)指正。10通用數(shù)據(jù)庫(kù)模型分析在我們數(shù)據(jù)庫(kù)模型設(shè)計(jì)領(lǐng)域,有一個(gè)很有趣的比例“5:3:2”,我稱之為

25、“五三二法則”。具體是什么含義呢?這個(gè)“5”,表示大約50%的功能設(shè)計(jì)是跨行業(yè)通用的,不管你是做商業(yè)流通項(xiàng)目、還是電子政務(wù)項(xiàng)目、或者是網(wǎng)上拍賣系統(tǒng),雖然各個(gè)項(xiàng)目所屬行業(yè)不同,但是它們中的50%的設(shè)計(jì)思想都是相同的,這就是本章(第五章)所要講述的“通用模型設(shè)計(jì)”。換句話說(shuō),本章所講述的模型設(shè)計(jì)思想,你可以在任何項(xiàng)目中使用;“3”表示在某行業(yè)內(nèi)部的各個(gè)不同的公司之間又有30%的設(shè)計(jì)思想是相同的,這就是下一章(第六章)所要說(shuō)明的“行業(yè)模型設(shè)計(jì)”;“2”表示余下的20%才是某一特定公司所獨(dú)有的業(yè)務(wù)需求,這部分內(nèi)容我這個(gè)連載就不介紹了。(一)人與組織大部分的企業(yè)系統(tǒng)都會(huì)記錄有關(guān)人與組織的信息,比如公司員

26、工、供貨商、銷售客戶、網(wǎng)上客戶、會(huì)員卡客戶、子公司、公司內(nèi)部組織機(jī)構(gòu)等信息。而大部分系統(tǒng)對(duì)這些信息進(jìn)行數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí),都是創(chuàng)建各自獨(dú)立的表,沒(méi)有抽取共有信息,因而造成了數(shù)據(jù)的冗余。比如A公司為了開(kāi)辟銷售市場(chǎng),通常會(huì)給與會(huì)員卡客戶一定的優(yōu)惠條件,那么顯然不能排除持卡人為公司員工這種情形、也不能排除持卡人為公司的供貨商這種情形。假設(shè)B公司既是A公司的供貨商、同時(shí)也是A公司的會(huì)員卡客戶,如果按照各自獨(dú)立的方式設(shè)計(jì)數(shù)據(jù)庫(kù)表,則B公司的信息,如公司名稱、聯(lián)系人、聯(lián)系電話、聯(lián)系地址等信息必然要在A公司的“會(huì)員卡客戶”表及“供貨商”表作重復(fù)記錄。如果B公司的某些信息,如聯(lián)系電話和地址發(fā)生了變更,則A公司必須將

27、會(huì)員卡客戶表和供貨商表中的記錄同時(shí)修改,否則業(yè)務(wù)人員就會(huì)發(fā)現(xiàn)同一家公司(B公司)的信息,在系統(tǒng)內(nèi)兩個(gè)地方登記的不一樣,那么,哪個(gè)是正確的?業(yè)務(wù)人員就會(huì)對(duì)軟件數(shù)據(jù)的準(zhǔn)確性產(chǎn)生懷疑,進(jìn)而對(duì)整個(gè)系統(tǒng)持懷疑態(tài)度。同樣道理,在一些大型企業(yè),內(nèi)部各部門、各子公司之間有時(shí)也會(huì)按照銷售的方式進(jìn)行業(yè)務(wù)往來(lái)?!吧a(chǎn)車間”是“產(chǎn)品營(yíng)銷部”的供貨商,“生產(chǎn)車間”同時(shí)也是“原料采購(gòu)部”的銷售客戶。有些大型企業(yè)集團(tuán)還會(huì)建立集團(tuán)內(nèi)部銀行,內(nèi)部各部門、各子公司之間通過(guò)內(nèi)部轉(zhuǎn)帳支票的方式完成內(nèi)部往來(lái)結(jié)算,各部門、各子公司之間采取相對(duì)獨(dú)立的成本核算的經(jīng)營(yíng)方式。這樣的話,如果每個(gè)部門、子公司都自己創(chuàng)建一套獨(dú)立的“組織”表,那么同一

28、個(gè)組織的信息就會(huì)存儲(chǔ)在多個(gè)表里,這樣就產(chǎn)生了數(shù)據(jù)重復(fù)。如果同一數(shù)據(jù)重復(fù)存儲(chǔ)在多個(gè)表里,一旦某個(gè)部門由于業(yè)務(wù)的發(fā)展而發(fā)生變更的時(shí)候,就會(huì)給系統(tǒng)使用者帶來(lái)很大的麻煩不但增加了數(shù)據(jù)修改的工作量,還必須要對(duì)所做的多處修改進(jìn)行認(rèn)真核對(duì),以保證同一部門的信息在軟件的各個(gè)地方都是一致的。綜上所述,為了解決數(shù)據(jù)在系統(tǒng)內(nèi)部不必要的重復(fù)存儲(chǔ)問(wèn)題,關(guān)于這方面的數(shù)據(jù)庫(kù)設(shè)計(jì)模式就用到了我們前面提到的“主擴(kuò)展模式”。9 人員在需求調(diào)研和分析階段、通常需要制作用例圖,記錄當(dāng)前應(yīng)用系統(tǒng)Actor及用例。假設(shè)系統(tǒng)Actor包括公司員工、簽約人、供應(yīng)商聯(lián)絡(luò)員、客戶聯(lián)絡(luò)員4種類型,那么有些系統(tǒng)可能就會(huì)設(shè)計(jì)成4個(gè)表來(lái)分別存儲(chǔ)。如果某

29、個(gè)人所屬的公司既是本公司的供應(yīng)商又是客戶,他則既是供應(yīng)商聯(lián)絡(luò)員、又是客戶連鎖員,那么這個(gè)人的信息就要在“供應(yīng)商聯(lián)絡(luò)員”、“客戶聯(lián)絡(luò)員”表里各存一條記錄,這就造成了數(shù)據(jù)冗余。為了避免這種情況,我們采用“主擴(kuò)展模式”進(jìn)行設(shè)計(jì),首先抽取4種Actor的共同屬性創(chuàng)建“人員”表,然后創(chuàng)建其余4個(gè)表存儲(chǔ)主表的擴(kuò)展屬性。在這一節(jié),我們重點(diǎn)講述主表、即“人員”表的設(shè)計(jì)細(xì)節(jié),其他表的設(shè)計(jì)放到后面再說(shuō)人員表的主鍵為什么是“當(dāng)事人ID”,而不是“人員ID”呢?這個(gè)問(wèn)題留到第3節(jié)講述,此處只要把它看作是人員表的主鍵就可以了。在設(shè)計(jì)人員表以及其他實(shí)體表的時(shí)候,需要注意實(shí)體屬性的類型。一般可以分成三類:(1)自然屬性,與

30、該實(shí)體緊密相關(guān),除非錄入錯(cuò)誤,否則不存在修改的情況;(2)社會(huì)屬性,與實(shí)體松散相關(guān),會(huì)隨著實(shí)際情況的變化而變化;(3)系統(tǒng)屬性,與實(shí)體基本無(wú)關(guān),屬于系統(tǒng)控制層次的屬性。對(duì)照上面的“人員表”我們可以看到,對(duì)于確定的一個(gè)人,排除錄入錯(cuò)誤的情況,他的“出生日期”、“身份證號(hào)”是不會(huì)發(fā)生變化的,這就是一個(gè)人的自然屬性;除此以外的其他屬性都是社會(huì)屬性,都有可能會(huì)發(fā)生變化。大家都知道目前國(guó)內(nèi)改名的現(xiàn)象比較多,盡管公安機(jī)關(guān)的限制很嚴(yán),依然擋不住改名的熱潮。至于身高、體重、職務(wù)、婚姻狀況,就更不用說(shuō)了,就像美女的臉、說(shuō)變就變。護(hù)照一般都有有效期,過(guò)了有效期需要重新領(lǐng)新的護(hù)照,號(hào)碼自然會(huì)發(fā)生變化。為什么“性別”

31、也會(huì)變化呢?其實(shí)“性別”的取值范圍是有國(guó)家標(biāo)準(zhǔn)的,取值分別是“男性”、“女性”、“未知的性別”、“未確定的性別”,感興趣的朋友可以在網(wǎng)上搜搜。一般在錄入人員信息的時(shí)候,如果不知道該人是男是女,默認(rèn)應(yīng)當(dāng)選“未知的性別”,等以后知道了具體性別再作修正;此外男變女、女變男也不是什么新鮮事了,所以人的“性別”也是社會(huì)屬性。說(shuō)了這么多,大家可以發(fā)現(xiàn),一般的“社會(huì)屬性”的名稱前都有一個(gè)“現(xiàn)”字,用來(lái)提示大家這個(gè)屬性是社會(huì)屬性,是很可能會(huì)發(fā)生變化的,目前數(shù)據(jù)庫(kù)里存儲(chǔ)的只是最后一次修改的結(jié)果。有些系統(tǒng)(例如我舉的這個(gè)例子)不關(guān)心這些屬性的變化過(guò)程,只要有一個(gè)最新值就可以了。有些系統(tǒng)則必須跟蹤屬性變化的全過(guò)程,

32、例如“干部考評(píng)系統(tǒng)”,可能就要記錄某人“職務(wù)”變化的全部歷史;“海關(guān)出入境登記系統(tǒng)”,就要記錄一個(gè)人“護(hù)照”號(hào)碼所有的變化;“康體中心”可能會(huì)記錄其會(huì)員在一段時(shí)間內(nèi)每天的“體重”變化值,等等。這樣,就需要采用“主從模式”或者“名值模式”來(lái)進(jìn)行相應(yīng)設(shè)計(jì),而不是簡(jiǎn)簡(jiǎn)單單的建一個(gè)表完事了。但是無(wú)論是什么系統(tǒng),在記載人員的“自然屬性”的時(shí)候,由于其不會(huì)產(chǎn)生變化歷史,所以只要作為“人員”表的字段就可以了?!跋到y(tǒng)屬性”,屬于系統(tǒng)控制手段的范疇。例如有些系統(tǒng)對(duì)人員管理較嚴(yán)格、不允許隨便增刪人員記錄,就在人員表中設(shè)置一個(gè)屬性“狀態(tài)”,取值范圍是“新增/有效/無(wú)效”。辦事員錄入一個(gè)人員信息后,“狀態(tài)”屬性被設(shè)置

33、為“新增”,由管理人員審核通過(guò)后屬性改為“有效”,只有狀態(tài)為“有效”的人員才能進(jìn)行相應(yīng)的業(yè)務(wù)處理;當(dāng)需要?jiǎng)h除人員信息時(shí),將“狀態(tài)”屬性改為“無(wú)效”。這就是實(shí)體的系統(tǒng)屬性。對(duì)于一個(gè)屬性而言,它到底是“自然屬性”、還是“社會(huì)屬性”,需要我們?cè)谧餍枨蠓治鲭A段認(rèn)真分析業(yè)務(wù)、與一線業(yè)務(wù)人員充分溝通之后予以確定。而“系統(tǒng)屬性”一般是在系統(tǒng)設(shè)計(jì)階段、結(jié)合業(yè)務(wù)邏輯確定。10、 組織事實(shí)上,“組織”的含義是很廣的,分銷渠道、供應(yīng)商、公司內(nèi)部的部門、政府機(jī)構(gòu)、行業(yè)協(xié)會(huì)、行業(yè)主管部門、合作伙伴、競(jìng)爭(zhēng)對(duì)手、家庭、團(tuán)隊(duì)都是組織的一種;但同時(shí),針對(duì)某一特定企業(yè)的業(yè)務(wù)需求而創(chuàng)建的應(yīng)用系統(tǒng),其需要打交道的“組織”的類型又是有

34、限的。我們的設(shè)計(jì)人員所要做的就是在需求調(diào)研、分析階段把所有需要與之打交道的組織類型確認(rèn)清楚,這些工作絕不能放到后期程序運(yùn)行時(shí)才去考慮。個(gè)人感覺(jué)目前有一個(gè)傾向,有些人剛?cè)胄?、設(shè)計(jì)經(jīng)驗(yàn)不多,設(shè)計(jì)的系統(tǒng)很少考慮到擴(kuò)展性,企業(yè)業(yè)務(wù)需求稍有變化、設(shè)計(jì)成果就要大幅度修改,甚至要推倒重來(lái)!由于飽受折磨,以致于當(dāng)他做過(guò)一些系統(tǒng)、有了一定經(jīng)驗(yàn)的時(shí)候,又特別傾向于設(shè)計(jì)一個(gè)“功能極其靈活的”系統(tǒng)、這個(gè)系統(tǒng)運(yùn)行時(shí)可以自動(dòng)適應(yīng)分析階段“考慮到的”和“沒(méi)考慮到”的各種情況。這些人整天掛在嘴邊的就是“即使將來(lái)有新的業(yè)務(wù)需求,我的設(shè)計(jì)也不用修改”個(gè)人觀點(diǎn):前一種情況情有可原,后一種思想不可取。如果系統(tǒng)設(shè)計(jì)的過(guò)于“靈活”,相應(yīng)

35、的該產(chǎn)品更像是一個(gè)“半成品”,而不是一個(gè)應(yīng)用系統(tǒng)。因?yàn)檫@樣的系統(tǒng)在使用中必然存在相當(dāng)多的配置參數(shù)、有的甚至需要二次開(kāi)發(fā)!這些都是用戶不能忍受的!若干年前我曾經(jīng)遇到一個(gè)雄心勃勃的同行,他宣稱要開(kāi)發(fā)一個(gè)適應(yīng)所有行業(yè)的MIS系統(tǒng),只要這個(gè)系統(tǒng)開(kāi)發(fā)出來(lái)、社會(huì)上所有行業(yè)都不再需要專門的管理軟件,只要在他的軟件里設(shè)置“一些”參數(shù)就可以正常使用了。他甚至還為此專門成立了一家公司。開(kāi)始的時(shí)候他說(shuō)他的軟件針對(duì)每種行業(yè)只要事先設(shè)置四五十個(gè)參數(shù)就可以了,一段時(shí)間之后參數(shù)的個(gè)數(shù)漲到三百多,再過(guò)一段時(shí)間他的軟件的功能是如此靈活、以致于針對(duì)某種行業(yè)的“實(shí)例化”版本需要專門的“二次開(kāi)發(fā)”,又過(guò)了一段時(shí)間該公司倒閉、人去樓空

36、。按照他的做法,再進(jìn)一步的抽象下去,那么最終他的產(chǎn)品就不是MIS軟件、而是PowerBuilder或者C#這類的開(kāi)發(fā)工具了。需求分析階段的工作做得不細(xì)致,指望設(shè)計(jì)階段設(shè)計(jì)出一個(gè)極其智能、其功能涵蓋了所有已想到和沒(méi)想到的需求的系統(tǒng),本身就是不切實(shí)際的。在外行人眼里看來(lái),計(jì)算機(jī)很聰明、無(wú)所不能,而事實(shí)上無(wú)論多么聰明、多么智能的軟件,它的每一步運(yùn)算都是系統(tǒng)設(shè)計(jì)人員在事先就設(shè)定好的,如果系統(tǒng)設(shè)計(jì)人員事先沒(méi)有設(shè)計(jì)和開(kāi)發(fā),計(jì)算機(jī)連“1+1”這么簡(jiǎn)單的事情也絕不會(huì)主動(dòng)去做!不會(huì)出現(xiàn)沒(méi)有設(shè)計(jì)而憑空跳出來(lái)的“功能”!如果有的話,我們稱這種功能為“BUG”。言歸正傳,在設(shè)計(jì)“組織”表的時(shí)候也不例外,在需求調(diào)研分析

37、階段就應(yīng)當(dāng)把與當(dāng)前企業(yè)有關(guān)系的所有類型的組織及其各自的屬性都調(diào)研清楚,然后才進(jìn)行下一步設(shè)計(jì)?!敖M織”表的設(shè)計(jì)與“人員”表類似,也要考慮兩大問(wèn)題 避免數(shù)據(jù)冗余存儲(chǔ) 區(qū)分屬性類別大家看到上面這個(gè)設(shè)計(jì)的第一感覺(jué)是什么?“胖子劉有沒(méi)有搞錯(cuò)?組織表就這么幾個(gè)屬性?”我猜大部分都是這個(gè)想法吧?沒(méi)錯(cuò),在我的設(shè)計(jì)中組織表就這么簡(jiǎn)單。至于大家認(rèn)為通常應(yīng)當(dāng)具有的地址、聯(lián)系人、聯(lián)系方式、各種許可證件信息等等,我都設(shè)計(jì)到其他表里了。原因在后面會(huì)詳細(xì)敘述,敬請(qǐng)關(guān)注。11、 當(dāng)事人在前兩節(jié),組織表和人員表的主鍵都是“當(dāng)事人ID”,這是什么意思呢?答案:“當(dāng)事人ID”是“當(dāng)事人”表的主鍵,“當(dāng)事人”是“組織”和“人員”的超

38、類,是二者的公共屬性。因?yàn)?,組織和人有許多屬性都是相同的,如信用等級(jí)、地址、郵編、聯(lián)系電話等;組織和人在某些場(chǎng)合都扮演了相同的角色,如公司產(chǎn)品既可以銷售給個(gè)人、也可以銷售給組織,兩者都是“客戶”。所以,利用前面提到的“主擴(kuò)展模式”,模型設(shè)計(jì)如下:在這個(gè)模型中,組織和人員采取了相同的主鍵生成規(guī)則、統(tǒng)一編號(hào),存放在“當(dāng)事人”表中,在與其他模塊聯(lián)系時(shí),簡(jiǎn)單的使用“當(dāng)事人”與之建立關(guān)系,可以減少很多設(shè)計(jì)和開(kāi)發(fā)工作上的復(fù)雜性。下文凡是提到“當(dāng)事人”的時(shí)候,表示當(dāng)時(shí)的上下文情況對(duì)“組織”和“人員”均適用。12、當(dāng)事人類別企業(yè)系統(tǒng)在記錄當(dāng)事人信息的時(shí)候,總會(huì)記錄其所屬類別。這樣可以分門別類的統(tǒng)計(jì)各類當(dāng)事人的

39、業(yè)務(wù)信息、便于經(jīng)營(yíng)數(shù)據(jù)的分析和對(duì)比,為公司經(jīng)營(yíng)戰(zhàn)略提供決策依據(jù)。關(guān)于當(dāng)事人的分類方式很多且不固定。比如按照人員年收入水平可以作如下分類1萬(wàn)元以下、1萬(wàn)-5萬(wàn)元、5萬(wàn)-10萬(wàn)元、10萬(wàn)-20萬(wàn)元、20萬(wàn)元以上;按照組織的規(guī)模可以分為特大型企業(yè)、大型企業(yè)、中型企業(yè)、小型企業(yè)和個(gè)體工商戶等。面對(duì)以上情況,有些系統(tǒng)在設(shè)計(jì)的時(shí)候,喜歡在當(dāng)事人表中增加“年收入水平”和“組織規(guī)?!眱蓚€(gè)字段,分別用于存儲(chǔ)當(dāng)事人所屬類別信息。這種設(shè)計(jì)很死板且不方便擴(kuò)展。比如企業(yè)根據(jù)業(yè)務(wù)的需要新增了一種分類方式:按照行業(yè)類別分類如下通信、IT、能源、電力、制造業(yè)、物流運(yùn)輸、政府機(jī)關(guān)、零售業(yè)等。采取這種設(shè)計(jì)必要修改表結(jié)構(gòu),增加一個(gè)

40、“行業(yè)類別”字段,相應(yīng)的程序代碼也要隨之修改。在我們這里,“當(dāng)事人”和“當(dāng)事人類型”是典型的多對(duì)多關(guān)系,由于關(guān)聯(lián)表有獨(dú)立的業(yè)務(wù)需求(企業(yè)希望保持當(dāng)事人類別變動(dòng)歷史,以便進(jìn)行更詳細(xì)的分析),所以我們采用“多對(duì)多模式”的第1種情況設(shè)計(jì)如下:為了滿足企業(yè)的這種需求,我們?cè)陉P(guān)聯(lián)表(當(dāng)事人類別表)中增加了起始和截止時(shí)間兩個(gè)屬性,記錄當(dāng)事人類別的變化歷史。例如,假設(shè)某當(dāng)事人在2004年1月1日至2004年12月31日這段時(shí)間的收入水平為“1萬(wàn)元以下”,在2005年1月1日至2005年12月31日這段時(shí)間收入水平增加到“1萬(wàn)-5萬(wàn)元”,在2006年1月1日至2006年5月22日這段時(shí)間的收入水平又下降到了“

41、1萬(wàn)元以下”,這樣當(dāng)事人類別表中可添加3條記錄。其中第1條和第3條記錄針對(duì)外鍵字段(當(dāng)事人類型ID、當(dāng)事人ID)來(lái)說(shuō)是重復(fù)的,但是外鍵字段加上起始日期后,就不再重復(fù)、可以作為整條記錄的唯一標(biāo)識(shí),所以我們?cè)谶@3個(gè)字段上創(chuàng)建了一個(gè)唯一索引。如果企業(yè)不需要變動(dòng)歷史,只關(guān)心當(dāng)前最新?tīng)顟B(tài),那么“當(dāng)事人類別”表中的起始和截止日期刪掉即可。為了簡(jiǎn)化開(kāi)發(fā),還可以刪掉“當(dāng)事人類別ID”字段,只保留“當(dāng)事人ID”和“當(dāng)事人類型ID”、并在這兩個(gè)字段上創(chuàng)建主鍵即可。“當(dāng)事人類型”表是一個(gè)“簡(jiǎn)單自聯(lián)結(jié)模式”的表,通過(guò)這種模式來(lái)記錄企業(yè)所有的當(dāng)事人分類名稱和分類項(xiàng)目,同時(shí)標(biāo)記分類名稱為非葉子(是否為葉子屬性值=fals

42、e)、分類項(xiàng)目標(biāo)記為葉子(是否為葉子屬性值=true)。按照當(dāng)前所舉的例子,“當(dāng)事人類型”表存儲(chǔ)的數(shù)據(jù)記錄為如下形式:當(dāng)事人類型ID描述排序號(hào)父ID是否為葉子1年收入水平2NULL02組織規(guī)模3NULL03行業(yè)類別4NULL041萬(wàn)元以下11151萬(wàn)-5萬(wàn)元21165萬(wàn)-10萬(wàn)元311710萬(wàn)-20萬(wàn)元411820萬(wàn)元以上5119特大型企業(yè)12110大型企業(yè)22111中型企業(yè)32112小型企業(yè)42113個(gè)體工商戶52114通信13115IT 23116能源33117電力43118制造業(yè)53119物流運(yùn)輸63120政府機(jī)關(guān)73121零售業(yè)83113、當(dāng)事人角色這一節(jié)里,我們重點(diǎn)說(shuō)一下,“角色類型

43、”、“當(dāng)事人角色類型”、“當(dāng)事人”以及“當(dāng)事人角色”這幾個(gè)概念之間的關(guān)系。其實(shí)這部分內(nèi)容在國(guó)內(nèi)的企業(yè)管理系統(tǒng)設(shè)計(jì)中多數(shù)屬于權(quán)限控制部分。通常的權(quán)限控制的設(shè)計(jì)思路都是這樣的:首先在系統(tǒng)開(kāi)發(fā)時(shí)登記注冊(cè)所有功能模塊及代碼,系統(tǒng)運(yùn)行時(shí)由系統(tǒng)管理員來(lái)維護(hù)角色列表、并為每一種角色設(shè)定可訪問(wèn)的模塊(角色和模塊相關(guān)聯(lián))。業(yè)務(wù)人員登錄系統(tǒng)后,系統(tǒng)讀取當(dāng)前用戶所屬的角色,并依據(jù)前述設(shè)定讀取這些角色能夠訪問(wèn)的所有模塊、形成一個(gè)模塊代碼列表,存儲(chǔ)為CS系統(tǒng)的全局變量或者BS系統(tǒng)的Session。每當(dāng)用戶試圖進(jìn)入一個(gè)功能模塊前,系統(tǒng)都判斷一下當(dāng)前模塊代碼是否包含在“模塊代碼列表”中。如果包含,說(shuō)明該用戶有權(quán)限,允許進(jìn)入

44、;不包含,則說(shuō)明該用戶無(wú)權(quán)操作此功能模塊。以此實(shí)現(xiàn)權(quán)限控制。關(guān)于權(quán)限控制,這里先簡(jiǎn)單提一下,在這一章的最后一節(jié)我們來(lái)詳細(xì)描述應(yīng)用系統(tǒng)的權(quán)限控制?;剡^(guò)頭來(lái)說(shuō)當(dāng)事人角色。在這一節(jié)里我們所提到的當(dāng)事人角色,主要的設(shè)計(jì)目的是為了滿足特定的業(yè)務(wù)功能需求、描述當(dāng)事人出于特定身份的情況下能夠進(jìn)行哪種業(yè)務(wù)。舉例說(shuō)明:眾所周知,“客戶”代表一種身份,具備這種身份的人或組織(我們統(tǒng)一稱之為“當(dāng)事人”,這也從另一個(gè)方面體現(xiàn)了將“人員”和“組織”概括為“當(dāng)事人”的好處)能夠付錢給企業(yè)購(gòu)買產(chǎn)品或者服務(wù);“VIP客戶”則是在“客戶”的基礎(chǔ)上更一步,能夠享受更優(yōu)惠的折扣或者更特別的服務(wù),同時(shí)也意味著它能夠給企業(yè)帶來(lái)更大的效

45、益或者更特別的社會(huì)關(guān)系?!肮?yīng)商”是另外一種身份,具備這種身份的當(dāng)事人給企業(yè)提供原材料、產(chǎn)品或服務(wù)以換取貨幣?!翱蛻簟焙汀肮?yīng)商”代表了兩種不同類型的業(yè)務(wù)工作,需要不同的工作流程,當(dāng)企業(yè)做到一定規(guī)模,客戶和供應(yīng)商的數(shù)量達(dá)到一定的數(shù)量級(jí)時(shí),企業(yè)實(shí)際上是針對(duì)各種不同的角色來(lái)開(kāi)展日常業(yè)務(wù)、而不是針對(duì)具體的某個(gè)人。例如肯德基、麥當(dāng)勞每天食客上千,它實(shí)際上就是“堂食”和“外賣”兩種角色的客戶提供服務(wù)。不可能說(shuō)張三來(lái)了提供一種服務(wù),李四來(lái)了就換一種方式服務(wù),過(guò)一會(huì)兒王五來(lái)了再為他奉上一種全新的業(yè)務(wù)!那樣的話啥也別干了,累也累死了。說(shuō)到這里,再多說(shuō)一句題外話。一段時(shí)間以來(lái)我總在想,我們中國(guó)的飲食文化源遠(yuǎn)流長(zhǎng)

46、,中餐館遍布全球,為什么就沒(méi)有一家類似肯德基、麥當(dāng)勞一樣馳名世界的飲食品牌呢?為什?五千年的時(shí)間除了打仗就是吃飯,到了今天更是發(fā)展到極致。什么花鳥蟲魚、珍禽異獸,統(tǒng)統(tǒng)都能端到飯桌上;電視里的明星訪談節(jié)目,無(wú)論嘉賓是歌星、影星、教授、體育提到“吃”,首先都是會(huì)心的一笑,然后就滔滔不絕的給你講上小半天??吹竭@幫人提到“吃”時(shí)的那副故作聰明的樣子,我就想,如果你們能把數(shù)理化、天文、地理、生物、IT、經(jīng)濟(jì)、法律、制度等行業(yè)知識(shí)隨便挑一樣熟悉到這種程度,那我們的綜合國(guó)力早就超過(guò)老美了。老美的專家在研究怎么樣去撞擊彗星,我們的“專家”在研究怎么吃果子貍,嘿嘿,這不是差距嗎?某主持人連普通話都說(shuō)不好,卻愣是

47、靠著主持一檔飲食節(jié)目,在CCTV混了個(gè)風(fēng)生水起。天天談吃、人人談吃,為什么就沒(méi)有一個(gè)享譽(yù)全球的飲食品牌?想了好久,終于讓我想到一點(diǎn)端倪。我這個(gè)答案一公布出來(lái),估計(jì)很有可能會(huì)在國(guó)內(nèi)的飲食行業(yè)造成一場(chǎng)地震。如果哪位業(yè)內(nèi)人士從我的答案受到啟發(fā),進(jìn)而引發(fā)一場(chǎng)飲食行業(yè)的大洗牌、并創(chuàng)造出一個(gè)嶄新的世界級(jí)餐飲品牌,到時(shí)候別忘了在記者招待會(huì)上注明出處胖子劉的數(shù)據(jù)庫(kù)模型設(shè)計(jì)專欄,謝謝!_答案在這里暫時(shí)不公布,留待下節(jié)再說(shuō)。嘿嘿,各位看官別忘了要經(jīng)常來(lái)這里呀。話題重新回到剛才說(shuō)的,企業(yè)上規(guī)模之后的業(yè)務(wù)工作就是針對(duì)角色開(kāi)展,而不再針對(duì)具體的客戶,我們把這種情況叫做“大企業(yè)”;沒(méi)上規(guī)模的企業(yè),業(yè)務(wù)重點(diǎn)還是放在具體的客

48、戶身上,并為單個(gè)客戶提供差異化服務(wù)或產(chǎn)品,這種情況我們稱之為“小企業(yè)”。小企業(yè)在設(shè)計(jì)當(dāng)事人角色時(shí),采用如下數(shù)據(jù)庫(kù)模型設(shè)計(jì):大家可以看到,左上角是“角色類型”表,這個(gè)表很簡(jiǎn)單,里面存儲(chǔ)若干記錄,每條記錄描述一個(gè)角色類型。角色其實(shí)也有很多種類型,包括訂單角色類型、協(xié)議角色類型、需求角色類型和當(dāng)事人角色類型等。上圖中的“當(dāng)事人角色類型”表,就是對(duì)“角色類型”表的擴(kuò)展,設(shè)計(jì)模式就采用了“主擴(kuò)展模式”。按照這種模式,還應(yīng)該有3個(gè)擴(kuò)展表,只是這3個(gè)擴(kuò)展表不是本章講述的內(nèi)容,留待后文書進(jìn)行擴(kuò)充?!爱?dāng)事人角色類型”和“當(dāng)事人”之間就是一個(gè)簡(jiǎn)單的“多對(duì)多關(guān)系”,道理很明顯,一個(gè)當(dāng)事人角色類型下面可以有多個(gè)當(dāng)事人

49、,一個(gè)當(dāng)事人也可以從屬于多個(gè)當(dāng)事人角色類型。按照4大設(shè)計(jì)模式中的第4種“多對(duì)多模式”進(jìn)行設(shè)計(jì),就得到了“當(dāng)事人角色”表。關(guān)鍵就在“當(dāng)事人角色”表。區(qū)分一個(gè)數(shù)據(jù)庫(kù)模型是為大企業(yè)而設(shè)計(jì)、還是為小企業(yè)而設(shè)計(jì),最主要的就是這個(gè)表。如果一個(gè)企業(yè)是大企業(yè),那么企業(yè)的日常業(yè)務(wù)是為角色服務(wù)的,換句話說(shuō),企業(yè)不為單個(gè)客戶提供差異化服務(wù),那么只需要“當(dāng)事人角色”表存儲(chǔ)某個(gè)當(dāng)事人所屬的角色就可以了,不必對(duì)該表再繼續(xù)細(xì)化。如果一個(gè)企業(yè)是小企業(yè),那么企業(yè)必然要對(duì)某個(gè)當(dāng)事人提供差異化服務(wù),就需要對(duì)“當(dāng)事人角色”表進(jìn)行細(xì)化。就如上圖所示那樣。通過(guò)采用“主擴(kuò)展模式”,以“當(dāng)事人角色”表為主表,設(shè)計(jì)出5個(gè)一級(jí)擴(kuò)展表,分別是“股

50、東”、“潛在客戶”、“人員角色”、“組織角色”、“客戶”,其中“人員角色”、“組織角色”、“客戶”3個(gè)角色又可以繼續(xù)擴(kuò)展出若干個(gè)二級(jí)擴(kuò)展表加以詳細(xì)描述?!叭藛T角色”的擴(kuò)展表包括“家庭成員”、“雇員”、“簽約人”、“聯(lián)絡(luò)員”,“組織角色”的擴(kuò)展表包括“供應(yīng)商”、“政府有關(guān)部門”、“合作伙伴”、“競(jìng)爭(zhēng)對(duì)手”、“組織單位”、“行業(yè)協(xié)會(huì)”、“內(nèi)部組織”、“住戶”、“分銷渠道”,“客戶”的擴(kuò)展表包括“收貨人”、“最終使用人”、“付款人”。而某些二級(jí)擴(kuò)展表還可以繼續(xù)擴(kuò)展出三級(jí)擴(kuò)展表,詳見(jiàn)設(shè)計(jì)圖,文字部分就不再描述了。這么多的擴(kuò)展表,關(guān)鍵之處在于這些擴(kuò)展表都是基于“當(dāng)事人角色”擴(kuò)展出來(lái)的。在系統(tǒng)運(yùn)行階段,需要為每個(gè)當(dāng)事人的每一種角色設(shè)置進(jìn)行

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論