數據庫范式
- 第一范式 - 列的原子性,數據庫表中的每一列都是不可再分的基本數據項
- 單一字段有多個有意義的值:比如 (people,address)其中address包括street,city,country,以逗號分割。想要查詢住在某一city的people很不容易
- 用很多字段來表示同一事實:比如(people,address1,address2,address3),就算我們假設每個people最多有三個地址,當想要查詢住在同一地址的people時也很不容易,因為有可能people1的address1與people2的address2相同,每一次都要比較3*3次組合
- 第二范式 - 符合第一范式;且表中的屬性必須完全依賴于全部主鍵,消除非主屬性對主鍵的部分依賴
- 比如(組件ID,供應商ID,供應商姓名,價格),組件ID+供應商ID為主鍵,價格完全依賴于全部主鍵,因為不同組件不同供應商具有不同價格,但是對于供應商姓名,則只依賴于供應商ID,會造成對同一供應商ID,名字數據重復,而且如果供應商改名,需要修改全部數據。因此需要單獨一個表(供應商ID,供應商姓名),(組件ID,供應商ID,價格)
- 第三范式 - 非主屬性之間不能有依賴關系,必須都直接依賴于主屬性,消除傳遞依賴
- 比如(組件ID,制造商姓名,制造商地址),其中組件ID為主鍵,而制造商地址依賴于制造商姓名,需要(組件ID,制造商姓名)和新表(制造商姓名,制造商地址)其中姓名是主鍵
- 比如(訂單ID,組件ID,單價,數量,總價),其中總價=單價*數量,總價依賴于單價和數量,需要去掉總價欄
- BC范式 - 任何屬性(包括非主屬性和主屬性)不能被非主屬性所決定。第三范式強調非主屬性不能依賴于其他非主屬性,BC范式是第三范式的加強,強調“任何屬性”。因此如果滿足第三范式,并且只有一個主鍵,則一定滿足BC范式
一般,范式越高,表越多,數據庫操作時需要表關聯,增加了查詢的復雜性,降低了查詢性能。因此并不是范式越高越好,要根據需要進行權衡,第三范式已經消除了大部分的數據冗余,插入異常,更新異常和刪除異常。