1. 程式人生 > 資料庫 >MySQL第八課 資料庫的設計,多表關係

MySQL第八課 資料庫的設計,多表關係

文章來自: 培訓資料 2018年4月某傳某智教育某黑某馬java\2.javaweb\2-2MySQL

參考書:《MySQL從入門到精通》 

返回知識列表:


八 資料庫的設計

8.1 多表之間的關係

        1. 分類:
            1. 一對一(瞭解):
                * 如:人和身份證
                * 分析:一個人只有一個身份證,一個身份證只能對應一個人
            2. 一對多(多對一):
                * 如:部門和員工
                * 分析:一個部門有多個員工,一個員工只能對應一個部門

            3. 多對多:
                * 如:學生和課程
                * 分析:一個學生可以選擇很多門課程,一個課程也可以被很多學生選擇
        2. 實現關係:
            1. 一對多(多對一):
                * 如:部門和員工
                * 實現方式:在多的一方建立外來鍵,指向一的一方的主鍵。

            2. 多對多:
                * 如:學生和課程
                * 實現方式:多對多關係實現需要藉助第三張中間表。中間表至少包含兩個欄位,這兩個欄位作為第三張表的外來鍵,分別指向兩張表的主鍵

            3. 一對一(瞭解):
                * 如:人和身份證
                * 實現方式:一對一關係實現,可以在任意一方新增唯一外來鍵指向另一方的主鍵。如果出現了1對1的關係,那應該將兩張表合成一張表。

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

從SQLyog工具中,通過架構設計器可以更清楚的檢視現在的設計結果:

8.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基礎上消除傳遞依賴)


8.3 資料庫的備份和還原

    1. 命令列:
        * 語法:
            * 備份: mysqldump -u使用者名稱 -p密碼 資料庫名稱 > 儲存的路徑
            * 還原:
                1. 登入資料庫
                2. 建立資料庫
                3. 使用資料庫
                4. 執行檔案。source 檔案路徑
    2. 圖形化工具: