Mysql-05--多表設計--正規化--表關係
阿新 • • 發佈:2021-01-20
多表設計
設計表時,先確定表儲存那類的資訊,學生表,定義類,資料型別,約束
正規化
為了建立冗餘較小,結構合理的資料庫,設計資料庫時必須遵循一定的規則
目前有五種正規化:第一正規化(1NF)、第二正規化(2NF)、第三正規化(3NF)、巴斯-科德正規化(BCNF)、第四正規化(4NF)和第五正規化(5NF,又稱完美正規化)
一般的資料庫滿足第三正規化就行.
第一正規化
- 確保每列保持,原子性,不可再分
第二正規化:
- 由主鍵, 其他欄位依賴於主鍵
第三正規化
- 消除傳遞依賴,方便理解,可以看作消除冗餘
表之間的關係
- 一對一 一個學生只能對應一個年級
- 一對多
- 多對一 多個學生對應一個年紀
- 多對多
外來鍵
外來鍵:引用另外一個數據表的某條記錄
外來鍵列型別與主鍵列型別保持一致
資料表之間的關聯/引用關係主要依靠具體的主鍵(primary key) 和外來鍵(foreign key)建立起來
– 弱關聯關係 表與表之間的關係時人為定義的 表結構中並沒有實際的聯絡
– 強關聯關係 給外來鍵新增約束 強制讓外來鍵對應的主鍵產生關係 (外來鍵對應的是另一個表的主鍵)
新增外來鍵
create table score(
cid int not null auto_increment primary key,
score int,
sid int ,
CONSTRAINT 約束名 foreign key(sid) references student(sid)
);
alter tale 表名 add [constraint 約束名] froeign key(外來鍵列) REFERENCES 關聯表(主鍵)
刪除外來鍵
alter table 表名 drop froeign key 外來鍵約束名
注意事項:
- 當表中沒有對應的記錄時,不能將記錄新增到從表
- 不能更改主表中的值而導致從表的記錄孤立
- 從表存在與主表對應的記錄,不能從主表中刪除該行
- 刪除主表前,先刪除從表
多對多:
設計一個表關係,用來儲存多個表之間的關係
可以拆分為 兩個多對一 兩個一對多
CREATE TABLE 1student_1course(
id INT PRIMARY KEY AUTO_INCREMENT,
stu_num INT,
course_id INT,
CONSTRAINT stu_num_fk FOREIGN KEY(stu_num ) REFERENCES 1_student(num),
CONSTRAINT course_id_fk FOREIGN KEY(course_id ) REFERENCES 1_course(id)
)
完成程式碼
# 多表的設計
/*
設計表時,先確定表儲存那類的資訊, 學生表, 定義列,資料型別,約束
學生表
老師表
課程表
需要儲存不同的資訊--只儲存一類資訊
學生表
名族 年紀
老師
民族,年紀
*/
/*
第一正規化
確保每列保持 原子性 不可再分
第二正規化
有主鍵 其他欄位依賴於主鍵
第三正規化
消除傳遞依賴,方便理解,可以看作消除冗餘
表之間的關係
一對一 一個學生只能對應一個年級
一丟多
多對一 多個學生對應一個年紀
多對多
`` 設計一個關係表,用來儲存多個表之間的關係
*/
## 學生表 年紀表 老師表 課程
/*
學生表
學號 姓名 性別 手機號 年紀編號 (外來鍵) 課程編號
年紀
年紀標號 年紀名稱 年紀介紹
課程號
課程編號 課程名稱 課程介紹
*/
CREATE TABLE 1_grade(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
gdesc VARCHAR(50)
)
SELECT * FROM 1_grade
CREATE TABLE 1_student(
num INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
sex VARCHAR(1),
phone VARCHAR(11),
grade_id INT,
reg_time DATETIME
-- 弱關聯關係 表與表之間的關係時人為定義的 表結構中並沒有實際的聯絡
-- 強關聯關係 給外來鍵新增約束 強制讓外來鍵對應的主鍵產生關係 (外來鍵對應的是另一個表的主鍵)
ALTER TABLE 1_student ADD CONSTRAINT grade_id_kf FOREIGN KEY(grade_id ) REFERENCES 1_grade(id)
#多對多
# `` 設計一個關係表,用來儲存多個表之間的關
# 可以拆分為 兩個多對一 兩個一對多
CREATE TABLE 1student_1course(
id INT PRIMARY KEY AUTO_INCREMENT,
stu_num INT,
course_id INT,
CONSTRAINT stu_num_fk FOREIGN KEY(stu_num ) REFERENCES 1_student(num),
CONSTRAINT course_id_fk FOREIGN KEY(course_id ) REFERENCES 1_course(id)
)
CREATE TABLE 1_course(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
vdesc VARCHAR(10)
)