程序員應知應會之數(shù)據(jù)庫設計的那些事兒
對于很多應用系統(tǒng)來說,數(shù)據(jù)庫結(jié)構(gòu)是應用運行的基礎,這就好像房子的地基一樣,地基不牢,地動山搖。當應用程序建立之后,再改數(shù)據(jù)庫表結(jié)構(gòu),就會導致很多不必要的冗余工作量。
然而很多開發(fā)團隊卻非常不重視這個過程,數(shù)據(jù)庫及接口的設計極其隨意。甚至還有一些大神認為,數(shù)據(jù)庫和接口的改變是避免不了的事情,做項目就是做完之后試試看,不行再改??梢哉f,從方法論上就存在問題,就好像修路一樣,修好了挖,挖好了修,反反復復,來來回回,開發(fā)者和用戶都苦不堪言。
說了這么多,下面我們來正式介紹一下數(shù)據(jù)庫設計的整個流程。
數(shù)據(jù)庫設計的基本步驟包括以下幾個方面:
一、需求分析階段
需求分析是整個數(shù)據(jù)庫設計的基礎和核心,需求分析的結(jié)果是否能準確地反映用戶的實際需求,將直接影響到后面各個階段的設計,并影響到設計結(jié)果是否合理、實用。這一階段要收集和分析用戶對系統(tǒng)的信息需求和處理需求,以及后續(xù)可以存在的擴展功能,從而得到設計系統(tǒng)所必需的信息,建立系統(tǒng)的需求說明文檔。
在很多項目中,存在的最大問題就是開發(fā)團隊對于項目,沒有從日常使用者的角度去考慮問題,對項目所涉及的業(yè)務流程不熟悉,完全根據(jù)用戶的描述來被動設計。而往往不懂技術(shù)的用戶描述是不完備的,最終導致完全的項目在用戶試用之后發(fā)現(xiàn)很多問題,導致工作量的大幅增加。
因此,在做一個項目之前,完全了解項目用戶的業(yè)務流程,是對于開發(fā)團隊素質(zhì)的一個重要考驗。
二、概念設計階段
概念設計是數(shù)據(jù)庫設計的關鍵所在,這一階段通過對用戶需求進行綜合、歸納與抽象,形成一個獨立于具體DBMS的概念模型,并且用E-R圖表示出來。
概念模型也稱為信息模型,用于信息世界的建模,實現(xiàn)了由現(xiàn)實世界到信息世界的第一層抽象。
信息世界涉及的主要概念有:
1、實體(Entity):現(xiàn)實世界中存在的可以相互區(qū)分的事物或概念,如一個學生
2、實體集(Entity Set):同一類實體的集合,如全體學生
3、屬性(Attribute):實體所具有的特征,如學生姓名、性別
4、碼/鍵(Key):唯一標識實體的屬性集,例如學生的學號
5、聯(lián)系(Relationship):實體集之間的對應關系,如一個教師教多個學生、多個學生選多門課
概念模型最常用的表示方法是P.P.S.Chen在1976年提出的實體-聯(lián)系(Entity-Relationship)模型,簡稱E-R模型或E-R圖
三、邏輯結(jié)構(gòu)設計階段
這一階段在概念模型的基礎之上,根據(jù)轉(zhuǎn)換規(guī)則導出一種DBMS支持的邏輯數(shù)據(jù)庫模型,比如說目前最常用的關系型數(shù)據(jù)庫,該模型應滿足數(shù)據(jù)庫存取、一致性及運行等方面的用戶需求,并且在一定程度上,對些模型進行優(yōu)化。
例如,一個一對一的E-R模型,可以建立一個單表,比如說班級,對班主任,是一對一的關系,那么只需要一張表。而一個一對多的關系,則需要兩張表,比如說班級對學生,就需要把班級設置為一張表,而將班級號作為學生表里的一個外鍵。多對多的關系,就需要設計三張表,比如說學生和課程,就需要學生、課程、學生選的課程三張表來反映三者之間的關系。
四、物理結(jié)構(gòu)設計階段
為邏輯數(shù)據(jù)模型選取一個最適合應用環(huán)境的物理結(jié)構(gòu),利用已經(jīng)確定的邏輯結(jié)構(gòu)的結(jié)果以及DBMS提供的方法、技術(shù),以設計出高效可實現(xiàn)的數(shù)據(jù)庫結(jié)構(gòu)。但一般情況下,在關系型數(shù)據(jù)庫中,數(shù)據(jù)的存取對用戶是透明的,所以對物理設計考慮會相對少一點。尤其是現(xiàn)在有了諸如Spring Data Jpa之類的持久層框架之后,開發(fā)者的精力可以主要放在實體之間的關系上面。
五、數(shù)據(jù)庫實施階段
根據(jù)邏輯設計和物理設計的結(jié)果建立數(shù)據(jù)庫,編寫與調(diào)試應用程序,將數(shù)據(jù)錄入到數(shù)據(jù)庫中,同時進行數(shù)據(jù)庫系統(tǒng)的試運行。
以上就是數(shù)據(jù)庫設計的幾個重要步驟,在實際操作中,最重要的是正確劃分實體和實體間的對應關系,而這也是優(yōu)秀開發(fā)者與普通開發(fā)者最大的區(qū)別之一。往往優(yōu)秀的開發(fā)者可以看透一個項目之間存在的實體,和實體間的對應關系,從而方便快捷地確定項目的數(shù)據(jù)庫基礎。而普通或者低劣的開發(fā)人員,則很有可能將實體關系搞得一團糟,最終在實際應用中才發(fā)現(xiàn)表設計存在較大的缺陷,最終不得不耗費大量的工作量來解決這個問題。
就好像地心說時代,天文學家用本輪均輪,等大小齒輪咬合模擬的方式來推演太陽、月亮和各行星的軌道。一開始只有地球、太陽、月亮的時候還很好擬合,但是隨著多顆行星的發(fā)現(xiàn),到了哥白尼時代,需要模擬的齒輪已經(jīng)達到了上百個,導致人們苦不堪言。但是,改成以太陽為中心的話,那么一切就清爽直觀了。
數(shù)據(jù)庫設計也是如此,如果實體之間的關系沒有理順,那么最終將嚴重影響項目的開發(fā)質(zhì)量。讀者們,你們被實體關系設計得很糟糕的數(shù)據(jù)庫結(jié)構(gòu)坑過嗎?如果被坑過,歡迎說出你的故事哦。