?
?????說在前面
?????可能您會(huì)問,樹的系列還差第三篇沒有寫呢,怎么就又說數(shù)據(jù)庫設(shè)計(jì)了?因?yàn)槿绻麑懙谌脑挘敲淳蜕婕暗搅藱?quán)限,而權(quán)限里面又涉及到了人員,這些信息都是存放在表里面的,所以就只好先說數(shù)據(jù)庫設(shè)計(jì)了。
(說到這里,我也感覺到了,以數(shù)據(jù)庫為主的話,各方面的關(guān)聯(lián)確實(shí)比較密切,不容易分割,如果使用面向?qū)ο蟮脑挘苍S能夠更清晰的分割開來吧。)
????? 前提:這里討論的還是以數(shù)據(jù)為主的項(xiàng)目,數(shù)據(jù)都需要保存在關(guān)系型數(shù)據(jù)庫里的項(xiàng)目。
?????
????? 正文:
?????當(dāng)您接手一個(gè)項(xiàng)目后,打開SQL Server 一看,靠,五、六百個(gè)表,暈倒。打開數(shù)據(jù)庫的設(shè)計(jì)圖一開,一大堆的表擠在一起,各種連線錯(cuò)綜復(fù)雜的一團(tuán),這絕對可以和迷宮相媲美了。爬起來再暈倒。
?????您想改變這種情況,于是您選擇了面向?qū)ο螅M嫦驅(qū)ο竽軌蚪鉀Q這種亂糟糟的情況,我不知道您成功了沒有。
?????而我的思路是:數(shù)據(jù)庫的事情還是找自己人來解決吧,不要麻煩外人了。所以我想進(jìn)行一點(diǎn)小小的“改革”—— 增加幾個(gè)概念,從另一個(gè)角度來看表之間的關(guān)系。
【表關(guān)系的圖】
?
【以人員管理為例的說明】
?????表組
:就是一組表,一些相關(guān)的表組合在一起,組成一個(gè)組,共同表達(dá)一項(xiàng)事物。比如這里要說的人員管理,和人員比較密切的若干各表和在一起,組成了
人員表組
。類似的還有以后會(huì)說的組織機(jī)構(gòu)、權(quán)限管理等。
????? 表群 :一個(gè)大模塊需要的表、表組,組合在一起,就是一個(gè)表群。
?????
相關(guān)表
:有關(guān)聯(lián)的表。
?????
不相關(guān)表
:沒有直接關(guān)系的表。比如人員表和產(chǎn)品分類表。
?????主表、跟隨表、邊界表、描述表。
?????
主表
:主要的表,核心表,可以獨(dú)立存在。比如這里的人員自然信息表。是一個(gè)表組的“代表”。
?????
跟隨表
:跟著主表走的表,不能獨(dú)立存在。比如這里的聯(lián)系信息表、工作經(jīng)歷表等。由于跟隨表只記錄主表的ID,而只看ID是不知道到底是誰的信息,所以說不能獨(dú)立存在。?????
????? 邊界表 :就是承上啟下的意思,用于多對多的表的連接。也是連接兩個(gè)表組的表。比如這里的“人員——角色表”、“人員——組織結(jié)構(gòu)表”。
????? 描述表 :描述一個(gè)具體情況的表,比如省份表、學(xué)歷表、產(chǎn)品分類表等。也就是字典信息表。
????? 命名習(xí)慣 :我的命名習(xí)慣是加前綴。表名前面要加上大模塊的前綴(或者表組的前綴),后面才是表名。因?yàn)樵赟QL Server 的企業(yè)管理器里面可以按照表名來排序,這樣相關(guān)的表就會(huì)排在一起,看起來方便一些。
?????視圖名的前面要加上視圖的標(biāo)識(前綴),我習(xí)慣加上“V_”來和表名相區(qū)分。
?????存儲過程的前面最好也加上一個(gè)存儲過程的標(biāo)識(前綴),我習(xí)慣加上“Proc_”。
????? 注意: 存儲過程最好不要使用“sp_”,“xp_”,“dt_”開頭。因?yàn)橄到y(tǒng)提供的存儲過程和擴(kuò)展存儲過程都是以這些開頭的,在尋找存儲過程的時(shí)候,如果是這些開頭的話,那么會(huì)先到系統(tǒng)的存儲過程里面去查找。另外,加這樣的前綴也不容易和系統(tǒng)的存儲過程相區(qū)分。
?
?????這樣我們在總體設(shè)計(jì)的時(shí)候,只需要關(guān)注的“表組”(其實(shí)也就是“主表”)和表組之間的關(guān)系就可以了,描述表、邊界表都可以忽略,而跟隨表大多數(shù)也可忽略了,在需要的時(shí)候看一下就可以了。主表是一個(gè)表組的“代表”,所以一個(gè)表組里面只能有一個(gè)主表。
?????這樣在打開設(shè)計(jì)圖的時(shí)候, 映入眼簾的就不是一大堆表的,而是幾個(gè)(或者十幾個(gè))表組 。如果是很大的項(xiàng)目的話,那么看到的是幾個(gè)表群。只有當(dāng)需要關(guān)注細(xì)節(jié)的時(shí)候才去看一個(gè)表組里的有哪些表,再進(jìn)一步看細(xì)節(jié)的話,才去看表里面的字段。
(雖然現(xiàn)在面向?qū)ο蠛芰餍校俏疫€是習(xí)慣先設(shè)計(jì)數(shù)據(jù)庫,以數(shù)據(jù)庫為中心,圍繞數(shù)據(jù)庫轉(zhuǎn)。當(dāng)然這樣的話,就給自己做了一個(gè)限制,只能夠做那些需要數(shù)據(jù)庫的項(xiàng)目,不過這樣的項(xiàng)目也有很多呀,夠我做的了,呵呵。)
?
?????很多項(xiàng)目都需要有一個(gè)人員管理的模塊,這個(gè)可以說是一個(gè)基礎(chǔ)吧,無論是OA、CMS、ERP、企業(yè)定制等都是需要的,網(wǎng)站里也會(huì)有一個(gè)會(huì)員系統(tǒng)吧。所以我就從這個(gè)比較基礎(chǔ)的開始吧。(請看上面的圖)
?????人員管理,首先要有姓名、性別、出生日期等信息的表,我們把這個(gè)表叫做“人員自然信息”,這里的字段的特點(diǎn)就是“唯一”,一對一的,自然里的,基礎(chǔ)的,基本的就放在這里面。這個(gè)也就是人員表組的主表。
?????有了自然信息后,需要有一個(gè)聯(lián)系信息,這個(gè)表也是一對一的。固定電話、手機(jī)、QQ、MSN、Email等。這是一個(gè)跟隨表,跟著主表(人員自然信息)走的表。
?????然后就是學(xué)習(xí)經(jīng)歷、工作經(jīng)歷等一對多的表。這些也都是跟隨表。
?????最后是登陸賬號。而“人員——角色表”、“人員——組織結(jié)構(gòu)表”,這個(gè)就是“邊界表”,就是聯(lián)系多對多的一個(gè)表,他負(fù)責(zé)“聯(lián)系”兩方面的表。
?????這么多的表如何來關(guān)聯(lián)呢,很簡單都只用EmpID來關(guān)聯(lián)。
?
?????您可能會(huì)問如果一個(gè)人有兩個(gè)手機(jī)號碼,而表里面只有一個(gè)手機(jī)號的字段,那么要如何解決方式呢?有兩種方式:一是不管有多少手機(jī)號,都放在一個(gè)字段里面,用逗號來分割就可以了。另一個(gè)就是增加一個(gè)字段,分別叫做“手機(jī)號1”、“手機(jī)號2”。您可能會(huì)說這種方法都不合理,應(yīng)該把聯(lián)系方式表改成一對多的形式。我覺得改成一對多就更麻煩了。
?
總結(jié):
?????一對一、一對多、多對多,主從表,這樣的分析完全是由關(guān)系型數(shù)據(jù)庫本身的特點(diǎn)來做的,一點(diǎn)業(yè)務(wù)邏輯都沒有考慮進(jìn)去。
?????而我的上面的方法是把業(yè)務(wù)邏輯“摻和”進(jìn)來了,從業(yè)務(wù)邏輯的角度來分析數(shù)據(jù)結(jié)構(gòu),做劃分、做分組。
?????我想,大家或多或少都是這么做的吧,我這里只是把這種方式給“挑明了”。歡迎大家的看法。
?
?
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
