MySQL:多表

數據庫的設計

1. 多表之間的關係

	1. 分類:
		1. 一對一(瞭解):
			* 如:人和身份證
			* 分析:一個人只有一個身份證,一個身份證只能對應一個人
		2. 一對多(多對一):
			* 如:部門和員工
			* 分析:一個部門有多個員工,一個員工只能對應一個部門
		3. 多對多:
			* 如:學生和課程
			* 分析:一個學生可以選擇很多門課程,一個課程也可以被很多學生選擇
	2. 實現關係:
		1. 一對多(多對一):
			* 如:部門和員工
			* 實現方式:在多的一方建立外鍵,指向一的一方的主鍵。
		2. 多對多:
			* 如:學生和課程
			* 實現方式:多對多關係實現需要藉助第三張中間表。中間表至少包含兩個字段,這兩個字段作爲第三張表的外鍵,分別指向兩張表的主鍵
		3. 一對一(瞭解):
			* 如:人和身份證
			* 實現方式:一對一關係實現,可以在任意一方添加唯一外鍵指向另一方的主鍵。

	3. 案例
		-- 創建旅遊線路分類表 tab_category
		-- cid 旅遊線路分類主鍵,自動增長
		-- cname 旅遊線路分類名稱非空,唯一,字符串 100
		CREATE TABLE tab_category (
			cid INT PRIMARY KEY AUTO_INCREMENT,
			cname VARCHAR(100) NOT NULL UNIQUE
		);
		
		-- 創建旅遊線路表 tab_route
		/*
		rid 旅遊線路主鍵,自動增長
		rname 旅遊線路名稱非空,唯一,字符串 100
		price 價格
		rdate 上架時間,日期類型
		cid 外鍵,所屬分類
		*/
		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
		uid 用戶主鍵,自增長
		username 用戶名長度 100,唯一,非空
		password 密碼長度 30,非空
		name 真實姓名長度 100
		birthday 生日
		sex 性別,定長字符串 1
		telephone 手機號,字符串 11
		email 郵箱,字符串長度 100
		*/
		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 tab_favorite (
			rid INT, -- 線路id
			DATE DATETIME,
			uid INT, -- 用戶id
			-- 創建複合主鍵
			PRIMARY KEY(rid,uid), -- 聯合主鍵
			FOREIGN KEY (rid) REFERENCES tab_route(rid),
			FOREIGN KEY(uid) REFERENCES tab_user(uid)
		);

2. 數據庫設計的範式

	* 概念:設計數據庫時,需要遵循的一些規範。要遵循後邊的範式要求,必須先遵循前邊的所有範式要求

		設計關係數據庫時,遵從不同的規範要求,設計出合理的關係型數據庫,這些不同的規範要求被稱爲不同的範式,各種範式呈遞次規範,越高的範式數據庫冗餘越小。
		目前關係數據庫有六種範式:第一範式(1NF)、第二範式(2NF)、第三範式(3NF)、巴斯-科德範式(BCNF)、第四範式(4NF)和第五範式(5NF,又稱完美範式)。

	* 分類:
		1. 第一範式(1NF):每一列都是不可分割的原子數據項
		2. 第二範式(2NF):在1NF的基礎上,非碼屬性必須完全依賴於碼(在1NF基礎上消除非主屬性對主碼的部分函數依賴)
			* 幾個概念:
				1. 函數依賴:A-->B,如果通過A屬性(屬性組)的值,可以確定唯一B屬性的值。則稱B依賴於A
					例如:學號-->姓名。  (學號,課程名稱) --> 分數
				2. 完全函數依賴:A-->B, 如果A是一個屬性組,則B屬性值得確定需要依賴於A屬性組中所有的屬性值。
					例如:(學號,課程名稱) --> 分數
				3. 部分函數依賴:A-->B, 如果A是一個屬性組,則B屬性值得確定只需要依賴於A屬性組中某一些值即可。
					例如:(學號,課程名稱) -- > 姓名
				4. 傳遞函數依賴:A-->B, B -- >C . 如果通過A屬性(屬性組)的值,可以確定唯一B屬性的值,在通過B屬性(屬性組)的值可以確定唯一C屬性的值,則稱 C 傳遞函數依賴於A
					例如:學號-->系名,系名-->系主任
				5. 碼:如果在一張表中,一個屬性或屬性組,被其他所有屬性所完全依賴,則稱這個屬性(屬性組)爲該表的碼
					例如:該表中碼爲:(學號,課程名稱)
					* 主屬性:碼屬性組中的所有屬性
					* 非主屬性:除過碼屬性組的屬性
					
		3. 第三範式(3NF):在2NF基礎上,任何非主屬性不依賴於其它非主屬性(在2NF基礎上消除傳遞依賴)

數據庫的備份和還原

1. 命令行:
	* 語法:
		* 備份: mysqldump -u用戶名 -p密碼 數據庫名稱 > 保存的路徑
		* 還原:
			1. 登錄數據庫
			2. 創建數據庫
			3. 使用數據庫
			4. 執行文件。source 文件路徑
2. 圖形化工具:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章