MySQL 第七篇:數據庫設計、視圖與觸發器

本篇內容由猿道教育的課程內容整理而來。
我把MySQL的內容整理成9篇博客,學完這9篇博客雖不能說能成爲大神,但是應付一般中小企業的開發已經足夠了,有疑問或建議的歡迎留言討論。

數據庫設計

數據庫設計,一個軟件項目成功的基石。
爲了建立冗餘較小、結構合理的數據庫,設計數據庫時必須遵循一定的規則。在關係型數據庫中這種規則就稱爲範式。範式是符合某一種設計要求的總結。要想設計一個結構合理的關係型數據庫,必須滿足一定的範式。

一、第一範式:確保每列的原子性。

如果每列(或者每個屬性)都是不可再分的最小數據單元(也稱爲最小的原子單元),則滿足第一範式.簡記爲1NF。
例如:學員表(姓名、編號、地址、……)其中"地址"列還可以細分爲國家、省、市、區等。

二、第二範式:在第一範式的基礎上更進一層,非主屬性完全依賴於主關鍵字

如果一個關係滿足第一範式,並且除了主鍵以外的其它列,都依賴於該主鍵,則滿足第二範式,目標是確保表中的每列都和主鍵相關,簡記爲2NF。

三、第三範式:在第二範式的基礎上更進一層,目標是確保每列都和主鍵列直接相關,而不是間接相關。

如果一個關係滿足第二範式,並且除了主鍵以外的其它列都不依賴於非主屬性,則滿足第三範式.簡記爲3NF。
注意:滿足範式要求的數據庫設計是結構清晰的,同時可避免數據冗餘和操作異常。這並不意味着不符合範式要求的設計一定是錯誤的,在數據庫表中 比如 一對一 或一對多關係的這種情況下,合併導致的不符合範式要求反而是合理的。

落實這些原則

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

視圖

一、視圖的概念

1、理解視圖

  • 視圖與表有很多相似的地方,視圖也是由若干字段以及若干記錄構成的,它也可以作爲select語句的數據源。甚至在某些特定情況下,可以通過視圖對錶進行更新操作。
  • 視圖保存的僅僅是一條select語句,其源數據都來自於數據庫表,數據庫表稱爲基本表或者基表,視圖稱稱爲虛表。基表數據發生變化,虛表也會隨之變化。

2、視圖作用
a.使操作變得簡單(可以將複雜的select語句封裝到視圖)
b.避免數據冗餘(可以由一個基表或者多個基表產生多種針對性的視圖)
c.增強數據安全性(爲不同的用戶分配不通的視圖,增強了數據的安全訪問控制)
d.提高數據的邏輯獨立性(使應用程序與數據邏輯獨立)

二、視圖的操作

1、創建視圖
create view 視圖名[(視圖字段列表)] as select語句
爲了區分視圖與基本表,在命名視圖時,建議加前綴“view_”或者“v_”
2、查看視圖
describe 視圖名
3、刪除視圖
drop view 視圖名

/*
視圖 一張虛表 保存的是select 的sql語句
*/

create view v_studentsInfo 
AS
select s.s_id,s.s_name,s.age,s.height,s.sex,c.class_name from students s,class c
where s.class_id = c.class_id

drop view v_studentsInfo;//刪除視圖
-- 視圖也被稱爲虛表,實際的表稱爲基表 一個結果集
select * from v_studentsInfo where sex=1;

觸發器

一、觸發器的概念

1、理解觸發器
mysql5.0新增的功能,觸發器定義了一系列的操作,這一系列的操作稱爲觸發程序,當觸發事件發生時,觸發程序自動運行。
2、作用
觸發器主要用於監視某個表的insert、update、delete等更新操作,這些操作可以分別激活該表的insert、update或者delete類的觸發程序運行,從而實現數據自動維護。

二、觸發器的操作

1、創建觸發器

create trigger 觸發器名 觸發時機 觸發事件 on 表名 for each row
begin
觸發程序
end;
解釋:

  • 觸發時機:before與after;
  • 觸發事件:insert、update、delete;
  • for each row表示行級觸發器;
-- 當學生表新增數據時,我們在對應的班級表中更新班級的人數
create trigger tri_stu_insert before insert on students for each ROW
BEGIN
	update class  set class_num= class_num+1 where class_id=new.class_id;
end;
//再執行新增語句時,班級表對應的班級人數會更新
insert into students values('J1604023','賢',28,175,0,4)

注意:

  • 使用old和new關鍵字對記錄進行操作。new.字段名或者old.字段名。 old記錄是隻讀的。
  • new記錄只有是before類型時才能更改值。
-- 當數據更新之前,將原有數據備份到students_bak
create trigger tri_stu_update after update on students for each ROW
BEGIN
	insert into students_bak values(old.s_id,old.s_name,old.age,old.height,old.sex,old.class_id);
end;

2、查看觸發器的定義
show create trigger 觸發器名稱;
3、刪除觸發器
drop trigger 觸發器名;

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