2016年8月2日 星期二

資料庫設計-上

        網路上程式語言的學習資源很多,教SQL的也是一狗票,因為這是Hard skill,按著教程一步一步做就會有一定的成果出來。相對的教資料庫設計這種Soft skill的反倒少了,若把人比做應用系統,那資料庫就是腦子,而資料庫設計就是學習方法了。
        只要設計出來的資料庫能夠符合應用系統現在甚至未來的需求就是好的資料庫設計。但是要符合應用系統的需求說來簡單,要怎麼做卻是很多程式開發新手的心中的痛,常見的情況是在開發系統初期,因為忽略了或過度簡化了資料庫設計,一開始並不覺得哪裡有問題,在開發過程中不斷的為了需求新增資料庫物件,不斷的疊床架屋,到了中後期之後,發現有需求異動了,這時候回頭改才發現建構的資料結構亂如麻,改了一個地方,另一個功能卻爆炸了。因此為了避免這種窘狀的發生,最常見的作法就是繼續的疊床架屋上去,最後交到業主手上的就是一套可以使用但是卻難以維護、資料庫效能日漸低落的系統。

我認為需要的

知識

  • 要設計資料庫當然要對資料庫、對DB Object 有一定的了解,知道每種Object的用途(可以參考Session 1 Database object)
  • Table正規化

工具

  • 實體關聯圖(Entity Relationship Diagram)
  • 資料流程圖(Data Flow Diagram)

Table正規化

正規化(Normalization)一連串的步驟,用來修改Table減少重複資料以及資料不一致的情形,每進行了任一個步驟,資料庫的狀態就會處於特定的正規化狀態,關聯式資料庫(RDB)定義了下列幾種的正規化:
  1. 第一正規化(1 Normal form,1NF)
  2. 第二正規化(2NF)
  3. 第三正規化(3NF)
  4. BC正規化(Boyce-Codd NF)
  5. 第四正規化(4NF)
  6. 第五正規化(5NF)
正規化的使用並不是愈高愈好,因為正規化的層級愈高產生的關聯Table也就愈多,有可能造成查詢資料時的join次數過多使得查詢效率降低,因此正規化要做到怎樣程度,需要視自己的需求來決定,通常我們在做一般的Web Application,大多只需要做到2NF或3NF就夠了,因此再這裡我就不多作後面正規化的介紹。

第一正規化(1NF)


在介紹1NF之前,可以先檢查自己在使用Excel時編出來的表格長什麼樣子,因為我們公司有導入Libreoffice,我在User site常聽到Libreoffice calc不好用想換回Excel,問他是怎樣不好用,會回說都資料都加總不起來,看了他的資料表後,原來他的資料類似這樣

客戶訂單日期銷售明細訂單金額配件明細訂單金額總金額業務員
陳春嬌2016/2/3衣服5件:500元/件
褲子2件:500元/件
大衣3件:500元/件
5000元項鍊4個:100元/個400元5400元王大同
李志明2016/3/5帽子5件:100元/件
衣服3件:500元/件
夾克7件:1000元/件
9000元手鍊10個:100元/個
別針10個:100元/個
2000元11000元張曉明

一看差點暈倒,大嬸,你把試算表當成Word打,這不是Libreoffice的錯(Libreoffice表示:寶寶心裡委屈,但寶寶不說),老實說這種用法用開源免費的Libreoffice就夠了,用要收錢的Excel會讓Excel哭阿。回過頭來看,跟這個相關的第一正規化就是把只給人看的資料轉化成也能給電腦分析判斷的步驟,要符合第一正規化必須要滿足下列規則:
  • 不能有重複的欄位
  • 每個欄位都必須是資料的最小單元
  • 每一筆資料都有自己的主鍵

符合第一正規化的規格



客戶ID客戶訂單日期產品ID銷售明細數量單位ID單位單價明細金額總金額業務員ID業務員
101陳春嬌2016/2/31衣服51150025005400201王大同
101陳春嬌2016/2/32褲子21150010005400201王大同
101陳春嬌2016/2/33大衣31150015005400201王大同
101陳春嬌2016/2/34項鍊4121004005400201王大同
102李志明2016/3/55帽子51110050011000202張曉明
102李志明2016/3/51衣服411500200011000202張曉明
102李志明2016/3/56夾克7111000700011000202張曉明
102李志明2016/3/57手鍊1012100100011000202張曉明
102李志明2016/3/58別針1012100100011000202張曉明

第二正規化(2NF)


要符合2NF要達到以下的條件:
  • 要符合1NF
  • 只有跟主題有關的資料才會被存放在同一個Table中,其他的資料必須放在另一個Table
  • 這些不同表格之間的關係由Foreign Key來展示
所以已經1NF的表格在2NF時會變成下列的4個表,在拆分時必須要達到無損,也就是需要注意資料雖拆成數個,但是資料必須沒有遺失。
  • 交易資料表
客戶ID訂單日期產品ID數量單位ID總金額業務員ID業務員
1012016/2/315115400201王大同
1012016/2/322115400201王大同
1012016/2/333115400201王大同
1012016/2/344125400201王大同
1022016/3/5551111000202張曉明
1022016/3/5141111000202張曉明
1022016/3/5671111000202張曉明
1022016/3/57101211000202張曉明
1022016/3/58101211000202張曉明

  • 客戶資料表

ID客戶名稱
101陳春嬌
102李志明

  • 產品資料表

ID產品名稱單價
1衣服500
2褲子500
3大衣500
4項鍊100
5帽子100
6夾克1000
7手鍊100
8別針100

  • 單位資料表

ID單位名稱
11
12

第三正規化(3NF)

要符合3NF要達到以下的條件:
  • 要符合2NF
  • 所有主題外的欄位都必須是用來描述主題本身的屬性,也就是說,所有其他欄位的值都是靠主題來決定。
除了交易資料表,其他的表都已經符合3NF,所以把交易資料表拆成兩個表來符合3NF
  • 交易資料表
客戶ID訂單日期產品ID數量單位ID總金額業務員ID
1012016/2/315115400201
1012016/2/322115400201
1012016/2/333115400201
1012016/2/344125400201
1022016/3/5551111000202
1022016/3/5141111000202
1022016/3/5671111000202
1022016/3/57101211000202
1022016/3/58101211000202
  • 業務員資料表
ID業務員
201王大同
202張曉明


沒有留言: