程序員應(yīng)知應(yīng)會(huì)之?dāng)?shù)據(jù)庫(kù)設(shè)計(jì)的那些事兒
對(duì)于很多應(yīng)用系統(tǒng)來(lái)說(shuō),數(shù)據(jù)庫(kù)結(jié)構(gòu)是應(yīng)用運(yùn)行的基礎(chǔ),這就好像房子的地基一樣,地基不牢,地動(dòng)山搖。當(dāng)應(yīng)用程序建立之后,再改數(shù)據(jù)庫(kù)表結(jié)構(gòu),就會(huì)導(dǎo)致很多不必要的冗余工作量。
然而很多開(kāi)發(fā)團(tuán)隊(duì)卻非常不重視這個(gè)過(guò)程,數(shù)據(jù)庫(kù)及接口的設(shè)計(jì)極其隨意。甚至還有一些大神認(rèn)為,數(shù)據(jù)庫(kù)和接口的改變是避免不了的事情,做項(xiàng)目就是做完之后試試看,不行再改??梢哉f(shuō),從方法論上就存在問(wèn)題,就好像修路一樣,修好了挖,挖好了修,反反復(fù)復(fù),來(lái)來(lái)回回,開(kāi)發(fā)者和用戶都苦不堪言。
說(shuō)了這么多,下面我們來(lái)正式介紹一下數(shù)據(jù)庫(kù)設(shè)計(jì)的整個(gè)流程。
數(shù)據(jù)庫(kù)設(shè)計(jì)的基本步驟包括以下幾個(gè)方面:
一、需求分析階段
需求分析是整個(gè)數(shù)據(jù)庫(kù)設(shè)計(jì)的基礎(chǔ)和核心,需求分析的結(jié)果是否能準(zhǔn)確地反映用戶的實(shí)際需求,將直接影響到后面各個(gè)階段的設(shè)計(jì),并影響到設(shè)計(jì)結(jié)果是否合理、實(shí)用。這一階段要收集和分析用戶對(duì)系統(tǒng)的信息需求和處理需求,以及后續(xù)可以存在的擴(kuò)展功能,從而得到設(shè)計(jì)系統(tǒng)所必需的信息,建立系統(tǒng)的需求說(shuō)明文檔。
在很多項(xiàng)目中,存在的最大問(wèn)題就是開(kāi)發(fā)團(tuán)隊(duì)對(duì)于項(xiàng)目,沒(méi)有從日常使用者的角度去考慮問(wèn)題,對(duì)項(xiàng)目所涉及的業(yè)務(wù)流程不熟悉,完全根據(jù)用戶的描述來(lái)被動(dòng)設(shè)計(jì)。而往往不懂技術(shù)的用戶描述是不完備的,最終導(dǎo)致完全的項(xiàng)目在用戶試用之后發(fā)現(xiàn)很多問(wèn)題,導(dǎo)致工作量的大幅增加。
因此,在做一個(gè)項(xiàng)目之前,完全了解項(xiàng)目用戶的業(yè)務(wù)流程,是對(duì)于開(kāi)發(fā)團(tuán)隊(duì)素質(zhì)的一個(gè)重要考驗(yàn)。

二、概念設(shè)計(jì)階段
概念設(shè)計(jì)是數(shù)據(jù)庫(kù)設(shè)計(jì)的關(guān)鍵所在,這一階段通過(guò)對(duì)用戶需求進(jìn)行綜合、歸納與抽象,形成一個(gè)獨(dú)立于具體DBMS的概念模型,并且用E-R圖表示出來(lái)。
概念模型也稱為信息模型,用于信息世界的建模,實(shí)現(xiàn)了由現(xiàn)實(shí)世界到信息世界的第一層抽象。
信息世界涉及的主要概念有:
1、實(shí)體(Entity):現(xiàn)實(shí)世界中存在的可以相互區(qū)分的事物或概念,如一個(gè)學(xué)生
2、實(shí)體集(Entity Set):同一類實(shí)體的集合,如全體學(xué)生
3、屬性(Attribute):實(shí)體所具有的特征,如學(xué)生姓名、性別
4、碼/鍵(Key):唯一標(biāo)識(shí)實(shí)體的屬性集,例如學(xué)生的學(xué)號(hào)
5、聯(lián)系(Relationship):實(shí)體集之間的對(duì)應(yīng)關(guān)系,如一個(gè)教師教多個(gè)學(xué)生、多個(gè)學(xué)生選多門課
概念模型最常用的表示方法是P.P.S.Chen在1976年提出的實(shí)體-聯(lián)系(Entity-Relationship)模型,簡(jiǎn)稱E-R模型或E-R圖

