MySQL數據庫——數據庫的設計(多表之間的關係與三大範式)與備份還原

目錄

1 數據庫的設計

1.1 多表之間的關係

1.2 數據庫設計的範式

2 數據庫的備份與還原


1 數據庫的設計

數據庫中存放很多表,設計數據庫就是設計表,而表就是對現實事物的抽象,設計數據庫,需要明白表的關係,也要知道數據庫的設計準則,即範式。數據庫設計的好壞關係到項目開發效率與運行的好壞。

1.1 多表之間的關係

  • 一對一(瞭解):如,人和身份證;
  • 一對多(多對一):如,部門和員工,一個部門有多個員工,一個員工只能對應一個部門;
  • 多對多:如,學生和課程,一門課程可以被多個學生選擇,一個學生可以選擇多門課程;

1、一對多(多對一)

【實現方式】:在多的一方建立外鍵,指向一的一方的主鍵。

【舉例】:實現部門和員工的實現關係,分析示意如下:

2、多對多

【實現方式】:需要藉助第三張中間表,中間表至少包含兩個字段,這兩個字段作爲第三張表的外鍵,分別指向兩張表的主鍵。

【舉例】:學生表的實現關係,分析示意如下:

3、一對一

【實現方式】:可以在任意一方添加一個唯一外鍵指向另一方的主鍵。這種情況用到比較少,瞭解即可,涉及到這種應用場景,合成一張表更合適些。

【舉例】:學生與身份證的實現關係,分析示意如下:

4、多表關係案例

分析旅遊線路問題,假設旅遊線路有很多分類,且用戶可以收藏對應的旅遊線路,這裏就涉及到三張表:旅遊線路分類、旅遊線路、用戶,分析示意圖如下:分類和具體線路是一對多關係,線路和用戶是多對多關係。

【SQL語句】:

-- 創建旅遊線路分類表 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工具可以查看錶結構如下:

1.2 數據庫設計的範式

在數據庫設計時需要遵循的規則,就是數據庫範式,要遵循後邊的範式要求,必須先遵循前邊的所有範式要求,借用百度百科概念:

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

1、第一範式(1NF):數據庫表的每一列都是不可分割的原子數據項,如下表:

以上表存在的問題:

  • 存在嚴重數據冗餘(重複):姓名、系名、系主任;
  • 數據添加存在問題,如添加一個新開設的系和系主任時,數據不合法;
  • 數據刪除存在問題,如張無忌畢業了,刪除數據,會將系的數據一起刪除。

2、第二範式(2NF):在1NF的基礎上,非碼屬性必須完全依賴於碼(在1NF基礎上消除非主屬性對主碼的部分函數依賴

先介紹幾個概念:

  • 函數依賴:A-->B,如果通過A屬性(屬性組)的值,可以確定唯一B屬性的值,則稱B依賴於A;
           例如:學號-->姓名;(學號,課程名稱)-->分數;
  • 完全函數依賴:A-->B,如果A是一個屬性組,則B屬性值得確定需要依賴於A屬性組中所有的屬性值;
            例如:(學號,課程名稱)-->分數;
  • 部分函數依賴:A-->B,如果A是一個屬性組,則B屬性值得確定只需要依賴於A屬性組中某一些屬性值即可;
            例如:(學號,課程名稱)-->姓名;
  • 傳遞函數依賴:A-->B,B-->C,如果通過A屬性(屬性組)的值,可以確定唯一B屬性的值,再通過B屬性(屬性組)的值可以確定唯一C屬性的值,則稱C傳遞函數依賴於A;
            例如:學號-->系名,系名-->系主任;
  • 碼:如果在一張表中,一個屬性或屬性組,被其他所有屬性所完全依賴,則稱這個屬性(屬性組)爲該表的碼;
            例如:該表中碼爲:(學號,課程名稱)
            主屬性:碼屬性組中的所有屬性;
            非主屬性:除過碼屬性組的屬性;

根據第二範式要求,重新規劃的表如下,但是後兩個問題還是沒有得到解決:

3、第三範式(3NF):在2NF基礎上,任何非主屬性不依賴於其它非主屬性(在2NF基礎上消除傳遞依賴

2 數據庫的備份與還原

數據庫的備份與還原操作一般是由DBA負責,備份是爲了防止因機器故障等造成數據丟失,所以一般每一天都會將數據庫中 的數據保存在文件中,當出現問題時用文件進行數據庫的還原。

1、命令行的方式:

  • 備份:mysqldump -u用戶名 -p密碼 數據庫名稱 >保存的路徑;
  • 還原:登錄數據庫->創建數據庫->使用數據庫->執行文件: source 文件路徑
C:\Users\think>mysqldump -uroot -proot db1 > d://a.sql
C:\Users\think>mysql -uroot -proot
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db1                |
| db2                |
| db4                |
| mysql              |
| performance_schema |
| test               |
+--------------------+
7 rows in set (0.00 sec)

mysql> drop database db1;
Query OK, 9 rows affected (0.05 sec)

mysql> create database db1;
mysql> use db1;
mysql> source d://a.sql;
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db1                |
| db2                |
| db4                |
| mysql              |
| performance_schema |
| test               |
+--------------------+
7 rows in set (0.00 sec)

mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| department    |
| emp           |
| employee      |
| stu           |
| student       |
| tab_category  |
| tab_favorite  |
| tab_route     |
| tab_user      |
+---------------+
9 rows in set (0.00 sec)

2、圖形化的方式:

備份:

還原:

———————————————————————————————————————

本文爲博主原創文章,轉載請註明出處!

若本文對您有些許幫助,輕擡您發財的小手,關注/評論/點贊/收藏,就是對我最大的支持!

祝君升職加薪,鵬程萬里!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章