資料庫:設計、優化和備份
目錄
4.E-R圖也稱實體-關係圖(Entity Relationship Diagram)
4.用exists替代in、用not exists替代not in
一、資料庫設計
1.為什麼需要資料庫設計?
俗話說有好的設計,才有好的優化,資料庫作為資訊系統的核心,其設計自然是重中之重。
2.資料庫設計的3大正規化
1NF:
- 所有的域都應該是原子性的,即資料庫表的每一列都是不可分割的原子資料項,而不能是集合、陣列、記錄等非原子資料項。
2NF:
- 第二正規化是在第一正規化基礎上更進一層。
- 第二正規化要確保資料庫表中的每一列都和主鍵相關,而不能至於主鍵的某一部分相關(主要針對聯合主鍵而言)。
- 也就是說在一個數據庫表中,一個表只能儲存一種資料,不可以把多種資料儲存在同一張資料庫表中。
3NF:
- 第三正規化要求每列都和主鍵直接相關而不是間接相關。
3.資料庫設計的步驟
需求分析階段
- 準確瞭解和分析使用者需求(包括資料與處理)。
- 是整個設計過程的基礎,是最困難、最耗時的一步。
概念結構設計階段
- 是整個資料庫設計的關鍵。
- 設計資料庫的E-R模型圖,確認需求資訊的正確和完整。
邏輯設計階段
- 將E-R圖轉換為邏輯模型(邏輯模型為關係模型則體現為多張表)
- 應用資料庫設計的3大正規化進行稽核
- 設計外模式,建立檢視
物理設計階段
- 確定存取方法(例如索引的設定)
- 確定儲存結構(檔案存放的位置等),並編寫程式碼實現前端應用
資料庫實施階段
- 將資料載入,並對資料庫進行測試。
執行和維護階段
- 使用和維護資料庫
4.E-R圖也稱實體-關係圖(Entity Relationship Diagram)
提供了表示實體型別、屬性和關係的方法,是用來描述現實世界的概念模型。
在E-R圖中有以下4個成分:
- 矩形框:表示實體,在框中記錄實體名
- 菱形框:表示關係,在框中記錄關係名
- 橢圓形框:表示實體或關係的屬性,將屬性名記入框中。對於主屬性名,則在其名稱下劃線。
- 連線:實體與屬性之間;實體與關係之間;關係與屬性之間用直線連線,並在直線上標註關係的類性。(對於一對一關係,要在兩個實體連線方向各寫1;對於一對多關係,要在一的一方寫1,多的一方寫N;對於多對多關係,要在兩個實體連線方向各寫N,M。)
- 如下圖:
5.實體之間的關係
一對一:個人資訊和檔案資訊
- 外來鍵新增唯一約束
- 讓主鍵做外來鍵
一對多:僱員和部門
- 主鍵作為外來鍵,外來鍵設定在多的一方。
多對多:學生和課程
- 建立關係表
- 關係表建立聯合主鍵
二、資料庫優化
1.select 字句中避免使用(*)
比如oracle在解析過程中,會將(*)依次轉換成所有的列名,這個工作通過查詢資料字典完成的,這意味著將耗費更多的時間。
2.索引失效的情況
- 索引列使用 not / != / <> / > / < / not null / null:如果某列建立索引,當進行select * from emp where deptno is not null / is null,則索引會失效。
- 索引列上不要使用函式,如下均會失效
- select col from tbl where substr(name,1,3)='abc';
- select col from tbl where name like '%abc%';
- select col from tbl where name like 'abc%';#這個索引會生效
- 索引列上不能進行計算
3.用UNION替換OR(使用於索引列)
通過情況下用UNION替換where字句中的or將會起到較好的效果,對索引列使用or將造成全表掃描。注意,這個規則只針對多個索引列有效。如果有列沒有被索引,查詢效率可能會因為你沒有使用or而降低。
4.用exists替代in、用not exists替代not in
在許多基於基礎表的查詢中,為了滿足一個條件,往往需要對另一個表進行連線,在這種情況下,使用exists(或not exists)通常將提高查詢的效率。
在子查詢中,not in字句將執行一個內部的排序和合並,無論在哪種情況下,not in 都是最低效的(因為它對子查詢中的表執行了一個全表遍歷)。為了避免使用not in,我們可以把它改外連線或not exits。
高效:select * from emp where exists (select 'x' from dept where dept.deptno = emp.deptno and loc='melb');
低效:select * from emp where deptno in (select deptno from dept where loc='melb');
三、備份和還原
備份命令:mysqldump -uroot -proot dbname > d:/t.sql
還原命令:mysql -uroot -p < d:/t.sql