天天看點

資料庫設計及規範 - MySQL

1. 資料庫的設計

實作關系

  1. 一對多(多對一)

    實作方式 : ​​

    ​在多的一方建立外鍵, 指向一的一方的主鍵​

  2. 多對多

    實作方式 : ​​

    ​多對多關系實作需要借助第三張中間表. 中間表至少包含兩個字段, 這兩個字段作為第三張表的外鍵, 分别指向兩張表的主鍵​

  3. 一對一

    實作方式 : ​​

    ​一對一關系實作, 可以在任意一方添加唯一外鍵指向另一方的主鍵​

一對多:在多方加入一方的主鍵 作為外鍵

多對多:獨立處聯系,并将聯系包含雙方的主鍵和自己的屬性

1.1 案例分析

資料庫設計及規範 - MySQL
-- 建立旅遊線路分類表 tab_category
CREATE TABLE tab_category(
  cid INT PRIMARY KEY AUTO_INCREMENT, -- 旅遊線路分類主鍵
  cname VARCHAR(100) NOT NULL UNIQUE -- 旅遊線路分類名稱
)

-- 建立旅遊線路表 tab_route
CREATE TABLE tab_route(
  rid INT PRIMARY KEY AUTO_INCREMENT, 
  rname VARCHAR(100) NOT NULL UNIQUE,
  price DOUBLE,
  rdate DATE, -- 上架時間
  cid INT, -- 外鍵, 所屬分類
  FOREIGN KEY (cid) REFERENCES tab_category(cid)
) 

-- 建立使用者表 tab_user
CREATE TABLE tab_user(
  uid INT PRIMARY KEY AUTO_INCREMENT,
  username VARCHAR(100) UNIQUE NOT NULL,
  PASSWORD VARCHAR(30) NOT NULL,
  NAME VARCHAR(100),
  birthday DATE,
  sex CHAR(1) DEFAULT '男',
  telephone VARCHAR(11),
  email VARCHAR(100)
)

/*
建立收藏表 tab_favorite
rid 旅遊線路id, 外鍵
date 收藏時間
uid 使用者id, 外鍵
rid 和 uid不能重複, 設定複合主鍵, 同一個使用者不能收藏同一個線路兩次
*/
CREATE TABLE table_favorite(
  rid INT,
  DATA DATETIME,
  uid INT,
  -- 建立複合主鍵
  PRIMARY KEY(rid, uid),
  FOREIGN KEY (rid) REFERENCES tab_route(rid),
  FOREIGN KEY (uid) REFERENCES tab_user(uid)
)      
資料庫設計及規範 - MySQL

2. 資料庫設計的範式

設計資料庫時, 需要遵循一些規範. 要遵循後邊的範式要求, 必須先遵循前邊的所有範式要求

​​​資料庫範式​​

資料庫設計及規範 - MySQL

上面資料庫設計不合理, 通過下面一步步的修改來設計合理的資料表.

2.1 第一範式(1NF)

每一列都是不可分割的原子資料項
資料庫設計及規範 - MySQL

如果不是原子資料項的話, 建表的列資料都無法建立.

存在的問題

  1. 嚴重的資料備援
  2. 添加時存在問題, 無法添加特定的某一項, 而是需要把列資料全部添加
  3. 删除時存在問題, 想要删除某一個資料, 這樣連帶的所有資料将會被删除

2.2 第二範式(2NF)

在1NF的基礎上, 非碼屬性必須完全依賴于碼 (在1NF基礎上消除非主屬性對主碼的部分函數依賴)

是以說, 第二範式就是消除第一範式的部分函數依賴.

2.2.1 何為部分函數依賴?

  • 函數依賴 : 如果通過A屬性(屬性組)的值, 可以确定唯一B屬性的值, 則稱B依賴于A

    eg : ​

    ​學号 --> 姓名 : 通過學号可以确定姓名 (學号, 課程名稱) --> 分數 : 通過學号和課程名稱可以确定分數​

  • 完全函數依賴 : 如果A是一個屬性組, 則B屬性值的确定需要依賴于A屬性組的中所有的屬性值

    eg : ​

    ​(學号, 課程名稱) --> 分數 : 分數需要依賴于學号和課程名稱這個屬性組的所有屬性才可以确定​

  • 部分函數依賴 : 如果A是一個屬性組, 則B屬性值的确定隻需要依賴于A屬性組中某一些值即可

    eg : ​

    ​(學号, 課程名稱) --> 姓名 : 姓名的确定隻需要該組中的學号即可以确定, 則稱為部分依賴​

2.2.2 碼的概念

如果在一張表中, 一個屬性或屬性組, 被其他所有屬性所完全依賴, 則稱這個屬性(屬性組)為該表的碼

​​

​碼可以為屬性或屬性組, 通過碼可以确定其他的所有屬性. 例如上面資料中的(學号, 課程名稱) 就是該表中的碼, 該屬性組可以确定其他的所有屬性​

​​

主屬性 : 碼屬性組中的所有屬性

非主屬性 : 除碼屬性組中的屬性

在1NF的基礎上, 消除部分函數依賴

資料庫設計及規範 - MySQL

2.3 第三範式(3NF)

在2NF基礎上, 任何非主屬性不依賴于其他非主屬性(在2NF基礎上消除傳遞依賴)

2.3.1 何為傳遞函數依賴?