2009年10月16日 星期五

資料庫正規化

資料庫正規化
« 於: 2008-05-13 15:02 »

--------------------------------------------------------------------------------
要寫出一個好的網頁程式並不容易
除了資料的傳遞方式(GET/POST),頁面的串接,php的語法,SQL語法都得熟悉外
最重要的當然就是資料庫規劃了
不懂的如何規劃,那保證什麼專案都寫不出來
(曾遇過某個天才把所有的欄位統統擺在一個表格內,對每個欄位統統建index來加速)
要如何規劃出一個資料庫呢?
就是這篇的主題了--資料庫正規化

資料庫正規化的目的在於消除重複的資料欄位,確保資料的一致性。
一般來說大概都只會做到第三正規化,所以這邊就只討論到此嘍
正規化只是提供一個資料庫設計的準則,並不是一個強制性的規定,有時為了效能,會做反正規劃的動作

就功能性來區分
第一正規化 消除重複資料群,定義出唯一的索引值
第二正規化 根據表格的功能性,將不相干的欄位分離
第三正規化 根據遞移關係,將欄位分離

第一正規化

引用
第一正規化的幾個規則

一個row就只能陳述一件事
每個row都必須有一個唯一的識別(主鍵)
每個欄位只能陳述一個事情
不能用多個欄位陳述同一見事實

以下是幾個違反的例子

訂單資料
訂單ID 商品ID 購買數量
1 2,3,4 1,3,5
2 1,5,9,10 10,20,1,3
訂單1裡面購買了ID為2的商品,買了1個。
訂單1裡面購買了ID為3的商品,買了3個。
訂單1裡面購買了ID為4的商品,買了5個。
這違反了一個row就只能陳述一件事這條規則
上面的資料應該規劃成以下的方式
訂單ID 商品ID 購買數量
1 2 1
1 3 3
1 4 5
2 1 10
2 5 20
2 9 1
2 10 3

上面的例子 訂單的ID以及商品ID就是這個購買紀錄的唯一識別碼(主鍵)

文章關鍵字的索引
ID 標題 關鍵字
1 資料庫正規化... 資料庫,正規化,php
2 php資料結構... php,資料結構

上面的關鍵字欄位就違反了每個欄位只能陳述一個事情

如果關鍵字的數目不會超過3個
或許就會有人改成這樣的方式
ID 標題 關鍵字1 關鍵字2 關鍵字3
1 資料庫正規化... 資料庫 正規化 php
2 php資料結構... php 資料結構

但這又違反了不能用多個欄位陳述同一見事實這條規則
關鍵字1,2,3,這三個欄位都是用來陳述關鍵字
所以嘍,這就不是個好的方式,況且每次搜尋得跨欄位

比較適合的方式就會像這樣

文章
ID 標題
1 資料庫正規化...
2 php資料結構...

關鍵字索引
關鍵字 文章ID
資料庫 1
正規化 1
php 1
php 2
資料結構 2

未完....待續

« 最後編輯時間: 2008-05-13 17:31 由 Darkhero » 已記錄

--------------------------------------------------------------------------------
我的symfony作品:YOMOpets 寵物誌
有興趣可以一起來討論symfony喔
我的部落格:http://pets.yomopets.com/ricky


micmic3
俺是博士!

文章: 1311


回覆: 資料庫正規化
« 回覆文章 #1 於: 2008-05-13 16:40 »

--------------------------------------------------------------------------------
嗯....好著急啊....怎麼這樣就結束了...
---
這是一篇好文章

已記錄



Darkhero
酷!學園 學長們
俺是博士!

會員性別:
文章: 3337


我家小貓~


回覆: 資料庫正規化
« 回覆文章 #2 於: 2008-05-13 16:54 »

--------------------------------------------------------------------------------
忽然想到....

有好多有上集沒下集的文章..將來是不是要來追一下...
(但是這樣會追到我自己..還是不要好了...)

已記錄

--------------------------------------------------------------------------------
希望我們的討論是為了把問題解決,而不是爭論誰對誰錯.
『灌水才是重點,發文只是順便』
『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』


哇沙米
可愛的小學生

文章: 28


回覆: 資料庫正規化
« 回覆文章 #3 於: 2008-05-13 17:00 »

--------------------------------------------------------------------------------
資料庫規劃真的也很重要,
好的規劃可以讓往後維護上及可讀性加強,
不遵守正規化真的可以讓設計師偷一點懶…
這篇好文章期待補完

已記錄



jaceju
憂鬱的高中生

文章: 90


回覆: 資料庫正規化
« 回覆文章 #4 於: 2008-05-13 17:20 »

--------------------------------------------------------------------------------
有時候不遵守正規化,其實不僅僅是想偷懶,而是為了效能問題。在資料吞吐量非常大時,就會寧可用空間來換取時間,在每個需要的資料表裡塞入重複的紀錄,避免 JOIN 等耗費時間的運算。

但這樣的處理方式也僅適合資料不常更改的狀況,如果系統需要的是資料的強健性與正確性,那麼正規化還是相當必要的。

個人意見,僅供參考。

已記錄



Darkhero
酷!學園 學長們
俺是博士!

會員性別:
文章: 3337


我家小貓~


回覆: 資料庫正規化
« 回覆文章 #5 於: 2008-05-13 17:29 »

--------------------------------------------------------------------------------
Jace 說的很正確...正規化的資料庫表格, 由於常常需要關聯不同資料表的關係, 有時候會讓資料庫有過多的 join 產生, 這部分在大量資料跟大量存取下, 反而會造成效能低落..

資料庫正規化是初學者必須學習的一個課題, 這是無庸置疑的..

而在資料庫程式打滾一陣子後,尤其當資料量增加非常快,而存取量又大的時候,該怎麼適度的作反正規化來達成用空間換取時間的目標, 則是有經驗的程式設計師,資料庫設計師所需要面臨的下一個課題...

這當中牽扯了關於如何保持資料的正確性, 一致性, 不管是用程式處理, 還是用資料庫的 SP 來處理..都是一門學問了!~...

不過呢..我想, 如果再看本文的朋友若是還不清楚正規化是什麼要幹麻的, 就用心的學好正規化, 然後再來想所謂的空間換時間的方法...

已記錄

--------------------------------------------------------------------------------
希望我們的討論是為了把問題解決,而不是爭論誰對誰錯.
『灌水才是重點,發文只是順便』
『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』


ricky
區域板主
鑽研的研究生

文章: 560



回覆: 資料庫正規化
« 回覆文章 #6 於: 2008-05-13 18:38 »

--------------------------------------------------------------------------------
會寫這篇的原因是最近接手了前人的攤子
資料庫裡面充斥著垃圾欄位

正規化後的table有時必須靠複雜的join陳述才能將需要的資料select出來
同時寫入資料也得分散在許多table,甚至得啟用transaction

到時候再來舉幾個反正規化的例子吧

=============================
原來舉例子才是最困難的東西



已記錄

--------------------------------------------------------------------------------
我的symfony作品:YOMOpets 寵物誌
有興趣可以一起來討論symfony喔
我的部落格:http://pets.yomopets.com/ricky

沒有留言:

張貼留言

我最愛的小毓-->《謝錦》紀錄片10分鐘搶先看

Cyndi Lauper - True Color (with Lyrics)

The Carpenters - Top Of The World

麥可傑可森Michael_Jackson 終於找到他的筆了~

麥可傑克森(Michael Jackson ) - Beat it

Madonna - Material Girl

[Stockholm] Michael Jackson Beat It: Flash mob @ Sergels Torg,

[Stockholm, Sweden] Michael Jackson Tribute

[PARIS] MICHAEL JACKSON DANCE TRIBUTE BEAT IT FLASH MOB 26 07 09

[Montreal] Michael Jackson Tribute - July 27 (Flashmob)

[Germany] [OFFICIAL] Michael Jackson Dance Tribute - Berlin

[ROMA] Michael Jackson's This is it - Flash Mob Roma, Piazza Spagna

[Roma] tributo a Michael Jackson Roma - Colosseo 4 ottobre 2009

[Roma] Michael Jackson's This is it - Flash Mob Roma, Via del Corso

[Romonia] Michael Jackson Dance Tribute - BUCHAREST

[ESTONIA, Tallinn] Michael Jackson Dance Tribute - ESTONIA, Tallinn ( Beat It )

[TALLINN (Estonia)] Michael Jackson Dance Tribute -

[Poland] FLASHMOB - BEAT IT. 29.08.2009. WARSZAWA. ZŁOTE TARASY.

[Italy-PERUGIA] Michael Jackson Dance Tribute - PERUGIA

[Italy] Tribute Michael Jackson Flash mob live in Naples

[Greece] [OFFICIAL] Michael Jackson Dance Tribute - THESSALONIKI,GREECE

[Central Station in Stockholm.] Michael Jackson Tribute - July 8, 2009

[Budapest] Michael Jackson Dance Tribute, - Aug 16, 2009

[Seattle] OFFICIAL Michael Jackson Tribute Flash Mob

[Mexico] Tributo Oficial a Michael Jackson Mexico Baila Beat It!!!

[TW] MJ快閃(國父紀念館加場)

[TW] 快閃麥克 高雄 漢神巨蛋廣場 20090726 Michael Jackson Dance Tribute

[TW] Michael Jackson Dance Tribute - Taipei(TAIWAN台灣麥可快閃活動) - in response to STOCKHOLM

[TW] 0719紀念永遠的麥可傑克森~千人舞動快閃活動(西門町六號出口)-第二閃

[TW] Michael Jackson Tribute - Ximen Plaza Taipei Taiwan. July 19, 2009

[TW] Michael Jackson Tribute flashmob from Taichung, Taipei (July 19, 2009) - 清晰版

Michael Jackson Dance Tribute - Hong Kong, Beat It, Flashmob

[OFFICIAL] Michael Jackson Dance Tribute - Hollywood July 25, 2009

Flash mob "Beat It" - tribute to Michael Jackson @ mongkok hong kong

Michael Jackson - Beat It with lyrics

Teresa Teng 鄧麗君 - Beat it 十億個掌聲Taipei Concert 1984

Madonna - American Pie - Music

Madonna - Papa Don't Preach Lyric Video

Madonna - La Isla Bonita

Madonna - La Isla Bonita Live in London

Madonna - Like A Prayer

Wham - Wake Me Up Before You Go.avi

Last Christmas - Wham! (HQ Audio)

Careless Whisper-WHAM!

Shakin Stevens - Because I Love You.avi

The One You Love - Glenn Frey.avi

Footloose - Original Music Video.avi

Footloose- Michael Jackson Style

Footloose with lyrics

Nothing Gonna Change My Love For You

Please Mr Postman- The Carpenters (1975)

Richard Marx-Right here waiting for you

火焰之舞 (海德公園)

大河之舞