1. 資料庫的設計
實作關系
-
一對多(多對一)
實作方式 :
在多的一方建立外鍵, 指向一的一方的主鍵
-
多對多
實作方式 :
多對多關系實作需要借助第三張中間表. 中間表至少包含兩個字段, 這兩個字段作為第三張表的外鍵, 分别指向兩張表的主鍵
-
一對一
實作方式 :
一對一關系實作, 可以在任意一方添加唯一外鍵指向另一方的主鍵
一對多:在多方加入一方的主鍵 作為外鍵
多對多:獨立處聯系,并将聯系包含雙方的主鍵和自己的屬性
1.1 案例分析
-- 建立旅遊線路分類表 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)
)
2. 資料庫設計的範式
設計資料庫時, 需要遵循一些規範. 要遵循後邊的範式要求, 必須先遵循前邊的所有範式要求
資料庫範式
上面資料庫設計不合理, 通過下面一步步的修改來設計合理的資料表.
2.1 第一範式(1NF)
每一列都是不可分割的原子資料項
如果不是原子資料項的話, 建表的列資料都無法建立.
存在的問題
- 嚴重的資料備援
- 添加時存在問題, 無法添加特定的某一項, 而是需要把列資料全部添加
- 删除時存在問題, 想要删除某一個資料, 這樣連帶的所有資料将會被删除
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的基礎上, 消除部分函數依賴
2.3 第三範式(3NF)
在2NF基礎上, 任何非主屬性不依賴于其他非主屬性(在2NF基礎上消除傳遞依賴)