數(shù)據(jù)庫設(shè)計(jì)范式及其意義和不足

數(shù)據(jù)庫設(shè)計(jì)范式及其意義和不足

  • 補(bǔ)充:現(xiàn)在大型項(xiàng)目傾向于反范式設(shè)計(jì),得益于大容量硬盤的白菜價(jià)和計(jì)算機(jī)的性能提升,表的設(shè)計(jì)盡量冗余,表關(guān)系盡量設(shè)置為一對一而不是一對多,有助于大并發(fā)時(shí)的效率提升.

  • 數(shù)據(jù)庫的設(shè)計(jì)范式是數(shù)據(jù)庫設(shè)計(jì)所需要滿足的規(guī)范查剖,數(shù)據(jù)庫的規(guī)范化是優(yōu)化表的結(jié)構(gòu)和優(yōu)化把數(shù)據(jù)組織到表中的方式骂维,這樣使數(shù)據(jù)更明確测砂,更簡潔征字。實(shí)踐中,通常把一個(gè)數(shù)據(jù)庫分成兩個(gè)或多個(gè)表并定義表之間的關(guān)系以做到數(shù)據(jù)隔離返十,添加财喳、刪除和修改某個(gè)字段只需要在一個(gè)表中進(jìn)行遭贸,接著可以通過定義的關(guān)系傳遞到數(shù)據(jù)庫中剩余的表中(和分層思想的意義所在很相似)。這樣我們可以消除很多錯(cuò)誤或垃圾數(shù)據(jù)出現(xiàn)的機(jī)會并減輕更新信息所必要的工作量网沾。

  • 目前癞蚕,主要有六種范式:第一范式、第二范式辉哥、第三范式桦山、BC范式、第四范式和第五范式证薇。滿足最低要求的叫第一范式度苔,簡稱1NF。在第一范式基礎(chǔ)上進(jìn)一步滿足一些要求的為第二范式浑度,簡稱2NF寇窑。其余依此類推

  • 事物往往具有多面性,設(shè)計(jì)范式也會帶來一定的麻煩:操作困難箩张,因?yàn)樾枰?lián)系多個(gè)表才能得到所需要數(shù)據(jù)甩骏,而且范式越高性能就會越差窗市。所以使用多高的范式需要權(quán)衡利弊,一般在項(xiàng)目中饮笛,使用到第三范式也就足夠了咨察,性能好而且方便管理數(shù)據(jù)。

二福青、下面我們來舉例介紹一下數(shù)據(jù)庫設(shè)計(jì)三范式

說明:實(shí)例采用《學(xué)校機(jī)房收費(fèi)系統(tǒng)》的“學(xué)生信息表”摄狱,“學(xué)生上下機(jī)記錄表”的部分字段

1、第一范式1NF

定義:數(shù)據(jù)庫表中的字段都是單一屬性的无午,不可再分媒役。

簡單的說,每一個(gè)屬性都是原子項(xiàng)宪迟,不可分割酣衷。

1NF是關(guān)系模式應(yīng)具備的最起碼的條件,如果數(shù)據(jù)庫設(shè)計(jì)不能滿足第一范式次泽,就不稱為關(guān)系型數(shù)據(jù)庫穿仪。也就是說,只要是關(guān)系型數(shù)據(jù)庫意荤,就一定滿足第一范式啊片。

我們先來看一張不符合1NF的

表1-1
CardNo StudentNo StudentName Sex Department CardCash UserID UserLevel Time
001 021101 小明 教育學(xué)院,心理系袭异,1班 100 Operator 操作員

之所以說這張表不符合1NF钠龙,是因?yàn)镈epartment和Time字段可以再分,所以應(yīng)該更改為

表1-2:
CardNo StudentNo StudentName Sex Academy Major class >CardCash UserID UserLevel Date Time
001 021101 小明 教育學(xué)院 心理系 1 100 Operator 操作員 2011/10/03 09:00
2御铃、第二范式2NF

定義:數(shù)據(jù)庫表中不存在非關(guān)鍵字段對任一候選關(guān)鍵字段的部分函數(shù)依賴碴里,即符合第二范式。

《注:什么是函數(shù)依賴,詳見百度百科(http://baike.baidu.com/view/40008.htm)上真。

如果一個(gè)表中某一個(gè)字段A的值是由另外一個(gè)字段或一組字段B的值來確定的咬腋,就稱為A函數(shù)依賴于B∷ィ》

2NF可以減少插入異常根竿,刪除異常和修改異常。

簡單的說就珠,一方面寇壳,第二范式肯定要滿足第一范式,否則就沒有必要談第二范式妻怎。

另一方面壳炎,當(dāng)某張表中的非主鍵信息不是由整個(gè)主鍵函數(shù)來決定時(shí),即存在依賴于該表中不是主鍵的部分或者依賴于主鍵一部分的部分時(shí)逼侦,通常會違反2NF匿辩。

我們再來看上面的滿足1NF的表1-2

CardNo StudentNo StudentName Sex Academy Major class CardCash UserID UserLevel Date Time
001 021101 小明 教育學(xué)院 心理系 1 100 Operator 操作員 2011/10/03 09:00

我們看到腰耙,在這張表中,通過CardNo和StudentNo就可以確定StudentName铲球,Sex挺庞,Academy,Major稼病,class选侨,CardCash,UserID然走,Date侵俗,Time。所以可以把CardNo和StudentNo的組合作為主鍵丰刊。

但是,我們發(fā)現(xiàn)CardCash并不完全依賴于CardNo和StudentNo增拥,僅僅通過CardNo就可以確定CardCash啄巧,因?yàn)橐粡埧ǎ欢〞锌▋?nèi)金額掌栅。這就造成了部分依賴秩仆。出現(xiàn)這種情況,就不滿足第二范猾封。

修改為:

我們再來看另一個(gè)例子澄耍,學(xué)生上下機(jī)記錄表,會更明顯些晌缘。

表2-1
CardNo StudentNo StudentName Sex Department Major class OnDate OnTime OffDate OffTime ConsumeTime ConsumeMoney
001 0211 小明 教育學(xué)院 心理系 1 2011/10/14 09:00 2011/10/14 10:00 1 2

我們看到齐莲,在這張表中,StudentName,Sex,Department磷箕,Major选酗,class都是直接依賴于StudentNo,而不依賴與表中的其他字段岳枷,這樣的設(shè)計(jì)也不符合2NF非主鍵信息不是由整個(gè)主鍵函數(shù)來決定時(shí)芒填。

我們可以把1-2和2-1優(yōu)化為:

表3-1
StudentNo CardNo UserID UserLevel Date Time
021101 001 Operator 操作員 2011/10/03 09:00
3-2|
CardNo CardCash
001 98
3-3
CardNo OnDate OnTime OffDate OffTime ConsumeTime ConsumeMoney
001 2011/10/14 09:00 2011/10/14 10:00 1 2
3-4
StudentNo StudentName Sex Academy Major class
021101 小明 教育學(xué)院 心理系 1
3、第三范式3NF

定義:在第二范式的基礎(chǔ)上空繁,數(shù)據(jù)表中如果不存在非關(guān)鍵字段對任一候選關(guān)鍵字段的傳遞函數(shù)依賴則符合3NF殿衰。

我們來看上例中

優(yōu)化后的表3-1
StudentNo CardNo UserID UserLevel Date Time
021101 001 Operator 操作員 2011/10/03 09:00

在表中,一個(gè)UserID能確定一個(gè)UserLevel盛泡。這樣闷祥,UserID依賴于StudentNo和CardNo,而UserLevel又依賴于UserID饭于,這就導(dǎo)致了傳遞依賴蜀踏,3NF就是消除這種依賴维蒙。

我們把3-1進(jìn)行優(yōu)化得到:

4-1
StudentNo CardNo UserID Date Time
021101 001 Operator 2011/10/03 09:00
4-2
UserID UserLevel
Operator 操作員

我們看到,第三范式規(guī)則查找以消除沒有直接依賴于第一范式和第二范式形成的表的主鍵的屬性果覆。我們?yōu)闆]有與表的主鍵關(guān)聯(lián)的所有信息建立了一張新表颅痊。每張新表保存了來自源表的信息和它們所依賴的主鍵。

三局待、總結(jié)

數(shù)據(jù)庫設(shè)計(jì)規(guī)范化能讓我們更好地適應(yīng)變化斑响,使你能夠改變業(yè)務(wù)規(guī)則、需求和數(shù)據(jù)而不需要重新構(gòu)造整個(gè)系統(tǒng)钳榨。

三范式

第一范式(1NF):字段具有原子性,不可再分舰罚。所有關(guān)系型數(shù)據(jù)庫系統(tǒng)都滿足第一范式)
數(shù)據(jù)庫表中的字段都是單一屬性的,不可再分薛耻。例如营罢,姓名字段,其中的姓和名必須作為一個(gè)整體饼齿,無法區(qū)分哪部分是姓饲漾,哪部分是名,如果要區(qū)分出姓和名缕溉,必須設(shè)計(jì)成兩個(gè)獨(dú)立的字段考传。

第二范式(2NF):
第二范式(2NF)是在第一范式(1NF)的基礎(chǔ)上建立起來的,即滿足第二范式(2NF)必須先滿足第一范式(1NF)证鸥。
要求數(shù)據(jù)庫表中的每個(gè)實(shí)例或行必須可以被惟一地區(qū)分僚楞。通常需要為表加上一個(gè)列,以存儲各個(gè)實(shí)例的惟一標(biāo)識枉层。這個(gè)惟一屬性列被稱為主關(guān)鍵字或主鍵泉褐。

第二范式(2NF)要求實(shí)體的屬性完全依賴于主關(guān)鍵字。所謂完全依賴是指不能存在僅依賴主關(guān)鍵字一部分的屬性鸟蜡,如果存在兴枯,那么這個(gè)屬性和主關(guān)鍵字的這一部分應(yīng)該分離出來形成一個(gè)新的實(shí)體,新實(shí)體與原實(shí)體之間是一對多的關(guān)系矩欠。為實(shí)現(xiàn)區(qū)分通常需要為表加上一個(gè)列财剖,以存儲各個(gè)實(shí)例的惟一標(biāo)識。簡而言之癌淮,第二范式就是非主屬性非部分依賴于主關(guān)鍵字躺坟。

第三范式的要求如下:
滿足第三范式(3NF)必須先滿足第二范式(2NF)。簡而言之乳蓄,第三范式(3NF)要求一個(gè)數(shù)據(jù)庫表中不包含已在其它表中已包含的非主關(guān)鍵字信息咪橙。
所以第三范式具有如下特征:
1,每一列只有一個(gè)值
2,每一行都能區(qū)分美侦。
3产舞,每一個(gè)表都不包含其他表已經(jīng)包含的非主關(guān)鍵字信息。
例如菠剩,帖子表中只能出現(xiàn)發(fā)帖人的id易猫,而不能出現(xiàn)發(fā)帖人的id,還同時(shí)出現(xiàn)發(fā)帖人姓名具壮,否則准颓,只要出現(xiàn)同一發(fā)帖人id的所有記錄,它們中的姓名部分都必須嚴(yán)格保持一致棺妓,這就是數(shù)據(jù)冗余攘已。

說出一些數(shù)據(jù)庫優(yōu)化方面的經(jīng)驗(yàn)?

用PreparedStatement 一般來說比Statement性能高:一個(gè)sql 發(fā)給服務(wù)器去執(zhí)行,涉及步驟:語法檢查怜跑、語義分析样勃, 編譯,緩存
“inert into user values(1,1,1)”-二進(jìn)制
“inert into user values(2,2,2)”-二進(jìn)制
“inert into user values(?,?,?)”-二進(jìn)制
有外鍵約束會影響插入和刪除性能性芬,如果程序能夠保證數(shù)據(jù)的完整性彤灶,那在設(shè)計(jì)數(shù)據(jù)庫時(shí)就去掉外鍵。(比喻:就好比免檢產(chǎn)品批旺,就是為了提高效率,充分相信產(chǎn)品的制造商)
(對于hibernate來說诵姜,就應(yīng)該有一個(gè)變化:empleyee->Deptment對象汽煮,現(xiàn)在設(shè)計(jì)時(shí)就成了employeedeptid)
看mysql幫助文檔子查詢章節(jié)的最后部分,例如棚唆,根據(jù)掃描的原理暇赤,下面的子查詢語句要比第二條關(guān)聯(lián)查詢的效率高:

  1. select e.name,e.salary where e.managerid=(select id from employee where name='zxx');
  2. select e.name,e.salary,m.name,m.salary from employees e,employees m where
    e.managerid = m.id and m.name='zxx';
    表中允許適當(dāng)冗余,譬如宵凌,主題帖的回復(fù)數(shù)量和最后回復(fù)時(shí)間等
    將姓名和密碼單獨(dú)從用戶表中獨(dú)立出來鞋囊。這可以是非常好的一對一的案例喲玫锋!
    sql語句全部大寫尿招,特別是列名和表名都大寫。特別是sql命令的緩存功能棉钧,更加需要統(tǒng)一大小寫瓜喇,sql語句發(fā)給oracle服務(wù)器語法檢查和編譯成為內(nèi)部指令緩存和執(zhí)行指令挺益。根據(jù)緩存的特點(diǎn),不要拼湊條件乘寒,而是用?和PreparedStatment
    還有索引對查詢性能的改進(jìn)也是值得關(guān)注的望众。
    備注:下面是關(guān)于性能的討論舉例
    4航班 3個(gè)城市
    m*n
    select * from flight,city where flight.startcityid=city.cityid and city.name='beijing';
    m + n
    select * from flight where startcityid = (select cityid from city where cityname='beijing');

select flight.id,'beijing',flight.flightTime from flight where startcityid = (select cityid from city where cityname='beijing')

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子烂翰,更是在濱河造成了極大的恐慌夯缺,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甘耿,死亡現(xiàn)場離奇詭異踊兜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)棵里,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門润文,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人殿怜,你說我怎么就攤上這事典蝌。” “怎么了头谜?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵骏掀,是天一觀的道長。 經(jīng)常有香客問我柱告,道長截驮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任际度,我火速辦了婚禮葵袭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘乖菱。我一直安慰自己坡锡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布窒所。 她就那樣靜靜地躺著鹉勒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吵取。 梳的紋絲不亂的頭發(fā)上禽额,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天,我揣著相機(jī)與錄音皮官,去河邊找鬼脯倒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛捺氢,可吹牛的內(nèi)容都是我干的盔憨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼讯沈,長吁一口氣:“原來是場噩夢啊……” “哼郁岩!你這毒婦竟也來了婿奔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤问慎,失蹤者是張志新(化名)和其女友劉穎萍摊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體如叼,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡冰木,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了笼恰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片踊沸。...
    茶點(diǎn)故事閱讀 40,146評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖社证,靈堂內(nèi)的尸體忽然破棺而出逼龟,到底是詐尸還是另有隱情,我是刑警寧澤追葡,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布腺律,位于F島的核電站,受9級特大地震影響宜肉,放射性物質(zhì)發(fā)生泄漏匀钧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一谬返、第九天 我趴在偏房一處隱蔽的房頂上張望之斯。 院中可真熱鬧,春花似錦遣铝、人聲如沸佑刷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至啰劲,卻和暖如春梁沧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蝇裤。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工廷支, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人栓辜。 一個(gè)月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓恋拍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親藕甩。 傳聞我的和親對象是個(gè)殘疾皇子施敢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容