三、邏輯結(jié)構(gòu)設(shè)計(jì)階段
這一階段在概念模型的基礎(chǔ)之上,根據(jù)轉(zhuǎn)換規(guī)則導(dǎo)出一種DBMS支持的邏輯數(shù)據(jù)庫(kù)模型,比如說(shuō)目前最常用的關(guān)系型數(shù)據(jù)庫(kù),該模型應(yīng)滿足數(shù)據(jù)庫(kù)存取、一致性及運(yùn)行等方面的用戶需求,并且在一定程度上,對(duì)些模型進(jìn)行優(yōu)化。
例如,一個(gè)一對(duì)一的E-R模型,可以建立一個(gè)單表,比如說(shuō)班級(jí),對(duì)班主任,是一對(duì)一的關(guān)系,那么只需要一張表。而一個(gè)一對(duì)多的關(guān)系,則需要兩張表,比如說(shuō)班級(jí)對(duì)學(xué)生,就需要把班級(jí)設(shè)置為一張表,而將班級(jí)號(hào)作為學(xué)生表里的一個(gè)外鍵。多對(duì)多的關(guān)系,就需要設(shè)計(jì)三張表,比如說(shuō)學(xué)生和課程,就需要學(xué)生、課程、學(xué)生選的課程三張表來(lái)反映三者之間的關(guān)系。
四、物理結(jié)構(gòu)設(shè)計(jì)階段
為邏輯數(shù)據(jù)模型選取一個(gè)最適合應(yīng)用環(huán)境的物理結(jié)構(gòu),利用已經(jīng)確定的邏輯結(jié)構(gòu)的結(jié)果以及DBMS提供的方法、技術(shù),以設(shè)計(jì)出高效可實(shí)現(xiàn)的數(shù)據(jù)庫(kù)結(jié)構(gòu)。但一般情況下,在關(guān)系型數(shù)據(jù)庫(kù)中,數(shù)據(jù)的存取對(duì)用戶是透明的,所以對(duì)物理設(shè)計(jì)考慮會(huì)相對(duì)少一點(diǎn)。尤其是現(xiàn)在有了諸如Spring Data Jpa之類的持久層框架之后,開(kāi)發(fā)者的精力可以主要放在實(shí)體之間的關(guān)系上面。
五、數(shù)據(jù)庫(kù)實(shí)施階段
根據(jù)邏輯設(shè)計(jì)和物理設(shè)計(jì)的結(jié)果建立數(shù)據(jù)庫(kù),編寫(xiě)與調(diào)試應(yīng)用程序,將數(shù)據(jù)錄入到數(shù)據(jù)庫(kù)中,同時(shí)進(jìn)行數(shù)據(jù)庫(kù)系統(tǒng)的試運(yùn)行。
以上就是數(shù)據(jù)庫(kù)設(shè)計(jì)的幾個(gè)重要步驟,在實(shí)際操作中,最重要的是正確劃分實(shí)體和實(shí)體間的對(duì)應(yīng)關(guān)系,而這也是優(yōu)秀開(kāi)發(fā)者與普通開(kāi)發(fā)者最大的區(qū)別之一。往往優(yōu)秀的開(kāi)發(fā)者可以看透一個(gè)項(xiàng)目之間存在的實(shí)體,和實(shí)體間的對(duì)應(yīng)關(guān)系,從而方便快捷地確定項(xiàng)目的數(shù)據(jù)庫(kù)基礎(chǔ)。而普通或者低劣的開(kāi)發(fā)人員,則很有可能將實(shí)體關(guān)系搞得一團(tuán)糟,最終在實(shí)際應(yīng)用中才發(fā)現(xiàn)表設(shè)計(jì)存在較大的缺陷,最終不得不耗費(fèi)大量的工作量來(lái)解決這個(gè)問(wèn)題。
就好像地心說(shuō)時(shí)代,天文學(xué)家用本輪均輪,等大小齒輪咬合模擬的方式來(lái)推演太陽(yáng)、月亮和各行星的軌道。一開(kāi)始只有地球、太陽(yáng)、月亮的時(shí)候還很好擬合,但是隨著多顆行星的發(fā)現(xiàn),到了哥白尼時(shí)代,需要模擬的齒輪已經(jīng)達(dá)到了上百個(gè),導(dǎo)致人們苦不堪言。但是,改成以太陽(yáng)為中心的話,那么一切就清爽直觀了。

數(shù)據(jù)庫(kù)設(shè)計(jì)也是如此,如果實(shí)體之間的關(guān)系沒(méi)有理順,那么最終將嚴(yán)重影響項(xiàng)目的開(kāi)發(fā)質(zhì)量。讀者們,你們被實(shí)體關(guān)系設(shè)計(jì)得很糟糕的數(shù)據(jù)庫(kù)結(jié)構(gòu)坑過(guò)嗎?如果被坑過(guò),歡迎說(shuō)出你的故事哦。















 
 
 






 
 
 
 