1. 程式人生 > 其它 >Mysql-05--多表設計--正規化--表關係

Mysql-05--多表設計--正規化--表關係

技術標籤:Mysql資料庫mysqlsql設計模式java

多表設計

設計表時,先確定表儲存那類的資訊,學生表,定義類,資料型別,約束

正規化

為了建立冗餘較小,結構合理的資料庫,設計資料庫時必須遵循一定的規則

目前有五種正規化:第一正規化(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 外來鍵約束名

注意事項:

  1. 當表中沒有對應的記錄時,不能將記錄新增到從表
  2. 不能更改主表中的值而導致從表的記錄孤立
  3. 從表存在與主表對應的記錄,不能從主表中刪除該行
  4. 刪除主表前,先刪除從表

多對多:

設計一個表關係,用來儲存多個表之間的關係

可以拆分為 兩個多對一 兩個一對多

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)
)