1)不應該針對整個系統(tǒng)進行數(shù)據(jù)庫設計撰筷,而應該根據(jù)系統(tǒng)架構中的組件劃分陈惰,針對每個組件所處理的業(yè)務進行組件單元的數(shù)據(jù)庫設計;不同組件間所對應的數(shù)據(jù)庫表之間的關聯(lián)應盡可能減少毕籽,如果不同組件間的表需要外鍵關聯(lián)也盡量不要創(chuàng)建外鍵關聯(lián)抬闯,而只是記錄關聯(lián)表的一個主鍵,確保組件對應的表之間的獨立性关筒,為系統(tǒng)或表結構的重構提供可能性溶握。
2)采用領域模型驅動的方式和自頂向下的思路進行數(shù)據(jù)庫設計,首先分析系統(tǒng)業(yè)務蒸播,根據(jù)職責定義對象睡榆。對象要符合封裝的特性,確保與職責相關的數(shù)據(jù)項被定義在一個對象之內袍榆,這些數(shù)據(jù)項能夠完整描述該職責胀屿,不會出現(xiàn)職責描述缺失。并且一個對象有且只有一項職責包雀,如果一個對象要負責兩個或兩個以上的職責宿崭,應進行分拆。
3)根據(jù)建立的領域模型進行數(shù)據(jù)庫表的映射馏艾,此時應參考數(shù)據(jù)庫設計第二范式:一個表中的所有非關鍵字屬性都依賴于整個關鍵字劳曹。關鍵字可以是一個屬性,也可以是多個屬性的集合琅摩,不論那種方式铁孵,都應確保關鍵字能夠保證唯一性。在確定關鍵字時房资,應保證關鍵字不會參與業(yè)務且不會出現(xiàn)更新異常蜕劝,這時,最優(yōu)解決方案為采用一個自增數(shù)值型屬性或一個隨機字符串作為表的關鍵字轰异。
4)由于第一點所述的領域模型驅動的方式設計數(shù)據(jù)庫表結構岖沛,領域模型中的每一個對象只有一項職責,所以對象中的數(shù)據(jù)項不存在傳遞依賴搭独,所以婴削,這種思路的數(shù)據(jù)庫表結構設計從一開始即滿足第三范式:一個表應滿足第二范式,且屬性間不存在傳遞依賴牙肝。
5)同樣唉俗,由于對象職責的單一性以及對象之間的關系反映的是業(yè)務邏輯之間的關系嗤朴,所以在領域模型中的對象存在主對象和從對象之分,從對象是從1-N或N-N的角度進一步主對象的業(yè)務邏輯虫溜,所以從對象及對象關系映射為的表及表關聯(lián)關系不存在刪除和插入異常雹姊。
6)在映射后得出的數(shù)據(jù)庫表結構中,應再根據(jù)第四范式進行進一步修改衡楞,確保不存在多值依賴吱雏。這時,應根據(jù)反向工程的思路反饋給領域模型瘾境。如果表結構中存在多值依賴歧杏,則證明領域模型中的對象具有至少兩個以上的職責,應根據(jù)第一條進行設計修正寄雀。第四范式:一個表如果滿足BCNF得滤,不應存在多值依賴。
7)在經過分析后確認所有的表都滿足二盒犹、三懂更、四范式的情況下,表和表之間的關聯(lián)盡量采用弱關聯(lián)以便于對表字段和表結構的調整和重構急膀。并且沮协,我認為數(shù)據(jù)庫中的表是用來持久化一個對象實例在特定時間及特定條件下的狀態(tài)的,只是一個存儲介質卓嫂,所以慷暂,表和表之間也不應用強關聯(lián)來表述業(yè)務(數(shù)據(jù)間的一致性),這一職責應由系統(tǒng)的邏輯層來保證晨雳,這種方式也確保了系統(tǒng)對于不正確數(shù)據(jù)(臟數(shù)據(jù))的兼容性行瑞。當然,從整個系統(tǒng)的角度來說我們還是要盡最大努力確保系統(tǒng)不會產生臟數(shù)據(jù)餐禁,單從另一個角度來說血久,臟數(shù)據(jù)的產生在一定程度上也是不可避免的,我們也要保證系統(tǒng)對這種情況的容錯性帮非。這是一個折中的方案氧吐。
8)應針對所有表的主鍵和外鍵建立索引,有針對性的(針對一些大數(shù)據(jù)量和常用檢索方式)建立組合屬性的索引末盔,提高檢索效率筑舅。雖然建立索引會消耗部分系統(tǒng)資源,但比較起在檢索時搜索整張表中的數(shù)據(jù)尤其時表中的數(shù)據(jù)量較大時所帶來的性能影響陨舱,以及無索引時的排序操作所帶來的性能影響翠拣,這種方式仍然是值得提倡的。
9)盡量少采用存儲過程游盲,目前已經有很多技術可以替代存儲過程的功能如“對象/關系映射”等误墓,將數(shù)據(jù)一致性的保證放在數(shù)據(jù)庫中邦尊,無論對于版本控制、開發(fā)和部署优烧、以及數(shù)據(jù)庫的遷移都會帶來很大的影響。但不可否認链峭,存儲過程具有性能上的優(yōu)勢畦娄,所以,當系統(tǒng)可使用的硬件不會得到提升而性能又是非常重要的質量屬性時弊仪,可經過平衡考慮選用存儲過程熙卡。
10)當處理表間的關聯(lián)約束所付出的代價(常常是使用性上的代價)超過了保證不會出現(xiàn)修改、刪除励饵、更改異常所付出的代價驳癌,并且數(shù)據(jù)冗余也不是主要的問題時,表設計可以不符合四個范式役听。四個范式確保了不會出現(xiàn)異常颓鲜,但也可能由此導致過于純潔的設計,使得表結構難于使用典予,所以在設計時需要進行綜合判斷甜滨,但首先確保符合四個范式,然后再進行精化修正是剛剛進入數(shù)據(jù)庫設計領域時可以采用的最好辦法瘤袖。
11)設計出的表要具有較好的使用性衣摩,主要體現(xiàn)在查詢時是否需要關聯(lián)多張表且還需使用復雜的SQL技巧。
12)設計出的表要盡可能減少數(shù)據(jù)冗余捂敌,確保數(shù)據(jù)的準確性艾扮,有效的控制冗余有助于提高數(shù)據(jù)庫的性能。
MySql之表設計原則
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門升薯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來莱褒,“玉大人,你說我怎么就攤上這事涎劈」阃梗” “怎么了阅茶?”我有些...
- 正文 為了忘掉前任撞蜂,我火速辦了婚禮,結果婚禮上侥袜,老公的妹妹穿的比我還像新娘蝌诡。我一直安慰自己,他們只是感情好枫吧,可當我...
- 文/花漫 我一把揭開白布浦旱。 她就那樣靜靜地躺著,像睡著了一般九杂。 火紅的嫁衣襯著肌膚如雪颁湖。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼羡微,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了惶我?” 一聲冷哼從身側響起妈倔,我...
- 正文 年R本政府宣布,位于F島的核電站很魂,受9級特大地震影響扎酷,放射性物質發(fā)生泄漏。R本人自食惡果不足惜遏匆,卻給世界環(huán)境...
- 文/蒙蒙 一霞玄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拉岁,春花似錦、人聲如沸惰爬。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽撕瞧。三九已至陵叽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丛版,已是汗流浹背巩掺。 一陣腳步聲響...
推薦閱讀更多精彩內容
- //我所經歷的大數(shù)據(jù)平臺發(fā)展史(三):互聯(lián)網時代 ? 上篇http://www.infoq.com/cn/arti...
- 這本書仰慕已久,也加了武志紅的公眾號舍败,對他很多一語中的的心理學分析文章很是贊同招狸。今天開始閱讀《巨嬰國》,分...