數(shù)據(jù)設(shè)計(jì)模式--原創(chuàng):胖子劉(http://blog.csdn.net/liu7537)
原創(chuàng):胖子劉(轉(zhuǎn)載請(qǐng)注明出處及作者,,謝謝。) 什么是模式,?簡(jiǎn)單說來,,模式類似于定式,就是遇到反復(fù)出現(xià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ì)出來的,?!兑讉?#183;系辭》曰:“易有太極,是生兩儀,,兩儀生四象,,四象生八卦。”老子在《道德經(jīng)》中也說:“道生一,,一生二,,二生三,三生萬物,。”
設(shè)計(jì)模式不必多,,只要掌握其中關(guān)鍵的幾個(gè),再結(jié)合實(shí)際的業(yè)務(wù)需求,,一個(gè)完整的數(shù)據(jù)庫(kù)模型就可以推導(dǎo)出來,。
下面讓我們來逐一介紹這四種主要設(shè)計(jì)模式——
(一)主擴(kuò)展模式
主擴(kuò)展模式,通常用來將幾個(gè)相似的對(duì)象的共有屬性抽取出來,,形成一個(gè)“公共屬性表”,;其余屬性則分別形成“專有屬性表”,且“公共屬性表”與“專有屬性表”都是“一對(duì)一”的關(guān)系,。
“專有屬性表”可以看作是對(duì)“公共屬性表”的擴(kuò)展,兩者合在一起就是對(duì)一個(gè)特定對(duì)象的完整描述,,故此得名“主擴(kuò)展模式”,。
舉例如下(注:這個(gè)例子已經(jīng)作了相當(dāng)程度的簡(jiǎn)化,僅僅是用來幫助大家理解“主擴(kuò)展模式”這個(gè)概念來使用的,,請(qǐng)大家注意),。
假設(shè)某公司包括如下6種類型的工作人員:采購(gòu)員、營(yíng)銷員、庫(kù)房管理員,、收銀員,、財(cái)務(wù)人員和咨詢專家,采用主擴(kuò)展模式進(jìn)行設(shè)計(jì),,如下圖所示,。
無論哪種類型的工作人員,都要訪問公司的辦公軟件,,所以都有“登陸代碼”和“登錄密碼”,;并且作為一般屬性,“姓名”,、“性別”,、“身份證號(hào)”、“入職時(shí)間”,、“離職時(shí)間”等屬性,,都與個(gè)人所從事的工作崗位無關(guān),所以可以抽取出來作為公共屬性,,創(chuàng)建“公司員工”表,。
很顯然,公司委派員工采購(gòu)哪些商品是“采購(gòu)員”的專有屬性,,這是由公司的實(shí)際業(yè)務(wù)特點(diǎn)決定的,。換句話說,公司不可能把采購(gòu)任務(wù)放到“營(yíng)銷員”身上,,也不可能放到“庫(kù)房管理員”身上,,“采購(gòu)商品”屬性就是“采購(gòu)員”的專用屬性。
“采購(gòu)員”表的主鍵與“公司員工”表的主鍵是相同的,,包括字段名稱和字段的實(shí)際取值,;“采購(gòu)員”表的主鍵同時(shí)是“公司員工”表主鍵的外鍵。在PDM圖里可以看到“采購(gòu)員”表中的“員工ID”字段后面有一個(gè)“<pk,fk>”標(biāo)記,,這個(gè)標(biāo)記就說明“員工ID”字段既是“采購(gòu)員”表的主鍵,,同時(shí)也是該表的外鍵。
“公司員工”表是主表,,“采購(gòu)員”表是擴(kuò)展表,,二者是“一對(duì)一”的關(guān)系,兩個(gè)表的字段合起來就是對(duì)“采購(gòu)員”這個(gè)對(duì)象的完整說明,。同理,,“公司員工”表和其他5個(gè)表之間也都分別構(gòu)成了“一對(duì)一”的關(guān)系。
對(duì)于主表來說,,從表既可以沒有記錄,,也可以有唯一一條記錄來對(duì)主表進(jìn)行擴(kuò)展說明,,這就是“主擴(kuò)展模式”。
(二)主從模式
主從模式,,是數(shù)據(jù)庫(kù)設(shè)計(jì)模式中最常見,、也是大家日常設(shè)計(jì)工作中用的最多的一種模式,它描述了兩個(gè)表之間的主從關(guān)系,,是典型的“一對(duì)多”關(guān)系,。
舉例如下(注:這個(gè)例子已經(jīng)作了相當(dāng)程度的簡(jiǎn)化,僅僅是用來幫助大家理解“主從模式”這個(gè)概念來使用的,,請(qǐng)大家注意),。
比如論壇程序。一個(gè)論壇通常都會(huì)有若干“板塊”,,在每個(gè)板塊里面,,大家可以發(fā)布很多的新帖。這時(shí)候“板塊”和“發(fā)帖”就是主從模式,,主表是“板塊”,,從表是“發(fā)帖”,二者是“一對(duì)多”的關(guān)系,。
多個(gè)潛水員也可以對(duì)感興趣的同一份發(fā)帖進(jìn)行回復(fù),,以表達(dá)各自的意見,這時(shí)候,,一個(gè)“發(fā)帖”就有了多份“回復(fù)”,,又構(gòu)成了一個(gè)“主從模式”。
(三)名值模式
名值模式,,通常用來描述在系統(tǒng)設(shè)計(jì)階段不能完全確定屬性的對(duì)象,,這些對(duì)象的屬性在系統(tǒng)運(yùn)行時(shí)會(huì)有很大的變更,或者是多個(gè)對(duì)象之間的屬性存在很大的差異,。
舉例如下(注:這個(gè)例子已經(jīng)作了相當(dāng)程度的簡(jiǎn)化,,僅僅是用來幫助大家理解“名值模式”這個(gè)概念來使用的,請(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è)置,。無論產(chǎn)品的其他屬性需求發(fā)生怎樣的變化,、怎樣增刪改屬性,都可以在運(yùn)行時(shí)實(shí)現(xiàn),,而不必修改數(shù)據(jù)庫(kù)設(shè)計(jì)和程序代碼,。(見下圖)
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ì),。(見下圖)
(四)多對(duì)多模式
多對(duì)多模式,,也是比較常見的一種數(shù)據(jù)庫(kù)設(shè)計(jì)模式,它所描述的兩個(gè)對(duì)象不分主次,、地位對(duì)等,、互為一對(duì)多的關(guān)系。對(duì)于A表來說,,一條記錄對(duì)應(yīng)著B表的多條記錄,,反過來對(duì)于B表來說,一條記錄也對(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)化,,僅僅是用來幫助大家理解“多對(duì)多模式”這個(gè)概念來使用的,,請(qǐng)大家注意)。
比如網(wǎng)上書店,,通常都會(huì)有“書目信息”和“批發(fā)單”,。一條“書目信息”面對(duì)不同的購(gòu)買客戶、可以存在多張“批發(fā)單”,,反過來,,一張“批發(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)化),,這樣在將來即使修改了“書目信息”表中的屬性,也不會(huì)影響跟客戶核對(duì)批發(fā)單明細(xì),,不會(huì)影響未來的財(cái)務(wù)結(jié)算業(yè)務(wù),。
2. 關(guān)聯(lián)表沒有獨(dú)立的業(yè)務(wù)處理需求
舉例如下(注:這個(gè)例子已經(jīng)作了相當(dāng)程度的簡(jiǎn)化,僅僅是用來幫助大家理解“多對(duì)多模式”這個(gè)概念來使用的,,請(qǐng)大家注意),。
比如用戶與角色之間的關(guān)系,一般系統(tǒng)在做權(quán)限控制方面的程序時(shí)都會(huì)涉及到“系統(tǒng)用戶表”和“系統(tǒng)角色表”,。一個(gè)用戶可以從屬于多個(gè)角色,,反過來一個(gè)角色里面也可以包含多個(gè)用戶,兩者也是典型的“多對(duì)多關(guān)系”,。其中的關(guān)聯(lián)表“用戶角色關(guān)聯(lián)表”在絕大多數(shù)情況下都是僅僅用作表示用戶與角色之間的關(guān)聯(lián)關(guān)系,,本身不具備獨(dú)立的業(yè)務(wù)處理需求,所以也就沒有什么特殊的屬性,。
(五)使用上述四種模式的一般原則 1. 什么時(shí)候用“主擴(kuò)展模式”,? 對(duì)象的個(gè)數(shù)不多;各個(gè)對(duì)象之間的屬性有一定差別,;各個(gè)對(duì)象的屬性在數(shù)據(jù)庫(kù)設(shè)計(jì)階段能夠完全確定,;各個(gè)擴(kuò)展對(duì)象有獨(dú)立的、相對(duì)比較復(fù)雜的業(yè)務(wù)處理需求,,此時(shí)用“主擴(kuò)展模式”,。將各個(gè)對(duì)象的共有屬性抽取出來設(shè)計(jì)為“主表”,,將各個(gè)對(duì)象的剩余屬性分別設(shè)計(jì)為相應(yīng)的“擴(kuò)展表”,“主表”與各個(gè)“擴(kuò)展表”分別建立一對(duì)一的關(guān)系,。
2. 什么時(shí)候用“主從模式”,?
對(duì)象的個(gè)數(shù)較多且不固定;各個(gè)對(duì)象之間的屬性幾乎沒有差異,;對(duì)象的屬性在數(shù)據(jù)庫(kù)設(shè)計(jì)階段能夠完全確定;各個(gè)對(duì)象沒有獨(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ì)象沒有相互獨(dú)立的業(yè)務(wù)處理需求,,此時(shí)用“名值模式”,。
4. 什么時(shí)候用“多對(duì)多模式”?
兩個(gè)對(duì)象之間互為一對(duì)多關(guān)系,,則使用“多對(duì)多模式”,。
|
|