第一章睬捶、引言
- 數(shù)據(jù)庫系統(tǒng)有一個相互關聯(lián)的數(shù)據(jù)的集合和一組用以訪問這些戴護具的程序組成褥紫。這個數(shù)據(jù)集合通常稱為數(shù)據(jù)庫宾符。DBS主要的目的是提供一種方面藻烤、高效的存取是數(shù)據(jù)庫通常稱為數(shù)據(jù)庫。
- 數(shù)據(jù)庫系統(tǒng):DBMS數(shù)據(jù)庫管理系統(tǒng)爽雄,管理員蝠检,開發(fā)的軟件。
1.1 文件管理系統(tǒng)壞處
- 數(shù)據(jù)的冗余和不一致
- 數(shù)據(jù)訪問困難
- 數(shù)據(jù)孤立
- 完整性問題
- 原子性問題
- 并發(fā)訪問異常
- 安全性問題
1.2 數(shù)據(jù)視圖
- 數(shù)據(jù)抽象:物理層描述數(shù)據(jù)實際上是怎樣存儲的挚瘟。 邏輯層描述數(shù)據(jù)庫中存儲什么數(shù)據(jù)及這些數(shù)據(jù)間存在什么關系叹谁。視圖層只描述數(shù)據(jù)庫的某個部分。物理數(shù)據(jù)獨立性乘盖、邏輯數(shù)據(jù)獨立性
- 最后焰檩,在視圖層。計算機用戶看見的是為其屏蔽了數(shù)據(jù)類型細節(jié)的一組應用程序订框。除了屏蔽數(shù)據(jù)庫的邏輯層細節(jié)之外析苫,視圖還提供了防止用戶訪問數(shù)據(jù)庫的某些部分的安全性機制。
- 特定時刻存儲在數(shù)據(jù)庫中的信息的集合稱作數(shù)據(jù)庫的一個實例穿扳,而數(shù)據(jù)庫的總體設計稱作數(shù)據(jù)庫模式衩侥。
1.3 數(shù)據(jù)模型
- 數(shù)據(jù)庫結(jié)構(gòu)的基礎是數(shù)據(jù)模型。數(shù)據(jù)模型是一個描述數(shù)據(jù)矛物、數(shù)據(jù)聯(lián)系茫死、數(shù)據(jù)語義以及一致性約束的概念工具的集合。數(shù)據(jù)模型提供了一種描述物理層履羞、邏輯層及視圖表達層數(shù)據(jù)庫設計的方式峦萎。
- 關系模型。用表的集合表示數(shù)據(jù)和數(shù)據(jù)之間的聯(lián)系忆首。是基于記錄的模型的一種
- E-R實體-聯(lián)系模型
- 基于對象的數(shù)據(jù)模型
- 半結(jié)構(gòu)化數(shù)據(jù)模型
1.4 數(shù)據(jù)庫語言
- DDL定義數(shù)據(jù)庫模式爱榔,以及數(shù)據(jù)庫操縱語言(DML)來表達數(shù)據(jù)庫查詢和更新
- DDL的一些一致性約束:域約束、參照完整性糙及、斷言详幽、授權。DDL的輸出放在數(shù)據(jù)字典中丁鹉,數(shù)據(jù)字典包含了元數(shù)據(jù)妒潭,元數(shù)據(jù)是關于數(shù)據(jù)的數(shù)據(jù)。
- DML分為過程化DML揣钦,要求用戶指定需要什么數(shù)據(jù)及如何獲得這些數(shù)據(jù)雳灾。聲明式DML(非過程化)只要求用戶指定需要什么數(shù)據(jù),而不指明如何獲得這些數(shù)據(jù)冯凹。
- 查詢是要求對信息進行檢索的語句谎亩。DML中涉及信息檢索部分稱作查詢語言。
第二章宇姚、關系模型介紹
- 數(shù)據(jù)模型是描述數(shù)據(jù)匈庭、數(shù)據(jù)聯(lián)系、數(shù)據(jù)語義以及一致性約束的概念工具的集合浑劳。
2.1 關系數(shù)據(jù)庫的結(jié)構(gòu)
- 關系數(shù)據(jù)庫由表的集合組成表中一行代表了一組值之間的一種聯(lián)系阱持。由于一個表就是這種聯(lián)系的一種集合,表這個概念和數(shù)學上的關系這個概念是緊密相連的魔熏,元組只是一組值的序列衷咽。
- 關系用來指代表,而元組用來指代行蒜绽。屬性指代的表中的列镶骗。屬性位置不重要。因為關系是元組集合躲雅,所以元組在關系中出現(xiàn)的順序是無關緊要的鼎姊。
- 對于關系的每個屬性,都存在一個取值的集合相赁,稱為該屬性的域
- 關系實例這個術語用來代表一個關系的特定實例相寇。
- 關系是笛卡兒積的子集
- 要求對所有關系r而言,r的所有屬性的域都是原子的噪生。如果域中元素被看作是不可再分的單元裆赵,而域是原子的。
- null空值代表一種特殊的值跺嗽,一種狀態(tài)战授。表示未知或不存在。
2.2 數(shù)據(jù)庫模式
- 數(shù)據(jù)庫模式是數(shù)據(jù)庫的邏輯設計桨嫁,數(shù)據(jù)庫實例是給定時刻數(shù)據(jù)庫中數(shù)據(jù)的一個快照
- 關系的概念對應程序設計語言中變量的概念植兰,關系模式對應于類型定義的概念,關系實例的概念是變量的值的概念
2.3 碼
- r(R) r是關系實例璃吧,R是關系模式
- 一個元組的屬性值必須是能唯一區(qū)分元組的楣导,一個關系中沒有兩個元組在所有屬性上的取值都相同
- 超碼是一個或多個屬性的集合,這些屬性的組合可以使我們在一個關系中唯一標識一個元組畜挨。
- 有一些超碼筒繁,他們的任意真子集都不能稱為超碼噩凹,這樣的最小超碼稱為候選碼。出現(xiàn)在任何一個候選碼中的屬性-->主屬性
- 幾個不同的屬性集都可以用作候選碼的情況是存在的毡咏。
- 用主碼這個術語來代表被數(shù)據(jù)庫設計者選中的驮宴、主要用來在一個關系中區(qū)分不同元組的候選碼。碼是整個關系的一種性質(zhì)呕缭,而不是單個元組的性質(zhì)堵泽。
- 主碼應該選那些值從不或很少變化的屬性。
- 完整性約束包括完整性約束:主碼的屬性不能為空恢总,參照完整性約束/子集依賴:在參照關系上的任意元組在特定屬性上的取值必然等于被參照關系中某個元組在特定屬性上的取值或null迎罗。不同于外碼依賴,參照完整性約束不要求依賴的一定是主碼片仿。
- 一個關系模式(r1)可能在他的屬性中包括另一個關系模式(r2)的主碼纹安。這個屬性在r1上稱作參照r2的外碼。關系r1也稱為外碼依賴的參照關系砂豌,r2叫做外碼的被參照關系钻蔑。
第三章、SQL
3.1 SQL 查詢語言概覽
sql是數(shù)據(jù)庫查詢語言奸鸯。有以下幾個部分:
- 數(shù)據(jù)定義語言(DDL):定義關系模式咪笑、刪除關系、修改關系模式娄涩、每個屬性的取值類型窗怒、每個關系維護的索引集合、每個關系的安全性和權限信息蓄拣、每個關系在磁盤上的物理存儲結(jié)構(gòu)扬虚。
- 數(shù)據(jù)操縱語言(DML):從數(shù)據(jù)庫中查詢信息,在數(shù)據(jù)庫中插入元組球恤、刪除元組辜昵、修改元組的部分。
- 完整性:sql DDL包括定義完整性約束的命令舀锨,破壞完整性的更新是不被允許的。
- 視圖定義
- 事務控制
- 嵌入式sql忽然動態(tài)sql:sql如何嵌入到通用編程語言承桥。
- 授權:sql DDL包括定義對關系和視圖的訪問權限的命令玄柏。
3.2 SQL數(shù)據(jù)定義
3.2.1基本類型
- char(n) 固定長度字符串◇空格補位
- varchar(n) 可變長度字符串驯遇。不補位
- int
- smallint
- numeric(p,d)定點數(shù)
- real,double precision :浮點數(shù)和雙精度浮點數(shù)
- float(n)精度至少為n位的浮點數(shù)
char和char比較時,長度不同追加空格 反璃。char和varchar比較可能返true裁眯、false。建議使用varchar而不是char來解決問題搔课。
3.2.2基本模式定義
- primary key(A1,A2...An)
- foreigh key(A1,A2...An) references:
- not null
- create
- sql允許為屬性指定默認值
mysql> create table d(
-> good varchar(20),
-> g varchar(20) not null,
-> primary key(good,g)
-> );
create table b(
course_id varchar(20),
tot_cred numeric(3,0) default 0,
foreign key(course_id) references d
);
- insert爬泥∏埽可以在查詢結(jié)果的基礎上加入元組赏胚。在執(zhí)行插入前執(zhí)行完select語句很重要。沒有被賦值的屬性為空辞友。
insert into wang values("L",15,69);
insert intp wang(a,b,c) values("L",15,69); //推薦
mysql> insert into list(id)
-> select id
-> from consumer;
- delete,刪除關系中所有元祖。
- drop刪除表
- alter 在表中增加震肮、刪除列称龙。新屬性的值為null
- 在執(zhí)行刪除前先執(zhí)行所有元組的測試很重要
delete from wang where name='Liu';
drop table wang;
alter table user add good varchar(20);
alter table user drop good;
- update,必須在更新前檢查關系中的所有元組
mysql> update list
-> set days=1
-> where days=2;
- case語句可以用在任何應該出現(xiàn)值的地方。有條件沒有被覆蓋戳晌,返回null
mysql> update student S
-> set tot_cred=(
-> select case when sum(credits) is not null then sum(credits)
else 0
end
-> from takes natural join course
-> where S.ID=takes.ID and
-> takes.grade<>'F' and takes.grade is not null);
3.3 sql查詢的基本結(jié)構(gòu)
3.3.1 單關系查詢
- 一般sql不去重distinct 顯示去重鲫尊,all顯示不去重
select distinct id from list;
select all id from list;
- 支持+,-沦偎,*疫向,/。邏輯詞and,or,not豪嚎。比較運算符<,>,<=,>=,<>.
mysql> select no*2 from list
-> where no>1000 and days<>1;
3.3.2 多關系查詢
- from語句定義了一個在該語句中所列出關系的笛卡爾集搔驼。where中的謂詞限制笛卡爾集的集合造寝。在屬性前加前綴區(qū)分屬性來自哪個關系珍逸。sql會通過只產(chǎn)生滿足where子句的笛卡爾元素優(yōu)化執(zhí)行上煤。
- 邏輯順序 from--where--group by--having--order by--select 所有運算都是表運算库车,輸入輸出都是一個表歹嘹。
select name,course_id
from instructor,teachers
where instructor.ID=teaches.ID
3.3.3 自然連接
- 只取在共同屬性上取值相同的元組對征唬。列出的屬性順序:共同的--第一個--第二個
- join...using需要一個屬性列表谨履,允許用戶來確定哪些列相等
mysql> select *
-> from consumer natural join list;
mysql> select *
-> from consumer join list using(id)
-> ;
3.4 附加基本運算
- 更名運算 as.可以出現(xiàn)在select笛求、from中
- 字符串運算革为。用雙引號代表單引號扭粱。大小寫敏感。串接||震檩、upper(s)琢蛤、lower(s)、trim(s). like/not like模式匹配。百分號:匹配任意字串虐块。_匹配任意一個字符. 允許轉(zhuǎn)義字符俩滥,直接在特殊字符前面,表示特殊字符為普通字符贺奠,escape定義轉(zhuǎn)義字符
- order by. 默認升序 desc降序 asc升序
- [not]between....and閉區(qū)間
- (a,b,...c)n維元組霜旧,可以按字典序比較運算
mysql> select T.sex as bala
-> from consumer as c,consumer as t
-> where c.sex=t.sex and t.name='王文萱';
mysql> select * from list where id like '211%';
mysql> select * from list
-> order by id desc,no asc;
mysql> select * from list
-> where no not between 1000 and 1001;
mysql> select * from instructor,teaches
-> where (instructor.ID,dept_name)=(teaches.ID,'Biology');
3.5 集合運算
- union
- intersect
- except
全部自動去重,后面加上all不去重儡率。
3.6 空值
- 算術表達式的任一輸入為空挂据,結(jié)果為空。
- SQL設計控制任何比較運算的結(jié)果為unknown(既不是is null,也不是is not null),這創(chuàng)建了除true和false外的第三個邏輯值儿普。
- 如果子句謂詞對一個元組計算出false或unknown崎逃,則該院組不能加入結(jié)果集中。
- 用is null和not is null判斷是否是null值眉孩。用is unknown和not is unknown判斷是否是unknow值
- 當一個查詢使用select distinct 語句時个绍,重復元組將被去除。為了達到這個目的浪汪,當比較兩個元組對應的屬性值時巴柿,如果這兩個元組都是非空且值相等,或者都是為空死遭,那么它們是相同的广恢。所以諸如{(A,null),(A,null)}這樣的兩個元組拷貝被認為是相同的,即使在某些屬性上存在空值呀潭。使用distinct子句會保留這樣的相同元組的一份拷貝钉迷。
mysql> select * from list
-> where no is unknown;
mysql> select * from list
-> where no is null;
3.7 聚集函數(shù)
- avg
- min
- max
- count
- sum
- sum和avg的輸入必須是數(shù)字集
- 聚集函數(shù)以以下規(guī)則處理空值:除了count(*)外所有的聚集函數(shù)都忽略輸入集合的空值。規(guī)定空集的count為0钠署,其它所有聚集函數(shù)在輸入為空集的情況下返回一個空值糠聪。
- 任何出現(xiàn)在having子句中,但沒有被聚集的屬性必須出現(xiàn)在group by中
- 任何出現(xiàn)在select子句中谐鼎,但沒有被聚集的屬性必須出現(xiàn)在group by中
- having子句中的謂詞只有在形成分組后才起作用
- 使用關鍵字distinct可以刪除重復元素枷颊,不允許在count(*)時使用distinct.
- group by子句中給出一個或多個屬性是用來構(gòu)造分組的。
3.8 嵌套子查詢该面,
- 子查詢在where子句中夭苗,通常對成員資格、集合的比較以及集合的基數(shù)進行檢查隔缀。
- 集合成員資格:in /not in 測試是否是集合中的成員题造。也可用于枚舉集合,在SQL測試任意關系的成員資格也是可以的猾瘸。
mysql>
mysql> select distinct course_id
-> from section
-> where semester='Fall' and year='2009'
-> and course_id in(select distinct course_id
-> from section
-> where semester='Spring' and year=2010);
mysql> select distinct name
-> from instructor
-> where name not in('Wang','Wen');
mysql>
mysql> select count(distinct ID)
-> from takes
-> where (course_id,sec_id,semester,year)in(select course_id,sec_id,semester,year
-> from teaches
-> where teaches.ID=10101);
- 集合的比較
- 至少比某一個要大/小/相等用some表示界赔。<>some不等價not in,=some等價in
- 至少比所有要大/小/相等用all表示丢习。<>all等價not in,=some不等價in
mysql> select name
-> from instructor
-> where salary>some(select salary
-> from instructor
-> where dept_name='Biology')
-> ;
mysql> select dept_name
-> from instructor
-> group by dept_name
-> having avg(salary)>all(
-> select avg(salary)
-> from instructor
-> group by dept_name);
- 空關系測試 exists 參數(shù)的子查詢非空時返回true/not exists
- 來自外層循環(huán)的一個相關名稱可以用在where的子查詢中。使用了外層查詢相關名稱的查詢?yōu)橄嚓P子查詢淮悼。如果一個相關名稱在外層和子查詢中定義咐低,則子查詢中定義有效。
- 關系A包含關系B not exists(B except A)
select name
from student
where not exists(
(
select course_id
from course
where dept_name='Biology'
)
except
(
select T.course_id
from takes as T
where S.ID=T.ID
)
);
- 重復元組存在性測試袜腥。sql提供一個布爾函數(shù)见擦,用于測試在一個子查詢的結(jié)果中是否存在重復元組。如果作為參數(shù)的子查詢結(jié)果中沒有重復的元組羹令、unique結(jié)構(gòu)將返回true值鲤屡。在空集上計算出真值。還有not unique.對一個unique測試結(jié)果為假的定義是福侈,當且僅當在關系中存在這兩個元組t1和t2,且t1=t2.由于在t1或t2的某個域為空時酒来,判斷t1=t2為假,所以盡管一個元組有多個副本肪凛,只要該元組有一個屬性為空unique測試可能為真堰汉。
select T.course_id
from course as T
where unique(select R.course_id
from section as R
where T.course_id=R.course_id and R.year=2009);
- from語句中的子查詢。任何select-from-where表達式返回的結(jié)果都是關系伟墙,因而可以被插入到另一個select-from-where中任何關系可以出現(xiàn)的位置翘鸭。
- 可以用as子句給子查詢的結(jié)果關系起個名字。
- from子句嵌套的子查詢中不能使用來自from子句其它關系的相關變量远荠。加入lateral作為前綴矮固,可以訪問from子句中在它前面的表或子查詢中的屬性失息。
- with子句提供定義臨時關系的方法譬淳。
- SQL允許子查詢出現(xiàn)在單個值的表達式可以出現(xiàn)的任何地方,只要子查詢只返回單個屬性的單個元組盹兢;這樣的子查詢稱為標量子查詢邻梆。select、where绎秒、having子句都可以使用標量子查詢浦妄。
select dept_name
from (select dept_name,avg(salary) as avg_salary
from instructor
group by dept_name)
as dept_avg(dept_name,avg_salary)
where avg_salary>42000;
select dept_name
from (select dept_name,avg(salary) as avg_salary
from instructor
group by dept_name)
where avg_salary>42000;
select name
from instructor I1,lateral (select avg(salary) as avg_salary
from instructor I2
where I2.dept_name=I1.dept_name);
with dept_total(dept_name,value) as
(select sept_name,sum(salary)
from instructor
group by dept_name),
dept_total_avg(value) as
(select avg(value)
from dept_total)
select dept_name
from dept_total,dept_total_avg
where dept_total.val>=dept_total_avg.value;
3.8 其他sql
- 展示建表語句
show create table XXX
第四章、中級SQL
4.1 連接表達式
- on條件允許在參與連接的關系上設置通用的謂詞
- 外連接運算與我們已經(jīng)學過的連接運算類似见芹,但通過在結(jié)果中創(chuàng)建空值元組的方式剂娄,保留了那些在連接中丟失的元組。
- 實際上有三種形式的外連接
左外連接(left join) | 只保留出現(xiàn)在左連接之前的關系中的元組 |
---|---|
右外連接(right join) | 只保留出現(xiàn)在右外連接之后的關系中的元組 |
全外連接(full join) | 保留出現(xiàn)在兩個關系中的元組 |
- 我們之前學過的不保留未匹配元組的連接運算稱為內(nèi)連接運算
我們可以按照如下方式計算左外連接運算:
首先玄呛,像前面那樣計算出內(nèi)連接的結(jié)果阅懦;然后,對于在內(nèi)連接的左側(cè)關系中任意一個與右側(cè)關系中任何元組都不匹配的元組t,向連接結(jié)果中加入一個元組r,r的構(gòu)造如下:
- 元組r從左側(cè)關系得到的屬性為t中的值
- r的其它屬性被設為空值
- on子句可以與外連接一起使用徘铝,與where中使用條件表現(xiàn)不同
- 當join子句中沒有使用outer前綴耳胎,默認的連接類型就是inner join
- 任意的連接形式可以與任意的連接條件進行組合
連接類型 | 連接條件 |
---|---|
inner join惯吕、left outer join、right outer join怕午、full outer join | natural废登、on、using |
mysql> select *
-> from consumer join list on consumer.id=list.id;
mysql> select *
-> from(select *
-> from list)
-> natural full outer join
-> (select *
-> from consumer);
4.2 視圖
- 為了向用戶隱藏部分信息
- https://blog.csdn.net/kanglovejava/article/details/52961244
- SQL允許通過查詢來定義“虛關系”郁惜。它在概念上包含查詢的結(jié)果堡距。虛關系并不預先計算并存儲,而是在使用虛關系的時候才通過查詢被計算出來扳炬。任何不是邏輯模型的一部分吏颖,但作為虛關系對用戶可見的關系稱為視圖。
- 視圖關系在概念上包含查詢結(jié)果中的元組恨樟,但并不預先計算和存儲。相反劝术,數(shù)據(jù)庫系統(tǒng)存儲與視圖關系相關聯(lián)的查詢表達式缩多。當視圖關系被訪問時,其中的元組是計算查詢結(jié)果而被創(chuàng)建出來的养晋。
- 一旦創(chuàng)建了視圖衬吆,我們就可以使用視圖名指代該視圖生成的虛關系,視圖名可以出現(xiàn)在任何關系名出現(xiàn)的地方绳泉。視圖的屬性名可以限定逊抡。
- 可以在視圖定義的末尾加上with check option.這樣,如果不滿足check約束零酪,更新被拒絕冒嫡。
mysql> create view f as
-> select * from list;
Query OK, 0 rows affected (0.13 sec)
mysql> create view w(id) as
-> select id from list;
Query OK, 0 rows affected (0.05 sec)
mysql> select * from w;
mysql> select * from f四苇;
mysql> create view g as
-> select *
-> from list
-> where no<2000
-> with check option;
Query OK, 0 rows affected (0.08 sec)
mysql> insert into g(id,no) values('211022199906030548',5000);
ERROR 1369 (HY000): CHECK OPTION failed 'haha.g'
4.2.3 物化視圖
特定數(shù)據(jù)庫系統(tǒng)允許存儲視圖關系孝凌,但是它們保證:如果用于定義視圖的實際關系改變,視圖也跟著修改。這樣的視圖成為物化視圖
保護物化視圖一直在更新狀態(tài)的過程稱為物化視圖維護月腋,或者簡稱視圖維護
那些需要快速響應基大于關系上聚集運算的特定查詢也會從創(chuàng)建和查詢對應物化視圖受益良多蟀架。
物化視圖帶來的好處還需要和存儲代價和增加的更新開銷相權衡。
4.2.4 視圖更新
如果定義視圖的查詢對下列條件滿足榆骚,我們稱視圖是可更新的:
- from 子句中只有一個數(shù)據(jù)庫關系
- select 子句中只包括關系的屬性名片拍,不包含任何表達式、聚集和distinct聲明
- 任何沒有出現(xiàn)在select子句中的屬性可以取空值妓肢;即這些屬性上沒有not null約束捌省,也不構(gòu)成主碼的一部分。
- 查詢中不含有group by 和having子句
4.3 事務
SQL規(guī)定當一條SQL語句被執(zhí)行职恳,就隱式的開始了一個事務
下列SQL語句會結(jié)束一個事務
commit work:提交當前事務所禀,也就是將該事物所做的更新在數(shù)據(jù)庫中持久保存方面。在事物被提交后,一個新的事物自動開始
rollback work:回滾當前事務色徘,也就是撤銷該事務中所有SQL語句對數(shù)據(jù)庫的更新恭金,就恢復到執(zhí)行該事務第一語句之前的狀態(tài)。
關鍵詞work可選
一個事務或者在完成所有步驟后提交其行為褂策,或者在不能成功完成其所有動作的情況下回滾其所有動作横腿,通過這種方式數(shù)據(jù)庫提供了對事務具有原子性的抽象,原子性即不可分割性斤寂。
要么所有事務的所有影響被反映到數(shù)據(jù)庫中耿焊,要么任何影響都沒有(在回滾之后)
允許將所有SQL語句加載begin atomic……end之間。關鍵字之間的語句構(gòu)成了單一事務遍搞。
mysql> start transaction;
Query OK, 0 rows affected (0.08 sec)
mysql> insert into exam values(2);
Query OK, 1 row affected (0.03 sec)
mysql> rollback;
Query OK, 0 rows affected (0.06 sec)
mysql> select * from exam;
+------+
| id |
+------+
| 1 |
+------+
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> update exam set id=2 where id=1;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> commit;
Query OK, 0 rows affected (0.06 sec)
mysql> select * from exam;
+------+
| id |
+------+
| 2 |
+------+
1 row in set (0.00 sec)
4.4 完整性約束
alter語句可以更改約束條件罗侯,add也是在加入列的同時加入約束條件。不是直接加約束條件的意思溪猿。當執(zhí)行命令時钩杰,系統(tǒng)首先保證關系滿足指定的約束條件。不滿足诊县,拒絕執(zhí)行命令讲弄。
也可以alter table A add constraint。如果之前的關系不滿足這個約束將拒絕執(zhí)行該命令依痊。
unique約束:在關系中沒有2個元組能在所有列出的屬性上取值相同避除,然而候選碼可以為空
check子句:check(P)子句指定一個謂詞,關系中的每一個元組都必須滿足謂詞P胸嘁,check子句保證屬性值滿足指定的條件瓶摆。check子句中的謂詞可以是包括子查詢在內(nèi)的任意謂詞
references可以顯示指定被參照關系的屬性列表,然而這個指定的屬性列表必須聲明為被參照關系的候選碼缴渊。當違反參照完整性約束時赏壹,通常是拒絕執(zhí)行導致完整性破壞的操作(即進行更新操作的事務被回滾)
on delete cascade ,若刪除department中的元組導致了此參照完整性約束被違反鱼炒,則刪除并不被系統(tǒng)拒絕衔沼,而是對course關系作級聯(lián)刪除
事務中對完整性約束的違反,SQL允許將initially deffrred子句加入到約束聲明中昔瞧,這樣完整性約束不是在事務的中間步驟上檢查指蚁,而是在事務結(jié)束的時候檢查。默認情況下它會被立即檢查
復雜check條件檢測開銷很大自晰,我們可以使用斷言凝化,表達數(shù)據(jù)庫總能滿足某一個條件
mysql> alter table example change id id varchar(10) primary key;
mysql> alter table example add id varchar(20) primary key;
ERROR 1060 (42S21): Duplicate column name 'id'
mysql> create table x(
-> id varchar(20,
-> check(id in ('Fall','Winter'));
mysql> create table wang(
-> id varchar(20)
-> check(id in(select id from list))
-> );
mysql> create table e(
-> id int,
-> unique(id));
mysql> create table wang(
-> id varchar(20),
-> foreign key(id) references list
-> on delete cascade);
mysql> create assertion a check
-> (not exists(select *
-> from list
-> where no>9000)
-> );
4.5 SQL的數(shù)據(jù)類型和模式
- SQL允許指定默認值
- SQL中的日期和時間類型
一些獲取當前日期和時間的函數(shù)
current_date返回當前日期
current_time返回當前時間
localtime返回當前的本地時間
時間戳(日期加上時間)由current_timestamp(帶有時區(qū))
localtimestamp(本地日期和時間,不帶時區(qū))
SQL允許在上面列出的所有類型上進行比較運算酬荞,也允許在各種數(shù)字類型上進行算術運算和比較運算
還支持interval數(shù)據(jù)類型搓劫,允許在日期瞧哟、時間、和時間間隔上進行運算
x,y都是date類型枪向,那x-y就是時間間隔類型勤揩,其值為日期x到日期y間隔的天數(shù)
mysql> select current_date - date'2001-05-24';
mysql> select current_date;
mysql> select date'2001-04-25',time'09:30:00',timestamp'2001-04-25 09:30:00';
//從date中提取域。有year,month,day,hour,minute,second
mysql> select extract(year from date'2001-05-24');
mysql> cast('2001-05-24' as DATE); //將字符串轉(zhuǎn)化稱DATE
- 創(chuàng)建索引
mysql> create index i on wang(id);
- 大對象類型
- 一個應用通常使用一個SQL查詢來檢索一個大對象的定位器秘蛔,然后在宿主語言中用這個定位器來操縱對象陨亡。
mysql> create table wen(
-> a clob(10KB),
-> b blob (10MB));
- 用戶定義的類型
- SQL支持用戶兩種形式的用戶自定義類型。第一種稱為獨特類型深员,第二種成為結(jié)構(gòu)化數(shù)據(jù)類型
- 可以用create type子句來定義新類型负蠕。不能為一種類型的變量賦予另一種類型的值。新創(chuàng)建的類型就可以用作關系屬性的類型
- SQL提供了drop type 和 alter type子句來刪除或修改以前創(chuàng)建過的類型
mysql> create type Dollars as numeric(12,2);
mysql> create type Dollar as numeric(12,2);
create table department(
budget Dollars
);
//如果不轉(zhuǎn)換的話倦畅,Dollars=Dollar會報錯
cast(department.Dollars to numeric(12,2);
在把用戶定義類型加入到SQL之前遮糖,有一個相似但稍有不同的概念,域叠赐,它可以在基本類型上施加完整性約束
-
域和類型的差別:
1.在域上止吁,可以聲明約束,也可以為域類型變量定義默認或默認值
2.域不是強類型燎悍,一種域類型的值可以被賦給另一種域類型的變量敬惦,只要他們基本類型相同
-
把check子句用到域上,被聲明為來自該域的任何變量都必須滿足這個謂詞
constraint salary_value_test子句可選谈山,用來將該約束命名為salary_value_test
create domain DDollaers as numeric(12,2) not null;
create domain YearlySalary numeric(8,2)
constrait salary check(value>=29000);
create table 的擴展
創(chuàng)建與現(xiàn)有的表模式相同的表
把查詢的結(jié)果存儲成一個新表
一條用于創(chuàng)建表俄删,另一條用于把查詢結(jié)果插入到表中
create table...as與create view語句非常相似
區(qū)別在于當表被創(chuàng)建時表的內(nèi)容被加載,但視圖總是反應當前查詢的結(jié)果
模式奏路,目錄和環(huán)境
當代數(shù)據(jù)庫系統(tǒng)提供了三層結(jié)構(gòu)的關系命名機制畴椰。最頂層由目錄構(gòu)成,每個目錄可以包含模式鸽粉。諸如關系斜脂、視圖都包含在模式中
create schema和drop schema來創(chuàng)建和刪除模式。
4.6 模式的授權
權限包括select触机、insert帚戳、update、delete
all privileges所有權限可以用作所有權限的簡寫形式
一個創(chuàng)建了新關系的用戶將自動被授予該關系上的所有權限
展示當前用戶權限
show grants;
grant用來授予權限
update可以在關系的所有屬性上授予儡首,也可以只在某些屬性上授予
insert也可以指定屬性列表片任,系統(tǒng)將其他屬性要么賦予默認值要么賦值為null
用戶名public指系統(tǒng)的所有當前用戶和將來用戶
默認情況下,被授予權限的用戶和角色無權把此權限授予其他用戶/角色
SQL允許用授予權限的接受者可以進一步把權限授予其他人
不允許對一個關系的指定元組授權
遠程連接時:
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON 你的數(shù)據(jù)庫.* TO '用戶名'@'%' identified by '密碼'
使用revoke語句來收回權限
grant select on department to Amith;
grant update(no) on department tomith;
grant select on department to public;
revoke select on department to Amith;
revoke update(no) on department tomith;
revoke select on department to public;
角色
在數(shù)據(jù)庫中建立一個角色集蔬胯,可以給角色授予權限对供,就和給每一個用戶授權的方式完全一樣
創(chuàng)建角色
授權給角色
角色可以授權給用戶,也可以授權給其他角色
一個用戶或一個角色的權限包括:
- 所有直接授予用戶/角色的權限
- 所有授予給用戶/角色所擁有角色的權限
create role instructor;
grant select on takes to instructor;
grant dean to Amith;
create role dean;
grant indtructor to dean;
grant dean to Satoshi;
視圖的授權氛濒。在這個例子中产场,視圖的創(chuàng)建者必須在instructor關系上具有select權限鹅髓,否則系統(tǒng)會拒絕這樣的視圖創(chuàng)建請求
create view geo_instructor as
(
select *
from instructor
);
** 模式的授權**
只有模式的擁有則才能執(zhí)行對模式的修改。
//允許Amith創(chuàng)建參照department的dept_name的關系
grant references (dept_name) on department to Amith;
權限的轉(zhuǎn)移京景,允許權限的接受者將該權限授予給其他用戶
grant select on department to Amith with grant option;
權限的收回
revoke select on department to Amith restrict;
revoke select on department to Amith cascade;
set role me;
granted by current_role;
restrict防止權限的級聯(lián)收回
替換成cascade表示需要級聯(lián)收回迈勋,默認需要級聯(lián)收回。
授予權限時將授權人設置為一個會話所關聯(lián)的當前角色醋粟,并且當角色不為空時靡菇,可在授權語句后加
收回角色/權限時任然能保持當前角色
第六章、 形式化關系查詢語言
關系代數(shù)米愿、元組關系演算厦凤、域關系演算
6.1 關系代數(shù)
6.1.1 基本運算
關系代數(shù)基本運算:選擇、投影育苟、并较鼓、集合差、笛卡爾積违柏、更名
選擇運算博烂,一元運算
選出滿足給定謂詞的元組禽篱,用sigma(σ)來表示,將謂詞寫作σ的下表
例如:屬于物理系的元組可以這樣寫
通常馍惹,我們允許在選擇謂詞中進行比較躺率,使用的是=芬探、≠寝贡、<、≤辆影、>良狈、≥
另外后添,我們可以用連詞將多個謂詞合并為一個較大的謂詞。例如:
投影運算
投影運算是一元運算薪丁,它返回作為參數(shù)的關系遇西,但把某些屬性排除在外努溃。重復行去除
例如:
關系運算的組合
例如:找出物理系的所有教師的名字
并運算
就是將兩個集合并起來第队。去重
例如:找出開設在2009年秋季學期或者2010年春季學期或者這兩者皆開的所有課程的集合
另一方面衡未,設r和s是數(shù)據(jù)庫關系或者作為關系代數(shù)表達式結(jié)果的臨時關系。要使r U s有意義,需滿足以下兩個條件:
(1)關系r和s必須是同元的,即它們的屬性數(shù)目必須相同
(2)對所有的i,r的第i個屬性的域必須和s的第i個屬性的域相同
集合差運算
用 - 表示集合差運算,可以找出在一個關系中而不在另一個關系中的那些元組。
例如:找出所有開設在2009年秋季學期但是在2010年春季學期不開的課程
另一方面,設r和s是數(shù)據(jù)庫關系或者作為關系代數(shù)表達式結(jié)果的臨時關系。要使r - s有意義,需滿足以下兩個條件:
(1)關系r和s必須是同元的,即它們的屬性數(shù)目必須相同
(2)對所有的i辱士,r的第i個屬性的域必須和s的第i個屬性的域相同
笛卡爾積運算
用X表示笛卡爾積,可以將任意兩個關系的信息組合在一起切油。
更名運算
關系代數(shù)表達式的結(jié)果沒有可供我們引用的名字攻谁,我們可以通過小寫希臘字母rho(ρ)表示的更名運算來完成這一任務锈嫩。
返回表達式E的結(jié)果对雪,并把名字x賦給了它
返回表達式E的結(jié)果捐祠,并賦給它名字x星岗,同時將各屬性更名為A1寥掐,A2污它,... 固惯,An
6.1.2 關系運算的形式化定義
關系代數(shù)中基本的表達式是如下二者之一:
- 數(shù)據(jù)庫的一個關系
- 一個常數(shù)關系
若E1,E2是關系代數(shù)表達式,則以下這些都是關系代數(shù)表達式:
6.1.3 附加的關系代數(shù)運算
集合交運算
例如:在2009年秋季和2010年春季都開設的課程
自然連接運算
用連接符號來表示
自然連接運算首先形成它的兩個參數(shù)的笛卡爾積,然后基于兩個關系模式中都出現(xiàn)的屬性上的相等性進行選擇,最后還要去除重復屬性。
例如:找出所有教師的姓名,連同他們教的所有課程的course_id
自然連接是可結(jié)合的
theta連接是自然連接的擴展颂跨,它使得我們可以把一個選擇運算和一個笛卡爾積運算合并為單獨的一個運算,即自然連接是選出笛卡爾積中相同的屬性斑粱,而theta連接是選出笛卡爾積中滿足該選擇運算的屬性。
賦值運算
將R x S的結(jié)果賦給temp1
外連接運算
外連接是連接運算的擴展脯爪,可以處理確實的信息则北。有左外連接、右外連接和全外連接
左外連接:取出左側(cè)關系中所有與右側(cè)關系的任一元組都不匹配的元組塔次,用空值填充所有來自右側(cè)關系的屬性乞榨,再把產(chǎn)生的元組加到自然連接的結(jié)果中淫半。
右外連接:與左外連接相對稱
全外連接:既做左外連接又做右外連接咱台,既填充左側(cè)關系中與右側(cè)關系的任一元組都不匹配的元組绳姨,又填充右側(cè)關系中與左側(cè)關系的任一元組都不匹配的元組,并把結(jié)果都加到連接的結(jié)果中衅疙。
6.1.4 擴展的關系代數(shù)運算
廣義投影
廣義投影允許在投影列表中使用算術運算和字符串函數(shù)等來對投影進行擴展后频。
例如:
聚集
聚集運算可以用來對值的集合使用聚集函數(shù)瘤旨,例如計算最小值或者求平均值
聚集函數(shù):輸入值的一個匯集,將單一值作為結(jié)果返回掺涛。比如輸入幾個數(shù)的集合薪缆,返回他們的和作為結(jié)果
將distinct添加在函數(shù)名后秧廉,可以去除重復
例如:
元組關系演算
元組關系演算表達式具有如下形式其中P是一個公式,公示中可以出現(xiàn)多個元組變量拣帽。如果元組不被“存在”或“任意”修飾疼电,則稱為自由變量。
域關系演算
域關系演算是從屬性域中取值的域變量减拭,而不是整個元組的值蔽豺。
第七章、數(shù)據(jù)庫設計和E-R模型
7.1 設計過程概覽
概念設計:E-R圖創(chuàng)建
邏輯設計:E-R模型映射到關系模式
物理設計拧粪。
設計一個數(shù)據(jù)庫模式的時候修陡,必須避免的兩個主要的缺陷
(1)冗余:一個不好的設計可能會重復信息。信息的冗余表達的最大問題是當對一條信息進行更新既们,但沒有將這條信息的所有拷貝都更新時這條信息的拷貝會變得不一致濒析。
(2)不完整:如字面意思,一個不好的設計可能會使得企事業(yè)機構(gòu)的某些方面難于甚至無法建模啥纸。
7.2 E-R模型
實體-聯(lián)系(E-R)數(shù)據(jù)模型的提出旨在方便數(shù)據(jù)庫的設計号杏,它是通過允許定義代表數(shù)據(jù)庫全局邏輯結(jié)構(gòu)的企業(yè)模式實現(xiàn)的。
實體:是現(xiàn)實世界中可區(qū)別于所有其他對象的一個“事物”或“對象”。
實體集:是相同類型即具有相同性質(zhì)(或?qū)傩裕┑囊粋€實體集合盾致。例如一所給定大學的所有教師的集合可定義為實體集instructor主经。實體集不必互不相交
實體集的外延:屬于實體集的實體的實際集合
聯(lián)系:是指多個實體間的相互關聯(lián),也可以具有描述性屬性
聯(lián)系集:是相同類型聯(lián)系的集合庭惜。
參與:實體集之間的關聯(lián)稱為參與罩驻。也就是說,實體集E1,E2,...,En參與聯(lián)系集R
角色:實體在聯(lián)系中扮演的功能稱為實體的角色护赊。
屬性:實體集的屬性是將實體集映射到域的函數(shù)惠遏。由于一個實體集可能有多個屬性,因此每個實體可以用一組(屬性骏啰,數(shù)據(jù)值)對來表示节吮,實體集的每個屬性對應一個這樣的對。
聯(lián)系集的度:參與聯(lián)系集的實體集的數(shù)目判耕。
給定的聯(lián)系集中的聯(lián)系實例必須是由其參與實體唯一標識的透绩。
相同的 實體集可能會參與到多于一個聯(lián)系集中
每個屬性都有一個可取值的集合,稱為該屬性的域壁熄,或則值集
E-R模型中的屬性可以按照如下的屬性類型來劃分
(1)簡單和復合屬性:簡單屬性指不能劃分為更小的部分帚豪;復合屬性指可以再劃分為更小的部分(即其他屬性)。例如屬性name可設計為一個包含first_name草丧、middle_initial和last_name的復合屬性
(2)單值和多值屬性:我們直接用例子說明:對某個特定的學生實體而言狸臣,student_ID屬性只對應于一個學生ID,這樣的屬性為單值方仿;在教師實體中固棚,每個教師可以有0個、1個或多個電話號碼仙蚜,這個phone_number屬性就是多值的。{}
(3)派生屬性:這類屬性的值可以從別的相關屬性或?qū)嶓w派生出來厂汗。派生屬性的值不存儲委粉,在需要的時候計算出來
7.3 約束
7.3.1 映射基數(shù)
映射基數(shù):表示一個實體通過一個聯(lián)系集能關聯(lián)的實體的個數(shù)。
(1)一對一:A中的一個實體至多與B中的一個實體相關聯(lián)娶桦,并且B中的一個實體也至多與A中的一個實體相關聯(lián)
(2)一對多:A中的一個實體至多與B中的零個或多個實體相關聯(lián)贾节,而B中的一個實體也至多與A中的一個實體相關聯(lián)
(3)多對一:A中的一個實體至多與B中的一個實體相關聯(lián),而B中的一個實體可以與A中的零個或多個實體相關聯(lián)
(4)多對多:A中的一個實體至多與B中的零個或多個實體相關聯(lián)衷畦,而且B中的一個實體也可以與A中的零個或多個實體相關聯(lián)
7.3.2 參與約束
如果實體集E中的每個實體都參與到聯(lián)系集的至少一個聯(lián)系之中栗涂,實體集E在聯(lián)系集R中的參與稱為全部的。如果實體集E中只有部分實體參與到聯(lián)系集的之中祈争,實體集E在聯(lián)系集R中的參與稱為部分的斤程。
7.3.3 碼more
關系模式中的超碼、候選碼菩混、主碼的概念同樣適用于實體集
7.5 實體-聯(lián)系圖
7.5.1 基本結(jié)構(gòu)
分成兩部分的矩形:代表實體集忿墅,上面的第一部分為實體集的名字扁藕,下面的第二部分包含實體集中所有屬性的名字
菱形:代表聯(lián)系集
未分割的矩形:代表聯(lián)系集的屬性,構(gòu)成主碼的屬性以下劃線表明
線段:將實體集連接到聯(lián)系集
虛線:將聯(lián)系集屬性連接到聯(lián)系集
雙線:顯示實體在聯(lián)系集中的參與度
雙菱形:代表連接到弱實體集的標志性聯(lián)系集
聯(lián)系集和實體集之間也有映射基數(shù)疚脐,意思同約束中的映射技術亿柑,聯(lián)系集為實體A,實體集為實體B
約束的方式有兩種:
一棍弄、
二望薄、用l..h的形式表示一個關聯(lián)的最小和最大的映射基數(shù)
7.5.3 復雜的屬性
表示方法:
name、address呼畸、street為復合屬性
{phone_number}為多值屬性
{age()}為派生屬性age
7.5.4 角色
通過在菱形和矩形之間的連線上進行標注來表示角色式矫,例如下圖中的course_id和prereq_id
7.5.5 非二元的聯(lián)系集
我們至多允許一個箭頭
7.5.6 弱實體集
弱實體集:沒有足夠的屬性以形成主碼的實體集稱作弱實體集
強實體集:有主碼的實體集稱作強實體集
弱實體集必須與另一個稱作標識或屬主實體集的實體集關聯(lián)才能有意義。每個弱實體必須和一個標識實體關聯(lián)役耕;也就是說采转,弱實體集存在依賴于標識實體集。我們稱標識實體集擁有它所標識的弱實體集瞬痘。將弱實體集與其標識實體集相聯(lián)的聯(lián)系稱為標識性聯(lián)系故慈。
標識性聯(lián)系是從弱實體集到強實體集多對一的,并且弱實體集在聯(lián)系中的參與是全部的框全。標識性聯(lián)系集不應該有任何描述性屬性察绷,因為這種屬性中的任意一個都可以與弱實體集相關聯(lián)。
分辨符:雖然弱實體集沒有主碼津辩,但是我們?nèi)匀恍枰獏^(qū)分依賴于特定強實體集的弱實體集中的實體的方法拆撼。弱實體集的分辨符是使我們進行這種區(qū)分的屬性集合,也稱為該實體集的部分碼喘沿。
弱實體集的主碼由標識實體集的主碼加上弱實體集的分辨符構(gòu)成闸度。
圖形表示:
弱實體集的分辨符以虛下劃線標明,而不是實線蚜印。
關聯(lián)弱關系集和標識性強實體集的聯(lián)系集用雙菱形表示莺禁。
弱實體集可以參與標識性聯(lián)系意外的聯(lián)系。弱實體集可以作為屬主與另一個弱實體集參與一個標識性聯(lián)系窄赋。一個弱實體集也可能與不止一個標識實體集相關聯(lián)哟冬。這樣,一個特定的弱實體集將被一個實體的組合標識忆绰,其中每個標識實體集有一個實體在組合中浩峡。弱實體集的主碼可以由標識實體集的主碼加上弱實體集的分辨符構(gòu)成。
如果弱實體集屬性少错敢,直接歸并到實體集中翰灾。否則自成一家。
7.6 轉(zhuǎn)換為關系模式
7.6.1 具有簡單屬性的強實體集的表示
設E是只具有簡單描述性屬性a1,a2,...,an的強實體集。我們用具有n個不同屬性的模式E來表示這個實體集预侯。該模式的關系中的每個遠足同實體集E的一個實體相對應致开。
7.6.2 具有復雜屬性的強實體集的表示
這個就比上面的情況復雜一點,我們通過為每個子屬性創(chuàng)建一個單獨的和屬性來處理符合屬性萎馅,我們并不為復合屬性自身創(chuàng)建一個單獨的屬性双戳。
例如instructor實體集,里面有復合屬性name糜芳,為instructor生成的末世包括屬性first_name飒货、middle_initial和last_name;沒有單獨的屬性或末世表示name峭竣。其他屬性類似塘辅。
對于一個多值屬性M,構(gòu)建關系模式R皆撩,該模式包含一個對應與M的屬性A扣墩,以及對應于M所在的實體集或聯(lián)系集的屬性。
在一個實體集只有兩個屬性的情況下——一個主碼B和多值屬性M——該實體集的關系模式只含有一個屬性扛吞,即主碼屬性B呻惕,可以刪除這個關系,同時保留屬性B和對應M的屬性A的關系模式滥比。
7.6.3 弱實體集的表示
設A是具有屬性a1,a2,...,am的弱實體集亚脆,設B是A所依賴的強實體集,設B的主碼包括屬性b1,b2,...,bn盲泛。我們用名為A的關系模式表示實體集A濒持,該模式的每個屬性對應以下集合中的一個成員:
所以A的模式的屬性有:A的屬性和B的主碼。
該模式的主碼由實體集B的主碼和A的分辨符組成寺滚。
7.6.4 聯(lián)系的表示
- 若實體間聯(lián)系是1:1柑营,可以在兩個實體類型轉(zhuǎn)換成的兩個關系模式中任意一個關系模式的屬性中加入另一個關系模式的鍵(作為外鍵)和聯(lián)系類型的屬性。
- 若實體間聯(lián)系是1:N玛迄,則在N端實體類型轉(zhuǎn)換成的關系模式中加入1端實體類型的鍵(作為外鍵)和聯(lián)系類型的屬性由境。
- 若實體間聯(lián)系是M:N,則將聯(lián)系類型也轉(zhuǎn)換成關系模式蓖议,其屬性為兩端實體類型的鍵(作為外鍵)加上聯(lián)系類型的屬性,而鍵為兩端實體鍵的組合
7.6.5 模式的合并
考慮實體集A讥蟆,B和聯(lián)系集AB勒虾。假設A在該聯(lián)系中的參與是全部的,那么我們可以將A和AB合并稱單個包含兩個模式所有屬性的并集的模式瘸彤。
8.1 好的關系設計的特點
有損分解:分解關系的時候損失了信息修然。
無損分解:分解關系的時候沒有損失了信息。
8.2 原子域和第一范式
第一范式(1NF)
如果某個域的元素被認為是不可再分的單元,那么這個域就是原子的(atomic)愕宋。如果一個關系模式R的所有的屬性域都是原子的玻靡,我們稱關系模式R屬于第一范式(first normal form, 1NF)。
8.3 使用函數(shù)依賴進行分解
8.3.1 碼和函數(shù)依賴
8.3.2 范式
范式是對關系的不同數(shù)據(jù)依賴程度的要求中贝。通過模式分解將一個低級范式轉(zhuǎn)換為若干個高級范式的過程稱作規(guī)范化囤捻。
1NF
關系中每一分量不可再分。即不能以集合邻寿、序列等作為屬性值蝎土。
2NF
若R∈1NF,且每個屬性滿足下列準則之一:
它出現(xiàn)在一個候選碼中
它沒有部分依賴于一個候選碼绣否,則稱R∈2NF誊涯。
2NF消除了非主屬性對碼的部分依賴.
3NF
關系模式R< U , F >中,F(xiàn)+中所有函數(shù)依賴α-->β 蒜撮,至少有以下之一成立:
① α-->β是平凡的函數(shù)依賴暴构;
② α是超碼;
③ β-α的每一個屬性A都包含在R的候選碼中段磨,則稱R∈3NF取逾。
3NF消除了非主屬性對碼的傳遞依賴。
作為判斷3NF時的一種優(yōu)化薇溃,可以只考慮F上的函數(shù)依賴菌赖,而不是F+,也可以分解F上的函數(shù)依賴,讓它們的右半部只包含一個屬性沐序,并用這個結(jié)果代替F琉用。
3NF的判斷被證明是無法求解的,是NP問題策幼。
BCNF
關系模式R< U , F >中邑时,所有的形如α-->β的函數(shù)依賴( α∈U,β∈U )特姐,下面至少有一個成立:
① α-->β是平凡的函數(shù)依賴晶丘;
2.α是模式R的一個超碼,則稱R∈BCNF唐含。
如SPC ? BCNF浅浮,因為tno-->cno,而tno不是超碼捷枯。
改造:將S分解為:(sno滚秩,tno),(tno淮捆,cno)郁油。
BCNF分解:
我們對函數(shù)依賴進行數(shù)據(jù)庫設計的目標:
- 無損
- BDNF
- 保持依賴
無損分解:
8.4 函數(shù)依賴理論
被F所邏輯蘊涵的函數(shù)依賴的全體所構(gòu)成的集合稱作F的閉包本股。
Armstrong公理系統(tǒng)
各希臘字母都為屬性集
自反律:若β含于α,則α-->β
增補率:若α-->β桐腌,則αγ-->βγ
傳遞率:若α-->β拄显,β-->γ,則α-->γ
合并率:若α-->β案站,α-->γ躬审,則α-->βγ
分解率:若α-->βγ,則α-->β嚼吞,α-->γ
偽傳遞率:若α-->β盒件,γβ-->δ,則γα-->δ
屬性集的閉包
令α為屬性集舱禽,將函數(shù)依賴集F下被α函數(shù)確定的所有屬性的集合稱作F下α的閉包炒刁,記作α+
α+= {A |α-->A能由F根據(jù)Armstrong公理導出}√苤桑可以求候選碼
范式是對關系的不同數(shù)據(jù)依賴程度的要求翔始。通過模式分解將一個低級范式轉(zhuǎn)換為若干個高級范式的過程稱作規(guī)范化。
1NF
關系中每一分量不可再分里伯。即不能以集合城瞎、序列等作為屬性值。
2NF
若R∈1NF疾瓮,且每個屬性滿足下列準則之一:
它出現(xiàn)在一個候選碼中
它沒有部分依賴于一個候選碼脖镀,則稱R∈2NF。
2NF消除了非主屬性對碼的部分依賴.
3NF
關系模式R< U , F >中狼电,F(xiàn)+中所有函數(shù)依賴αàβ 蜒灰,至少有以下之一成立 :
① αàβ是平凡的函數(shù)依賴;
② α是超碼肩碟;
③ β-α的每一個屬性A都包含在R的候選碼中强窖,則稱R∈3NF。
3NF消除了非主屬性對碼的傳遞依賴削祈。
作為判斷3NF時的一種優(yōu)化翅溺,可以只考慮F上的函數(shù)依賴,而不是F+,也可以分解F上的函數(shù)依賴髓抑,讓它們的右半部只包含一個屬性咙崎,并用這個結(jié)果代替F。
3NF的判斷被證明是無法求解的吨拍,是NP問題叙凡。
BCNF
關系模式R< U , F >中,所有的形如αàβ的函數(shù)依賴( α∈U密末,β∈U )握爷,下面至少有一個成立:
1.αàβ是平凡的函數(shù)依賴,
2.α是模式R的一個超碼严里,則稱R∈BCNF新啼。
如SPC ? BCNF,因為tnoàcno刹碾,而tno不是超碼燥撞。
改造:將S分解為:(sno,tno)迷帜,(tno物舒,cno)。
多值依賴
對稱性戏锹,函數(shù)依賴是多值依賴的特例,傳遞性
函數(shù)依賴好多值依賴區(qū)別
函數(shù)依賴規(guī)定某些元組不能出現(xiàn)在關系中,也稱為相等產(chǎn)生依賴酌心。
多值依賴要求某種形式的其它元組必須在關系中译柏,稱為元組產(chǎn)生依賴。
閉包
令D表示函數(shù)依賴和多值依賴的集合奈搜,D的閉包D+是由D邏輯蘊涵的所有函數(shù)依賴和多值依賴的集合悉盆。
4NF
函數(shù)依賴和多值依賴集為D的關系模式R屬于4NF的條件是:對于所有D+中形如: αààβ的多值依賴(其中α包含于R∧β包含于R),至少有以下條件之一成立:
1.αàà β是一個平凡的多值依賴馋吗;
2.α是模式R的超碼焕盟,則稱R∈4NF。
如關系模式TEACH宏粤,cnoààtno脚翘,cnoààbno,碼為(cno, tno, bno)商架,所以CTB?4NF堰怨。改造:將CTB分解為CT(cno,tno)蛇摸,CB(cno备图,bno),在分解后的關系中分量為Ci的元組共有m + n個
4NF的本質(zhì)
(在只考慮函數(shù)和多值依賴的前提下)赶袄,4NF只講一件事揽涮,非碼的多值決定關系講述了另外一件事。
R(cno,bno,tno)
cno→→bno
cno→→tno
R講述了(cno,bno)和(cno,tno)兩件事饿肺。
有效且完備的公理系統(tǒng)
范式之間的關系
1NF:數(shù)據(jù)庫表的每一列都是不可分割的原子數(shù)據(jù)項蒋困,而不能是集合,數(shù)組敬辣,記錄等非原子數(shù)據(jù)項雪标。
2NF:1NF的基礎上零院,非碼屬性必須完全依賴于碼。在1NF基礎上消除非主屬性對主碼的部分函數(shù)依賴村刨。
3NF:在1NF基礎上告抄,任何非主屬性不依賴于其它非主屬性。在2NF基礎上消除傳遞依賴嵌牺。
BCNF:在1NF基礎上打洼,任何非主屬性不能對主鍵子集依賴,在3NF基礎上消除對主碼子集的依賴逆粹。
4NF:在多值依賴的視角評價關系模式募疮。
解除規(guī)范化
把一個規(guī)范化的模式變成非規(guī)范化的過程。目的:用于調(diào)整系統(tǒng)的性能
第十二章僻弹、事務管理
事務是作為單個邏輯工作單元執(zhí)行的一系列數(shù)據(jù)庫操作阿浓。這些操作要么都做,要么都不做奢方,是一個不可分割的工作單位
12.1 事務概念
事務是訪問并可能更新各種數(shù)據(jù)項的一個程序執(zhí)行單元搔扁。
事物特性(ACID)
原子性(Atomicity)
事務中包含的所有操作要么全做,要么全不做蟋字。原子性由恢復系統(tǒng)實現(xiàn)稿蹲。
一致性(Consistency)
事務的隔離執(zhí)行必須保證數(shù)據(jù)庫的一致性。事務開始前鹊奖,數(shù)據(jù)庫處于一致性的狀態(tài)苛聘;事務結(jié)束后,數(shù)據(jù)庫必須仍處于一致性狀態(tài)忠聚;事務的執(zhí)行過程中可以暫時的不一致设哗。數(shù)據(jù)庫的一致性狀態(tài)由用戶來負責,由并發(fā)控制系統(tǒng)實現(xiàn)两蟀。 如銀行轉(zhuǎn)賬网梢,轉(zhuǎn)賬前后兩個帳戶金額之和應保持不變。
隔離性(Isolation)
系統(tǒng)必須保證事務不受其它并發(fā)執(zhí)行事務的影響赂毯。對任何一對事務T1战虏,T2,在T1看來党涕,T2要么在T1開始之前已經(jīng)結(jié)束烦感,要么在T1完成之后再開始執(zhí)行。隔離性通過并發(fā)控制系統(tǒng)實現(xiàn)膛堤。
持久性(Durability)
一個事務一旦提交之后手趣,它對數(shù)據(jù)庫的影響必須是永久的。系統(tǒng)發(fā)生故障不能改變事務的持久性肥荔。持久性通過恢復系統(tǒng)實現(xiàn)绿渣。
由于故障朝群,系統(tǒng)的狀態(tài)不再反應數(shù)據(jù)庫本應描述的現(xiàn)實世界的真實狀態(tài),我們把這種狀態(tài)稱為不一致狀態(tài)怯晕。
恢復系統(tǒng)保證原子性和持久性潜圃。并發(fā)控制系統(tǒng)保證隔離性和一致性。
12.2 事務的原子性和持久性
一旦事務已提交舟茶,我們不能通過中止他來撤銷其造成的影響,撤銷已提交事務造成的影響的唯一方法就是執(zhí)行一個補償事務堵第。書寫一個補償事務的責任留給用戶
事務的幾種狀態(tài):
1吧凉、活躍的:初始狀態(tài),事務開始執(zhí)行時處于這個狀態(tài)
2踏志、部分提交的:最后一條語句執(zhí)行后阀捅。可能發(fā)生硬件故障针余。當數(shù)據(jù)庫往磁盤上寫了足夠的信息饲鄙,確保即使發(fā)生硬件故障更新也能在系統(tǒng)重啟時創(chuàng)建。當最后一條這樣的信息寫完之后圆雁,事務進入提交狀態(tài)忍级。
3、失敗的:發(fā)現(xiàn)正常的執(zhí)行不能繼續(xù)后
4伪朽、中止的:事務回滾并且數(shù)據(jù)庫恢復到事務執(zhí)行之前的狀態(tài)后
5轴咱、提交的:成功執(zhí)行后
狀態(tài)轉(zhuǎn)換圖如下:如果事務是提交的或則終止的,我們稱事務是已經(jīng)結(jié)束的
事務進入中止狀態(tài)后烈涮,系統(tǒng)這時候有兩種選擇:
1朴肺、重啟事務:當且僅當中止是由硬件錯誤造成的或者不是事物本身邏輯所產(chǎn)生的錯誤時。重啟的事務會被看成一個新的事務
2坚洽、殺死事務:如果中止是由事務內(nèi)部邏輯錯誤導致的那么事務就會被殺死戈稿。當處理可見的外部寫,比如寫到屏幕上一定要小心讶舰。大多數(shù)系統(tǒng)只允許在操作在事務進入提交狀態(tài)后發(fā)生鞍盗。
12.3 事務的隔離性
兩條很好的理由允許并發(fā):
- 提高吞吐量和資源利用率
- 減少等待時間
事務調(diào)度
- 事務的執(zhí)行順序稱為一個調(diào)度(schedule),表示事務的指令在系統(tǒng)中執(zhí)行的時間順序绘雁。
串行調(diào)度:屬于同一事務的指令在調(diào)度中緊挨在一起
可串行化調(diào)度:并發(fā)執(zhí)行中橡疼,保證所執(zhí)行的任何調(diào)度的效果與沒有并發(fā)執(zhí)行的調(diào)度效果一樣。這樣可以保證數(shù)據(jù)庫的一致性庐舟。調(diào)度應該在某種意義上等價與一個串行調(diào)度欣除。這種調(diào)度稱為可串行化調(diào)度。
12.4 可串行化
串行調(diào)度是可串行化的挪略。
沖突指令:
當兩條指令是不同事務在相同數(shù)據(jù)項上的操作历帚,并且其中至少有一個是write指令時滔岳,則稱這兩條指令是沖突的。
沖突等價:
如果調(diào)度S可以經(jīng)過一系列非沖突指令交換轉(zhuǎn)換成調(diào)度S'挽牢,則稱調(diào)度S與S'是沖突等價的(conflictequivalent)谱煤。不是所有的串行調(diào)度都沖突等價。
沖突可串行化:
當一個調(diào)度S與一個串行調(diào)度沖突等價時禽拔,則稱該調(diào)度S是沖突可串行化的
12.5 可恢復性
一個事務失敗了刘离,應該能夠撤消該事務對數(shù)據(jù)庫的影響。如果有其它事務讀取了失敗事務寫入的數(shù)據(jù)睹栖,則該事務也應該撤消硫惕。
可恢復調(diào)度:
對于每對事務T1與T2,如果T2讀取了T1所寫的數(shù)據(jù)野来,則T1必須先于T2提交恼除。
級聯(lián)調(diào)度:
由于一個事務故障而導致一系列事務回滾。
無級聯(lián)調(diào)度:
對于每對事務T1與T2曼氛,如果T2讀取了T1所寫的數(shù)據(jù)豁辉,則T1必須在T2讀取之前提交。
<注>無級聯(lián)調(diào)度必是可恢復調(diào)度
并發(fā)操作帶來的數(shù)據(jù)不一致性
(1)丟失修改(Lost Update)
兩個事務T1和T2讀入同一數(shù)據(jù)并修改舀患,T2的提交結(jié)果破壞了T1提交的結(jié)果徽级,導致T1的修改被丟失。
(2)不可重復讀(Non-repeatable Read)
不可重復讀是指事務T1讀取數(shù)據(jù)后构舟,事務T2執(zhí)行更新操作灰追,使T1無法再現(xiàn)前一次讀取結(jié)果。不可重復讀包括三種情況:
- 事務T1讀取某一數(shù)據(jù)后狗超,事務T2對其做了修改弹澎,當事務T1再次讀該數(shù)據(jù)時,得到與前一次不同的值
- 事務T1按一定條件從數(shù)據(jù)庫中讀取了某些數(shù)據(jù)記錄后努咐,事務T2刪除了其中部分記錄苦蒿,當T1再次按相同條件讀取數(shù)據(jù)時,發(fā)現(xiàn)某些記錄神秘地消失了渗稍。
- 事務T1按一定條件從數(shù)據(jù)庫中讀取某些數(shù)據(jù)記錄后佩迟,事務T2插入了一些記錄,當T1再次按相同條件讀取數(shù)據(jù)時竿屹,發(fā)現(xiàn)多了一些記錄报强。
后兩種不可重復讀有時也稱為幻影現(xiàn)象(Phantom Row)
(3)讀“臟”數(shù)據(jù)(Dirty Read)
讀“臟”數(shù)據(jù)是指:
事務T1修改某一數(shù)據(jù),并將其寫回磁盤
事務T2讀取同一數(shù)據(jù)后拱燃,T1由于某種原因被撤銷
這時T1已修改過的數(shù)據(jù)恢復原值秉溉,T2讀到的數(shù)據(jù)就與數(shù)據(jù)庫中的數(shù)據(jù)不一致
T2讀到的數(shù)據(jù)就為“臟”數(shù)據(jù),即不正確的數(shù)據(jù)。事務隔離性
按照隔離級別從低到高的順序:
未提交讀:允許讀取未提交數(shù)據(jù)召嘶。(當事務A更新某條數(shù)據(jù)時父晶,不容許其他事務來更新該數(shù)據(jù),但可以讀取弄跌。)
已提交讀:只允許讀取已提交數(shù)據(jù)甲喝,但不要求可重復讀。(當事務A更新某條數(shù)據(jù)時铛只,不容許其他事務進行任何操作包括讀取埠胖,但事務A讀取時,其他事務可以進行讀取格仲、更新押袍。)
可重復讀:只允許讀取已提交數(shù)據(jù),而且一個事務兩次讀取一個數(shù)據(jù)項期間凯肋,其他事務不得更新該數(shù)據(jù),但是該事務不要求與其他事務可串行化汽馋。
可串行化:保證可串行化調(diào)度侮东。
以上所有隔離級別都不允許臟寫,即如果一個數(shù)據(jù)項已經(jīng)被另外一個尚未提交的事務寫入豹芯,則不允許對該數(shù)據(jù)項執(zhí)行寫操作悄雅。
12.6 并發(fā)控制
并發(fā)控制機制的任務:對并發(fā)操作進行正確調(diào)度、保證事務的隔離性铁蹈、保證數(shù)據(jù)庫的一致性宽闲。
12.6.1 基于鎖的協(xié)議
基本封鎖類型:
- 排它鎖(exclusive lock,簡記為X鎖)
- 共享鎖(Share lock握牧,簡記為S鎖)
共享鎖
共享鎖又稱為讀鎖容诬。若事務T對數(shù)據(jù)對象Q加上S鎖,事務T可讀但不能寫Q沿腰,其它事務只能再對Q加S鎖览徒,而不能加X鎖,直到T釋放Q上的S鎖颂龙。
排它鎖
排它鎖又稱為寫鎖习蓬。若事務T對數(shù)據(jù)對象Q加上X鎖,則事務T既可以讀又可以寫Q措嵌,其它任何事務都不能再對Q加任何類型的鎖躲叼,直到T釋放A上的鎖。
假設對于某對象企巢,事物j請求A型鎖枫慷,事物i擁有B型鎖。如果事物j可以立刻得到A型鎖。則稱A與B鎖是相容的流礁。
讓事務在對數(shù)據(jù)項最后一次訪問后立即釋放鎖也未必是可取的涕俗,因為可能不能保證可串行化。
死鎖:一種哪個事物都不能正常執(zhí)行的狀態(tài)神帅。當死鎖發(fā)生時再姑,必須回滾兩個事務中的一個。
饑餓/餓死:
不斷出現(xiàn)的申請并獲得S鎖的事務找御,使申請X鎖的事務一直處在等待狀態(tài)元镀。
饑餓的防止:
對申請S鎖的事務,如果有先于該事務且等待的加X鎖的事務霎桅,令申請S鎖的事務等待栖疑。
12.6.2 保證可串行性的封鎖協(xié)議(兩階段封鎖協(xié)議)
定義:每個事務分兩個階段提出加鎖和解鎖申請。
增長階段(growing phase):事務可以獲得鎖滔驶,但不能釋放鎖遇革。
縮減階段(shrinking phase):事務可以釋放鎖,但不能獲得新鎖揭糕。
封鎖點(lock point):事務最后加鎖的位置萝快,稱為事務的封鎖點, 記作Lp(T)。
并行執(zhí)行的所有事務均遵守兩段鎖協(xié)議著角,則對這些事務的所有并行調(diào)度策略都是可串行化的揪漩。所有遵守兩段鎖協(xié)議的事務,其并行執(zhí)行的結(jié)果一定是正確的吏口。
事務遵守兩段鎖協(xié)議是可串行化調(diào)度的充分條件奄容,而不是必要條件〔玻可串行化的調(diào)度中昂勒,不一定所有事務都必須符合兩段鎖協(xié)議。
兩階段封鎖協(xié)議不保證不會發(fā)生死鎖囚痴。
嚴格兩階段封鎖協(xié)議:除了要求封鎖是兩階段之外叁怪,還要求事務持有的所有排他鎖必須在事務結(jié)束后,方可釋放深滚。
強兩階段封鎖協(xié)議:事務提交之前奕谭,不得釋放任何鎖。在強兩階段封鎖協(xié)議下痴荐,事務可以按其結(jié)束的順序串行化血柳。
12.6.3 多粒度封鎖的必要性
事務訪問數(shù)據(jù)的粒度不同
DB、Table生兆、Tuple难捌、…
單一封鎖粒度的問題
封鎖粒度大:并發(fā)性低
封鎖粒度邢ツ:訪問大粒度數(shù)據(jù)加鎖量巨大
多粒度封鎖:根據(jù)訪問數(shù)據(jù)的粒度,確定封鎖的粒度根吁。以求加鎖量有限员淫,并可獲得最大的并發(fā)性
多粒度封鎖的基本原則:
大粒度數(shù)據(jù)由小粒度數(shù)據(jù)組成;
允許對不同粒度數(shù)據(jù)進行封鎖击敌;
事務對大粒度數(shù)據(jù)加鎖介返,隱含地對組成大粒度數(shù)據(jù)的所有小粒度數(shù)據(jù)加鎖。
多粒度層次結(jié)構(gòu)
多粒度層次樹沃斤,子節(jié)點表示的數(shù)據(jù)是父節(jié)點表示數(shù)據(jù)的一部分圣蝎。
意向鎖(intention lock mode)
如果一個節(jié)點加上了意向鎖,則意味著要在樹的較低層進行顯示加鎖衡瓶。
在一個節(jié)點顯式加鎖之前徘公,該結(jié)點的全部祖先均加上了意向鎖。
事務判定是否能夠成功地給一個結(jié)點加鎖時哮针,不必搜索整棵樹关面。
多粒度封鎖相容矩陣
共享意向鎖(IS)/排他意向鎖(IX)/共享排他意向鎖(SIX)
多粒度封鎖協(xié)議:
- 遵從鎖的相容矩陣;
- 根結(jié)點必須首先加鎖十厢,可以加任何類型的鎖缭裆;
- 僅當Ti對Q的父結(jié)點持有IX或IS鎖時,Ti對于結(jié)點Q加S或者Is鎖寿烟;
- 僅當Ti對Q的父結(jié)點持有IX或SIX鎖時, Ti對于結(jié)點Q加X辛燥、SIX筛武、IX鎖;
- 僅當Ti未曾對任何結(jié)點解鎖時挎塌,Ti可以對結(jié)點加鎖(兩階段的)徘六;
- 僅當Ti當前不持有Q的子節(jié)點的鎖時,Ti可以對節(jié)點Q解鎖榴都。
特點:
增加了并發(fā)行待锈,減少了鎖開銷。
適應范圍:
只存取幾個數(shù)據(jù)項的短事務嘴高,
由整個文件或一組文件形成報表的長事務竿音。
釋放順序:多粒度協(xié)議要求加鎖按照自頂向下的順序,而鎖的釋放按照自底向上的順序
12.7 恢復系統(tǒng)
12.7.1 故障分類
1.事務內(nèi)部的故障:
(1)有的是可以通過事務程序本身發(fā)現(xiàn)的拴驮。
(2)有的是非預期的春瞬,不能由事務程序處理的。
事務內(nèi)部更多的故障是非預期的套啤,是不能由應用程序處理的
(1)運算溢出 邏輯錯誤
(2)并發(fā)事務發(fā)生死鎖而被選中撤銷該事務 系統(tǒng)錯誤
(3)違反了某些完整性限制而被終止等 邏輯錯誤
以后宽气,事務故障僅指這類非預期的故障
2.系統(tǒng)崩潰
1、系統(tǒng)故障
稱為軟故障,是指造成系統(tǒng)停止運轉(zhuǎn)的任何事件萄涯,使得系統(tǒng)要重新啟動绪氛。
(1)整個系統(tǒng)的正常運行突然被破壞
(2)所有正在運行的事務都非正常終止
(3)不破壞數(shù)據(jù)庫
(4)內(nèi)存中數(shù)據(jù)庫緩沖區(qū)的信息全部丟失
2、系統(tǒng)故障的常見原因
(1)特定類型的硬件錯誤(如CPU故障)
(2)操作系統(tǒng)故障
(3)數(shù)據(jù)庫管理系統(tǒng)代碼錯誤
(4)系統(tǒng)斷電
3.磁盤故障
稱為硬故障涝影,指外存故障
(1)磁盤損壞
(2)磁頭碰撞
(3)瞬時強磁場干擾
介質(zhì)故障破壞數(shù)據(jù)庫或部分數(shù)據(jù)庫枣察,并影響正在存取這部分數(shù)據(jù)的所有事務
介質(zhì)故障比前兩類故障的可能性小得多,但破壞性大得多
我們把存儲器分成3類:非易失性存儲器袄琳、易失性存儲器询件、穩(wěn)定存儲器
各類故障,對數(shù)據(jù)庫的影響有兩種可能性
一是數(shù)據(jù)庫本身被破壞
二是數(shù)據(jù)庫沒有被破壞唆樊,但數(shù)據(jù)可能不正確宛琅,這是由于事務的運行被非正常終止造成的。
恢復算法兩部分:
- 在正常事務處理時采取措施逗旁,保證有足夠的信息可用于故障恢復
- 故障發(fā)生后采取措施嘿辟,將數(shù)據(jù)庫內(nèi)容恢復到某個保證數(shù)據(jù)庫ACID的狀態(tài)。
12.7.2 數(shù)據(jù)訪問
磁盤中的塊:物理塊片效。主存中的塊:緩沖塊红伦。內(nèi)存中臨時用來存放塊的區(qū)域:磁盤緩存區(qū)。
緩沖塊最終被寫道磁盤上淀衣,要么是應為緩沖區(qū)管理器用于其它用途昙读,要么是因為數(shù)據(jù)庫系統(tǒng)希望將B的變化映射到磁盤上。后一種稱為數(shù)據(jù)庫系統(tǒng)對緩沖塊強制輸出膨桥。
12.7.3 恢復和原子性
(1)恢復操作的基本原理:冗余
利用存儲在系統(tǒng)別處的冗余數(shù)據(jù)來重建數(shù)據(jù)庫中已被破壞或不正確的那部分數(shù)據(jù)
(2)恢復的實現(xiàn)技術:復雜
一個大型數(shù)據(jù)庫產(chǎn)品蛮浑,恢復子系統(tǒng)的代碼要占全部代碼的10%以上
恢復機制涉及的關鍵問題
1. 如何建立冗余數(shù)據(jù)
數(shù)據(jù)轉(zhuǎn)儲(backup):轉(zhuǎn)儲是指數(shù)據(jù)庫管理員定期地將整個數(shù)據(jù)庫復制到磁帶、磁盤或其他存儲介質(zhì)上保存起來的過程
登記日志文件(logging)
2.轉(zhuǎn)儲方法
- 靜態(tài)轉(zhuǎn)儲
在系統(tǒng)中無運行事務時進行的轉(zhuǎn)儲操作
- 動態(tài)轉(zhuǎn)儲
轉(zhuǎn)儲操作與用戶事務并發(fā)進行
- 海量轉(zhuǎn)儲: 每次轉(zhuǎn)儲全部數(shù)據(jù)庫
- 增量轉(zhuǎn)儲: 只轉(zhuǎn)儲上次轉(zhuǎn)儲后更新過的數(shù)據(jù)
日志文件(log file):是用來記錄事務對數(shù)據(jù)庫的更新操作的文件
以記錄為單位的日志文件只嚣,每條日志記錄的內(nèi)容:
- 事務標識(標明是哪個事務)
- 操作類型(插入沮稚、刪除或修改)
- 操作對象(記錄ID、Block NO.)
- 更新前數(shù)據(jù)的舊值(對插入操作而言册舞,此項為空值)
- 更新后數(shù)據(jù)的新值(對刪除操作而言, 此項為空值)
一些日志記錄類型:<T start><T commit><T abort>
為什么要先寫日志文件
寫數(shù)據(jù)庫和寫日志文件是兩個不同的操作
在這兩個操作之間可能發(fā)生故障
如果先寫了數(shù)據(jù)庫修改蕴掏,而在日志文件中沒有登記下這個修改,則以后就無法恢復這個修改了
如果先寫日志调鲸,但沒有修改數(shù)據(jù)庫盛杰,按日志文件恢復時只不過是多執(zhí)行一次不必要的UNDO操作,并不會影響數(shù)據(jù)庫的正確性
為了保證故障恢復時能使用日志文件线得,日志必須存放在穩(wěn)定存儲器中饶唤。
12.7.3.2 數(shù)據(jù)庫修改
如果一個事務直到提交時都沒有修改數(shù)據(jù)庫,我們稱它采用了延遲修改贯钩。如果數(shù)據(jù)庫修改數(shù)據(jù)庫時事務仍活躍募狂,我們稱它使用了立即修改办素。
對于事物的undo完成后,寫一個abort日志記錄祸穷,表明撤銷完成了
當一個事務的commit日志記錄輸出到穩(wěn)定存儲器后性穿,我們說這個事務提交了。如果系統(tǒng)崩潰在commit日志記錄輸出到穩(wěn)定存儲器之前雷滚,事務將回滾需曾。
故障的恢復
系統(tǒng)故障造成數(shù)據(jù)庫不一致狀態(tài)的原因
(1)未完成事務對數(shù)據(jù)庫的更新可能已寫入數(shù)據(jù)庫
(2)已提交事務對數(shù)據(jù)庫的更新可能還留在緩沖區(qū)沒來得及寫入數(shù)據(jù)庫
恢復方法
(1) Undo 故障發(fā)生時未完成的事務
(2) Redo 已完成的事務
系統(tǒng)故障的恢復由系統(tǒng)在重新啟動時自動完成,不需要用戶干預
(1)正向掃描日志文件(即從頭掃描日志文件) 事務故障反向
重做(REDO) 隊列: 在故障發(fā)生前已經(jīng)提交的事務
這些事務既有BEGIN TRANSACTION記錄祈远,也有COMMIT記錄或abort記錄
撤銷 (UNDO)隊列:故障發(fā)生時尚未完成的事務
這些事務只有BEGIN TRANSACTION記錄呆万,無相應的COMMIT記錄或abort記錄
(2) 對撤銷(UNDO)隊列事務進行撤銷(UNDO)處理
反向掃描日志文件,對每個撤銷事務的更新操作執(zhí)行逆操作
即將日志記錄中“更新前的值”寫入數(shù)據(jù)庫
(3)對重做(REDO)隊列事務進行重做(REDO)處理
正向掃描日志文件车份,對每個重做事務重新執(zhí)行登記的操作
即將日志記錄中“更新后的值”寫入數(shù)據(jù)庫
1谋减、兩個問題
(1)搜索整個日志將耗費大量的時間
(2)重做處理:重新執(zhí)行,浪費了大量時間
2扫沼、解決方案
具有檢查點(checkpoint)的恢復技術
(1)在日志文件中增加檢查點記(checkpoint)出爹。
(2)增加重新開始文件结耀。
(3)恢復子系統(tǒng)在登錄日志文件期間動態(tài)地維護日志域那。
10.6.2.檢查點技術
1凛捏、檢查點記錄的內(nèi)容
(1)建立檢查點時刻所有正在執(zhí)行的事務清單
(2)這些事務最近一個日志記錄的地址
2凳干、重新開始文件的內(nèi)容
記錄各個檢查點記錄在日志文件中的地址
3、動態(tài)維護日志文件的方法
周期性地執(zhí)行如下操作:建立檢查點连霉,保存數(shù)據(jù)庫狀態(tài)莺奸。
具體步驟是:
(1)將當前日志緩沖區(qū)中的所有日志記錄寫入磁盤的日志文件上
(2)在日志文件中寫入一個檢查點記錄
(3)將當前數(shù)據(jù)緩沖區(qū)的所有數(shù)據(jù)記錄寫入磁盤的數(shù)據(jù)庫中
(4)把檢查點記錄在日志文件中的地址寫入一個重新開始文件
4弛针、建立檢查點
恢復子系統(tǒng)可以定期或不定期地建立檢查點,保存數(shù)據(jù)庫狀態(tài):
定期:按照預定的一個時間間隔轰坊,如每隔一小時建立一個檢查點
不定期:按照某種規(guī)則抖誉,如日志文件已寫滿一半建立一個檢查點
10.6.3.利用檢查點的恢復策略
1、使用檢查點方法可以改善恢復效率
(1)當事務T在一個檢查點之前提交衰倦,T對數(shù)據(jù)庫所做的修改已寫入數(shù)據(jù)庫。
(2)寫入時間是在這個檢查點建立之前或在這個檢查點建立之時旁理。
(3)在進行恢復處理時樊零,沒有必要對事務T執(zhí)行重做操作
2、利用檢查點的恢復步驟
(1)從重新開始文件中找到最后一個檢查點記錄在日志文件中的地址孽文,由該地址在日志文件中找到最后一個檢查點記錄
(2)由該檢查點記錄得到檢查點建立時刻所有正在執(zhí)行的事務清單ACTIVE-LIST
建立兩個事務隊列
UNDO-LIST
REDO-LIST
把ACTIVE-LIST暫時放入UNDO-LIST隊列驻襟,REDO隊列暫為空。
(3)從檢查點開始正向掃描日志文件芋哭,直到日志文件結(jié)束
如有新開始的事務Ti沉衣,把Ti暫時放入UNDO-LIST隊列
如有提交的事務Tj,把Tj從UNDO-LIST隊列移到REDO-LIST隊列;直到日志文件結(jié)束
(4)對UNDO-LIST中的每個事務執(zhí)行UNDO操作
對REDO-LIST中的每個事務執(zhí)行REDO操作