? ? 一般情況下,可以從兩個方面來判斷數(shù)據(jù)庫是否設(shè)計的比較規(guī)范,1是看是否擁有大量的窄表,2是寬表的數(shù)量是否足夠的少,如果符合這兩個條件,則可以說明這個數(shù)據(jù)庫的設(shè)計水平還是比較高的,當然這是兩個表面上的指標,為了達到數(shù)據(jù)庫設(shè)計規(guī)范的要求,一般來說,需要符合以下幾個要求。
?? ?1.? 表中要避免可為空的列:
?? ?雖然表中允許有空列,但是,空字段是一種比較特殊的數(shù)據(jù)類型,數(shù)據(jù)庫在處理的時候 需要進行特殊的處理,這樣的話,就會增加數(shù)據(jù)庫處理記錄的復雜性,當表中要比較多的空字段時,在同等條件下,數(shù)據(jù)庫處理的性能會降低許多,所以,雖然在數(shù)據(jù)庫表的設(shè)計的時候,允許表中具有空字段,但是,我們應(yīng)該盡量避免,若的確需要的話,可以通過一些折中的方式,來處理這些空字段,讓他對數(shù)據(jù)庫性的影響降到最低。
?? ?通過設(shè)置默認值的形式,來避免空字段的產(chǎn)生,如一個商城VIP系統(tǒng),有的時候身份證號字段可以為空,因為不是每個人都能記得住身份證號的,辦理業(yè)務(wù)時身份證沒帶身上不能及時提供,因此身份證號碼字段可以為空,滿足這些特殊需求,但是,在數(shù)據(jù)庫設(shè)計的時候,就要做一些處理了,如果用戶沒有輸入的時候,把這個字段的val默認值改為0/1,這樣能避免空字段的產(chǎn)生。若是一張表中,允許為空的列比較多,接近全部列數(shù)的三分之一,而且,這些列在大部分情況下,都是可有可無的,如果數(shù)據(jù)庫管理員遇到這樣的狀況,建議另外建立一張副表,以保存這些列,然后通過關(guān)鍵字把主表和副表關(guān)聯(lián)起來,把數(shù)據(jù)存儲在兩個獨立的表中是的主表的設(shè)計更為簡單,同時也能夠滿足存儲空值的信息需要。
?? ?2. 表不應(yīng)該要有重復的Key或val:
?? ?如果現(xiàn)在有一個進銷存系統(tǒng),這個系統(tǒng)中有一張成品基本信息表。這個產(chǎn)品開發(fā)有時間可以是一個人完成。
?? ?如進銷存管理中,還需要對客戶的聯(lián)系人進行管理,有時候,企業(yè)可能只知道客戶一個采購員的姓名,但是必要情況下,企業(yè)需要對客戶的采購人員,倉庫人員,財務(wù)人員共同進行管理,因為在訂單上,可能需要填入采購代表的名字,在出貨單上,則需要填入倉庫管理人員的名字等等。
?? ?為解決這個問題,有多個實現(xiàn)方式,但是,如果設(shè)計不會理的話,就會導致重復的val和key,如我們也可以這么設(shè)計。吧客戶信息,聯(lián)系人都放入同一張表中,為了解決多個聯(lián)系人問題,可以設(shè)置第一個聯(lián)系人 第一聯(lián)系人電話 ,第二聯(lián)系人 第二聯(lián)系人電話等等,如果更多就會有更多字段加入。
?? ?可是如果這么設(shè)計會有一系列問題,如客戶的采購員流動性比較大,一年有七八個采購員,這樣的話在用到這樣的設(shè)計就顯然不合理了。所以,在數(shù)據(jù)庫設(shè)計的時候要盡量避免這種重復的key或者val的產(chǎn)生,如果用到這種情況,就需要改變一下策略,如:吧客戶聯(lián)系人另外設(shè)置一張表,然后通過客戶ID把供應(yīng)商信息表跟客戶聯(lián)系人信息連接起來,就是說盡量把重復的key放至到一張獨立的表中進行管理,然后通過視圖或者其他手段把這些獨立的表關(guān)聯(lián)起來
?? ?3. 表中記錄應(yīng)該有一個標識符:
?? ?在數(shù)據(jù)庫表設(shè)計的時候,數(shù)據(jù)庫管理員就應(yīng)有個好習慣,用一個ID號碼 標識進行記錄,而不是通過名字 編號等字段對記錄進行區(qū)分,每個表都應(yīng)該有一個id任何兩個記錄都不能共用一個id值 另外 這個id值最好有數(shù)據(jù)庫來進行自動管理,而不要吧這個任務(wù)給前臺應(yīng)用程序,否則 很容易產(chǎn)生id值不統(tǒng)一的情況
?? ?4. 數(shù)據(jù)庫對象要有統(tǒng)一的前綴名:
?? ?一個比較復雜的應(yīng)用系統(tǒng),其對應(yīng)的數(shù)據(jù)表往往數(shù)以千計,鑰匙讓數(shù)據(jù)庫管理員看到對象名就了解這個數(shù)據(jù)庫對象所起的作用 這樣比較困難,而且在數(shù)據(jù)庫對象引用的時候,數(shù)據(jù)庫管理員也會為不能迅速找到數(shù)據(jù)對象對發(fā)愁。為此在開發(fā)數(shù)據(jù)庫之前,最好花時間去制定一個數(shù)據(jù)庫的對象的前綴命名規(guī)范,
?? ?如在設(shè)計數(shù)據(jù)庫時和前臺應(yīng)用程序協(xié)商,確定合理的命名規(guī)范,如和物料管理模塊相關(guān)的表可以用M為前綴,而訂單管理相關(guān)的就用C作為前綴,具體采用什么前綴就根據(jù)用戶的愛好,但是注意 這個命名規(guī)范應(yīng)該在數(shù)據(jù)庫管理員和前臺應(yīng)用程序開發(fā)者之間達成共識,并且嚴格暗戰(zhàn)這個命名規(guī)范來定義對象名。
?? ?其次 表 視圖 函數(shù)等較好也要有統(tǒng)一的前綴,如視圖可以用V為前綴 函數(shù)用F為前綴 這樣數(shù)據(jù)庫管理員無論在日常管理還是對象引用都能在最短的時間找到自己需要的對象。
?? ?5. 盡量只存儲單一實體類型數(shù)據(jù):
?? ?這里實體類型和數(shù)據(jù)類型不是一回事,要注意區(qū)分,這里講的實體類型是指所需要描述對象的本身 舉個例子 如現(xiàn)在有一個圖書館系統(tǒng),有圖書基本信息,作者信息兩個實體對象,若用戶要吧這兩個實體對象信息放在同一張表中也可以,如果把表設(shè)計成圖書的名字,作者等等如果這樣設(shè)計的話,回給后續(xù)的維護帶來麻煩
?? ?如果后續(xù)有書出版時,就需要為每次出版的圖書增加作者信息,這無疑會增加額外的存儲空間,也會增加記錄的長度,而且作者的情況有變,如住址修改,這樣還會修改每本書的記錄,同屬若這個作者的數(shù)從庫中全部刪除后,跟著這個作者的信息也就沒了很明顯這不符合數(shù)據(jù)庫設(shè)計規(guī)范要求。
?? ?遇到這種情況 建議把上面的這張表分為三個獨立的表,分別為圖書基本表 ,作者表 圖書合作者對應(yīng)表等等 這樣設(shè)計 在遇到問題也能迎刃而解。
? 北京銳智互動軟件開發(fā)具有多類產(chǎn)品的研發(fā)和設(shè)計經(jīng)驗,產(chǎn)品種類包括:電子商務(wù)、生活服務(wù)、金融服務(wù)、新媒體、教育教學、手機游戲等多領(lǐng)域的app應(yīng)用及組件,銳智互動以專業(yè)的解決方案,快速的需求反應(yīng),靈活的開發(fā)流程和細致的客戶服務(wù),為企業(yè)提供全方位的移動應(yīng)用開發(fā),推廣運營服務(wù)。近年來近百家國內(nèi)外各行各業(yè)的客戶,致力于想客戶所想的原則,努力為客戶提供更進準更完善的移動互聯(lián)網(wǎng)應(yīng)用及解決方案。