數據庫整理:
按照老師的PPT整理,感謝黃老師,特別鳴謝AlvinZH的整理,本整理的部分內容由AlvinZH輝哥的整理擴充而來,配套教材《數據庫系統概論(第五版)》(王珊編著),所有SQL相關內容均采用SQL Server現行標准,尚不完整,有空會重新排版o(╥﹏╥)o歡迎指正!
引入
數據、數據庫、數據庫管理系統、數據庫系統
數據:
描述事務的符號記錄,有數據類型和數據的值,需要有語義來解釋,數據操作主要有數據管理(數據庫)、數據處理(程序)、數據傳輸(網絡)
元數據(模式),幾乎不變,在設定時定義
數據是數據庫的實例,經常改變
數據庫DB:
長期存儲在計算機內、有組織、可共享的大量數據的集合。數據按照一定的數據模型組織、描述和存儲,具有較小的冗余度、較高的數據獨立性、易擴展性
安全、方便、高效
數據庫管理系統DBMS:
計算機的基礎軟件
數據庫系統DBS:
由數據庫、數據庫管理系統、應用程序、數據庫管理員組成的存儲、管理、處理和維護數據的系統。

數據管理技術發展
人工管理階段
數據沒有直接存取設備,存在紙帶上;
應用程序管理數據;
數據不共享,不具有獨立性(數據改變后應用程序也必須改變);
文件系統階段
數據存在文件里,數據可以長期保存;
使用操作系統的IO接口訪問數據;
文件系統管理數據;
有加快數據訪問的措施;
初級的數據獨立性;
數據共享性差,冗余度大;
每個應用需要程序員從頭開始設計自己的文件格式和描述;

數據庫系統階段
主要優勢:
數據共享;
數據冗余少;
數據獨立性好;
便捷的程序接口;
高效數據訪問;
數據完整性和數據安全;
並發管理
特點:
1.數據結構化,整體數據結構化,是數據庫的主要特征之一,也是和文件系統的本質區別
2.數據共享度高、冗余度低且易擴充,數據共享可以減少數據冗余,避免數據之間的不一致性和不相容性
3.數據獨立性高,物理獨立性指應用程序和數據庫中數據的物理存儲相互獨立,邏輯獨立性指應用程序和數據庫的邏輯結構相互獨立,邏輯結構修改時應用程序可以不變
4.數據由數據庫管理系統統一管理和控制,有數據安全性保護,數據完整性檢查
隔離並發訪問,阻止產生臟數據的修改
數據庫結構受底層計算機系統的影響
數據模型
數據模型:對現實世界數據特征的抽象。是數據庫系統的核心和基礎。數據模型三個組成要素:數據結構(最重要的方面)、數據操作、數據的完整性約束條件。
三層抽象(由淺入深)
概念模型:用於數據庫設計,最流行的是E-R模型。(P16-17基本概念:實體、屬性、碼、實體類型、實體集、聯系);
邏輯模型:用於數據庫管理系統的實現;層次模型(最早出現的數據模型)、網狀模型、關系模型等;
物理模型:對數據最底層的抽象,描述數據表示方式和存取方法。
常見數據模型:
層次模型
網狀模型
關系模型
面向對象數據模型
對象關系數據模型
半結構化數據模型
層次模型和網狀模型統稱為格式化模型
基本層次聯系是指兩個記錄以及他們之間的一對多(包括一對一)的聯系
層次模型:
采用樹形結構
數據庫中定義滿足條件的基本層次聯系的集合:
1.有且只有一個結點沒有雙親結點,這個結點稱為根結點;
2.根以外的其他結點有且只有一個雙親結點。
刪除雙親結點會把子結點同時刪除
優點:
1.數據結構簡單清晰
2.查詢效率高(優於關系數據庫,不低於網狀數據庫)
3.提供了良好的完整性支持
缺點:
1.現實中很多聯系是非層次性的,不適用
2.對插入和刪除限制較多,應用程序編寫較為復雜
3.查詢子女結點必須通過雙親結點
4.結構嚴密,層次命令趨於程序化
突出優點是一對多層次聯系的部門描述自然直觀
網狀模型
數據庫中定義滿足條件的基本層次聯系的集合:
1.允許一個以上的結點無雙親;
2.一個結點可以有多於一個的雙親。
優點:
1.更為直接地描述現實世界
2.存取效率高
缺點:
1.結構復雜,不利於用戶掌握
2.DDL、DML復雜,要嵌入一種高級語言,用戶不容易掌握,不容易使用
3.訪問數據時必須適當選取路徑,用戶必須了解系統結構的細節,加重負擔
關系模型
優點:
1.建立在嚴格的數學概念的基礎上
2.概念單一,數據結構簡單清晰,易於使用
3.存取路徑對用戶透明,有更高的數據獨立性,更好的安全保密性
ER模型
實體(Entity):客觀存在並可相互區別的事物
屬性(Attribute):實體所具有的某一特性稱為屬性
鍵(Key):唯一標識實體的屬性集
實體型(entity type):用實體名及其屬性名集合來抽象和刻畫同類實體
實體集(entity set):同一類型實體的集合
關系(relationship):不同實體集直接的聯系,有一對一,一對多,多對多的類型
多元關系要轉換成多個二元關系

多元關系的箭頭:

角色:
如果多元關系中一個實體集被用到了兩次,可以通過角色來區分,如下:

一元關系的一對一:

多對一:

多對多:

ER模型(續)
約束:
始終為真的斷言
常用約束:鍵(唯一標識)、單值約束(一個實體只能有一個某類的屬性)、參照完整性約束(引用的數據庫中需要存在對應的條目)、域約束(約束某個屬性的值的范圍)
鍵
超級鍵是一組一個或多個屬性組成的唯一確定一個實體的鍵
候選鍵是最小(沒有其真子集可以滿足唯一標識)的超級鍵,候選鍵的一個被選作主鍵(primary key),主鍵要求not null
在ER圖中用下划線標注
沒有主鍵的實體集叫弱實體集,必須依賴於強實體集存在,需要和強實體集構成一對多的關系(弱實體集為多),有鑒別器(部分鍵)

E-R模型設計原則:1.避免冗余;2.限制使用弱實體集;3.能作為屬性的盡量作為屬性。
屬性原則:屬性不能再具有需要描述的性質and屬性不能與其他實體具有聯系
如果一個實體只有一個屬性,那這個實體可以使用屬性代替
盡量不用弱實體集,使用弱實體集通常的原因是沒有能夠創建唯一ID的全局權限(所有的弱實體集的屬性不能重復,例如在世界上所有的足球隊中設置獨特的球員號碼)。
關系模型
最重要的數據模型
ER模型和關系模型對比:
ER模型有很多概念,實體、屬性、關系等,關系模型只有一個概念:關系
ER模型不適合計算機實現,關系模型適合高效操作電腦
關系實例:

每個屬性的允許的值稱為域(domain)
模式和實例
模式(schema):型的描述,不涉及具體的值;
實例(instance):模式的一個具體的值。
關系模式:關系的描述,R(U,D,DOM,F)
R為關系名,U為組成該關系的屬性名集合,D為U中屬性來自的域,DOM為屬性向域的映像集合,F為屬性間數據的依賴關系集合
關系模式是型,關系是值
一個關系的模式:一個關系名,若干屬性名
一個數據庫的模式:若干個關系的模式
對數據的改變很頻繁,而對模式的改變很少見,所以模式是長期穩定的
笛卡爾積
給定一組域D1,D2,…,Dn(它們可以有相同的元素,即可以完全不同,也可以部分或全部相同)。D1,D2,…,Dn的笛卡爾積為
D1×D2×……×Dn={(d1,d2,…,dn)|di∈Di,i=1,2,…,n}。
由定義可以看出,笛卡爾積也是一個集合。
其中:
1. 元素中的每一個di叫做一個分量(Component),來自相應的域(di∈Di)
2. 每一個元素(d1,d2,d3,…,dn)叫做一個n元組(n-tuple),簡稱元組(Tuple)。但元組不是di的集合,元組的每個分量(di)是按序排列的。如:
(1,2,3)≠(2,3,1)≠(1,3,2);
而集合中的元素是沒有排序次序的,如(1,2,3)=(2,3,1)=(1,3,2)。
關系的數學定義:
關系是笛卡爾積的子集,具有有限的元組
關系:D1*D2*…Dn的子集將在在D1、D2…Dn上的關系。
候選碼:屬性組能唯一標識一個元組,而其子集不能。
主碼:多個候選碼,選定一個為主碼
主屬性:各個候選碼的屬性
非主屬性:不包含在任何候選碼中的屬性
全碼:所有屬性是這個關系模式的候選碼
關系的特點:
1.不允許有所有值完全相同的元組
2.關系是無序的(元組的順序是不相關的,可以按任意順序存儲,屬性的順序也是不相關的)
3.同一屬性名下的各個屬性值必須來自同一個域,是同一類型數據
4.各個屬性名不能相同
5.不同的屬性可以有相同的域
6.屬性的值必須是原子的,不可再分(反例如中國式報表,大表頭包含多個小表頭)
關系操作
關系操作:查詢、插入、刪除、修改(P43)
查詢:選擇、投影、連接、除、並、差、交、笛卡爾積;其中選擇、投影、並、差、笛卡爾積是5種基本操作。
關系模型(續)ER模型到關系模型的轉化
關系:指具體的表
基本情況:
1.實體集E轉換成具有E的屬性的關系(表)
2.關聯R轉換成具有屬性的關系(表),做相關的實體的鍵和關聯R的屬性
特殊情況
1)一對多、一對一關系
2)弱實體集
關系的合並
1.一對多關系可以轉換為一個獨立的關系,也可以與“多”端的關系合並,給“多”端的關系里加一個原來的“一”作為屬性
2.一對一關系可以轉換為一個獨立的關系,也可以與任意一端的關系合並,添加一個被合並的一端作為屬性
弱實體集的關聯:
關系包含弱實體集的所有屬性以及其依附的強實體集的鍵

Hosts(hostName)
Logins(loginName, hostname, time)
不需要At表,At成為了Logins的一部分
完整性約束
防止數據中語義不一致
域完整性約束(表內):限制屬性值的范圍(限制是否可以為空)
實體完整性約束(表內):不同元組的某個屬性不能相同(主鍵、唯一鍵約束)
參照完整性約束(表與表):一個表的某個屬性是其他表的某個屬性(外鍵,這個屬性需要是被參照的表的主鍵或候選鍵)
唯一鍵約束:
可以唯一區分不同的元組,允許有null值,一張表只能有一個主鍵但是可以有多個唯一鍵
關系代數
從數據庫中找出需要的內容
需要使用高級查詢語言:
理論:關系代數
實踐:SQL
關系代數:
對關系的運算來表達查詢。(運算:運算對象、運算符、運算結果)
運算對象(Operands)
關系
運算符(Operators)
對關系的操作
Five basic RA operations:
Basic Set Operations(集合運算)
union(並), difference (差)(no intersection, no complement)
Selection: s(選擇)
Projection: p (投影)
Cartesian Product: X(笛卡爾積)
集合運算:
差:R1-R2 = {t|t∈R1^t∉R2}
選擇:選擇
選擇R中滿足條件C的條目
投影:π A1,…,An (R),選擇R中的A1…An列組成新的元組,會去除重復的元組
笛卡爾積:R1 x R2 ,R1和R2中的每個元組組合
Derived operations
intersection(交)
complement(補)
join(連接)
交:R1∩R2,R1和R2中共有的所有元組,R1和R2的模式必須相同,等價於R1-(R1-R2)
連接:
θ連接

自然連接
等值連接
外部連接
θ連接:
由定義可知,當自然連接的兩個關系沒有公共屬性時,結果是笛卡爾積
θ為比較運算符,輸入R1(A1,…,An), R2(B1,…,Bm),輸出S(A1,…,An,B1,…,Bm),S中的所有元組都滿足θ,運算時可以先求笛卡爾積,然后從中篩選符合條件的結果


自然連接:
θ連接的θ條件為等於,而且等於的條件同名,最終結果只保留一列同名屬性

求解步驟:
1.求笛卡爾積R×S
2.選擇所有滿足r[Ai]=s[Bj]的元組
3.消除重復屬性

等值連接:
θ的條件為等於時為等值連接,同名的列需要用表名加點來區分
外部連接:
防止信息遺漏,先求連接,然后把外連接的表的沒有匹配上的元組全部添加進連接的結果中,用null來表示未匹配上的值
左外連接 = 自然連接 + 左側表中失配的元組。
右外連接 = 自然連接 + 右側表中失配的元組。
全外連接 = 自然連接 + 兩側表中失配的元組。

除運算
關系R除以S的結果為T,則T包含所有在R但不在S中的二屬性集及其值,且T的元組與S的元組的所有組合都在S中。(可用於驗算除運算)
方法一:設R(X,Y)和S(Y)是兩個關系,則R÷S = ∏X(R) -∏X(( ∏X(R) X S) - R )。
方法二:利用象集,參考http://blog.sina.com.cn/s/blog_9f4669510100z2ld.html 妙啊!
RS÷S的意義就是:在R和S的聯系RS中,找出與S中所有的元組全都有關系的R元組。
關系代數缺陷:不能傳遞閉包
SQL
DDL數據定義語言:
create、drop、alter、commit、rename、truncate。(P80-P85)
RESTRICT:表示刪除時有限制條件,有依賴對象不允許刪除;
CASCADE:級聯刪除,刪除時相關的依賴對象也被刪除。
建議看一下創建表、修改表、刪除表、創建視圖、刪除視圖看一下。比如主鍵怎么寫呀(PRIMARY KEY),唯一(UNIQUE)、視圖檢查(WITH CHECK OPTION)等。

查詢
DQL數據查詢語言(P89-P115)SQL是結構化查詢語言
SELECT [ALL|DISTINCT] <目標表達式> [,<目標表達式>]... FROM <表名或視圖名> [,<表名或視圖名>...] | (<SELECT 語句>)[AS] <別名> [WHERE <條件表達式>] [GROUP BY <列名1> [HAVING <條件表達式>]] [ORDER BY <列名2> [ASC|DESC]];
如果要結果中有新的列名,用as
需要刪除結果中的相同元組,用distinct
select distinct branch_name from loan
保留所有的元組用all(默認保留所有)
select all branch_name from loan
1.SELECT語句后面可接:算術表達式、字符串常量、函數(比如轉換大小寫)、屬性別名(as后的內容)等
2. WHERE語句后面可接:比較、范圍(BETWEEN AND)、集合(IN)、匹配(NOT LIKE %_)、空值(IS NULL)、多重條件
注:ESCAPE ‘<換碼字符>’對通配符進行轉義; eg:
Order by默認升序,asc升序,desc降序,
必須用在查詢最后,可以有多個排序關鍵字
兩個單引號表示一個單引號
匹配中%匹配任意字符串,_匹配任意字符
3. 空值:不能用‘=’,判斷用IS|IS NOT。空值具有不確定性。
3-valued logic: TRUE, FALSE, UNKNOWN.
假定TRUE = 1, FALSE = 0, and UNKNOWN = ½,AND = MIN; OR = MAX, NOT(x) = 1-x。
4. 聚集函數:COUNT、SUM、AVG、MAX、MIN
注:WHERE語句中不能用聚集函數作為條件表達式,SELECT、HAVING中才能用。
集函數內可以用distinct/all,計算 不重復的/所有的 結果
集函數在統計時如果值全為null,結果也為null,否則所有的null被忽略,只統計非null
5. 分組Group by:按照某一列或多列分組,值相等的為一組,目的是細化集函數的作用對象,分組后集函數作用於每一組,每組有一個函數值
注:如果使用了聚集函數,則SELECT后只能接聚集函數或者GROUP BY后面的屬性(屬性集)。
6. WHERE:作用於基本表或視圖,選擇滿足條件的元組,對原始表篩選;
HAVING:作用於組,選擇滿足條件的組,條件是組屬性/集函數,對原始表經處理后的表篩選。
7.
SELECT S FROM R1,…,Rn WHERE C1 GROUP BY a1,…,ak HAVING C2
執行順序:
a.計算FROM-WHERE部分,得到有所有R1,…,Rn屬性的表;
b.按照屬性a1,…,ak分組;
c.計算C2中的集函數,只保留滿足C2的組;
d.計算S,返回結果
8. 連接:有重名屬性用表名加點表示,沒有重名屬性可以直接表示,在where里連接,實際上執行時是遍歷FROM中表的所有元組,依次判斷是否符合WHERE;
自身連接:取別名操作,在FROM中顯式定義兩個同表的元組變量;eg:
外連接:
FROM S LEFT|RIGHT|FULL OUTER JOIN SC ON (S.Sno=SC.Sno)
SQL Server不支持 Natual join
inner join等同於在where里寫連接條件,R JOIN S on <condition>是θ連接

9. 子查詢:如果子查詢的結果可以保證只有一個元組,則可以用作值
在FEOM和WHERE中都可插入子查詢。
不相關子查詢:子查詢的查詢條件不依賴於父查詢。
相關子查詢:子查詢的查詢條件依賴於父查詢。eg:
注:
子查詢中最好用元組變量來命名結果元組
子查詢中不可用ORDER BY。
有些嵌套查詢可以用連接代替,有些不行。
一些帶EXISTS或NOT EXISTS謂詞的子查詢不能被其他形式的子查詢等價替換;
所有帶IN謂詞(IN謂詞通常出現在where中后跟子查詢)、比較運算符、ANY和ALL謂詞的子查詢都能用帶EXISTS謂詞的子查詢等價替換。
ANY(SOME):某個
ALL:所有
對應集函數:
EXIST:存在。不返回數據,只產生邏輯真值。
全稱量詞轉換(難點):選修了全部課程->沒有一門課不選。(P110)
特稱量詞轉換(難點):選修了A選的全部課程->沒有一門A選過的課不選。(P111)
10. 集合查詢:並(UNION)、交(INTERSECT)、差(EXCEPT)。對多個SELECT結果進行操作。

SQL續
DDL數據定義語言:
create、drop、alter、commit、rename、truncate。(P80-P85)
RESTRICT:表示刪除時有限制條件,有依賴對象(作外鍵、包含視圖、觸發器等)不允許刪除;
CASCADE:級聯刪除,刪除時相關的依賴對象也被刪除。
建議看一下創建表、修改表、刪除表、創建視圖、刪除視圖看一下。比如主鍵怎么寫呀(PRIMARY KEY),唯一(UNIQUE)、視圖檢查(WITH CHECK OPTION)等。
多屬性鍵:Primary key(a, b)(a, b為屬性名)
primary key 和 unique
1.每個關系可以有一個主鍵,但是可以有多個unique
2.主鍵的值永遠是not null,而unique的值可以有null(最多一個)
3.數據庫管理系統會給主鍵默認建立索引
4.都可以作為外鍵被引用
DML數據操作語言:insert、update、delete。(P115-P119)
1.
INSERT INTO <表名> [(<屬性列1>[,<屬性列2>]…)] 注:可以指定屬性插入 VALUES (<常量1>[,<常量2>]…); INSERT INTO <表名> [(<屬性列1>[,<屬性列2>]…)] 子查詢;
注:使用子查詢時在insert into 表A 后一定要寫明屬性,如果子查詢的數據類型與要插入的表中的類型不一致時,會進行強制轉換
2.
UPDATE <表名> SET <列名>=<表達式>[,<列名>=<表達式>]… [WHERE <條件>];
3.
DELETE FROM <表名> [WHERE <條件>];
注:不寫where時會刪除表里所有的元組
視圖(VIEW):
視圖是從一個或幾個基本表(視圖)導出的表。視圖與基本表不同,視圖是一個虛表,數據庫中只存儲視圖的定義,而不存放視圖所對應的數據,對視圖查詢時才會按視圖的定義從基本表中查詢。(P121-129)
作用:簡化用戶的操作;使用戶能以多種角度看待同一數據;對重構數據庫提供了一定程度的邏輯獨立性;能夠對機密數據提供安全保護。(壓題哈哈哈)
CREATE VIEW <視圖名> [(<列名1>[,<列名2>]…)] AS <子查詢> [WITH CHECK OPTION];
注:必須指定視圖的所有列名的情況:
a.有目標列不是單純的屬性名,而是聚集函數或表達式
b.多表連接時選出了幾個同名列作為視圖的字段
c.需要在視圖中為某個列啟用新的列名
1.行列子集視圖:單表導出,單純取出的某些列和行,並且保留了主碼。
2.視圖消解:把視圖的定義和查詢結合起來轉換為等價的對基本表的查詢,多數關系數據庫對行列子集視圖的查詢可以正確轉換,非行列子集視圖就不一定了。
3.更新視圖:也需要轉換為對基本表的更新。一般的,行列子集視圖是可更新的
with check opinion可更新視圖,會在增刪改時關系數據庫管理系統會檢查視圖定義中的條件,如果不滿足會拒絕執行操作,比如插入的數據與where子句中的條件不符,會拒絕插入。使用select * 的視圖可擴充性差。
4.視圖的作用:P128-P129
作用:
1簡化查詢
2屏蔽底層數據庫的改變,實現數據獨立
3提供權限,不同的用戶可以使用不同的表中的不同字段,可以解決一個用戶可以查看不同表中的部分字段的問題,把用戶可以查看的字段放進一個視圖
索引
索引(INDEX):索引是對數據庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問數據庫表中的特定信息,數據庫索引類似圖書索引,可以加快查詢速度。(前年考題)
(1) 關系數據庫管理系統會自動選擇合適的索引作為存儲路徑,用戶不需要顯式選擇索引。
(2) 聚簇索引:聚簇索引的索引項順序與表中記錄的物理順序一致。所以在一個基本表上最多只能建立一個聚簇索引。對於基於聚簇索引列的查詢(特別是范圍查詢),可以提高查詢效率。
(3) 聚簇索引的適用范圍:聚簇索引列存在大量非重復值;很少對基表進行增刪操作;很少對其中的變長列進行修改操作。
聲明格式:
CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
· 用<表名>指定要建索引的基本表名字
· 索引可以建立在該表的一列或多列上,各列名之間用逗號分隔
· 用<次序>指定索引值的排列次序,升序:ASC,降序:DESC。缺省值:ASC
· UNIQUE表明此索引的每一個索引值只對應唯一的數據記錄
· CLUSTER表示要建立的索引是聚簇索引,建立聚簇索引后,基表中數據也需要按指定的聚簇屬性值的升序或降序存放。也即聚簇索引的索引項順序與表中記錄的物理順序一致,一個基本表只能建立一個聚簇索引
適用范圍:
a.聚簇索引列存在大量非重復值
b.很少對基表進行增刪操作
c.很少對其中的變長列進行修改操作
對於已含重復值的屬性列不能建UNIQUE索引,對某個列建立UNIQUE索引后,插入新記錄時DBMS會自動檢查新記錄在該列上是否取了重復值。這相當於增加了一個UNIQUE約束
設計原則
· 索引是物理結構設計的主要內容之一
· 選擇索引列的一般原則如下:
· 經常作為選擇運算比較列的屬性應設置為索引列
· 在學生表中,常按照學生姓名進行查找,則學生姓名應設定為索引
· 對索引列的常見查詢的查詢結果占總記錄數的百分比不宜過高
· 學生表中性別列的取值只有“男”或“女”,在這個列上建索引意義不大(除非使用位圖索引)
· 索引列數量應盡量少
· 索引太多會造成數據更新速度變慢
· 在查詢條件子句中盡量不要對索引列進行函數計算
· 例如設salary為索引列,則salary/6000>age/50這樣的語句會造成數據庫無法使用索引
· 應改造成salary>6000*(age/50)的形式,即表達式左邊是單獨的索引列
完整性約束
數據庫的完整性:數據的正確性和相容性。(看下概念P157)
約束是數據庫需要強制執行的元素之間的關系,必須始終為真,防止出現不一致
約束分類:
1.碼(主鍵、候選鍵)PRIMARY (A1, A2, .., An) or UNIQUE (A1, A2, ..., An),插入時會檢查是否已插入了鍵相同的元組;
2.屬性約束,NOT NULL, CHECK,注:check里對屬性約束,出現的其他屬性需要寫在子查詢里,check只在insert/update時檢查; e.g:
3.元組約束 eg:

4.外鍵或參照完整性,要求某個屬性是另一個表里的主鍵,可以定義在屬性后
REFERENCES <relation> ( <attributes> )
也可以定義在建表里作元素
FOREIGN KEY ( <list of attributes> ) REFERENCES <relation> ( <attributes> )
對被引用的表的元組修改的處理:(三種可以的方法)
a.默認default:拒絕修改被引用的表的元組
b.級聯cascade:在引用的表中和被引用的元組進行相同的操作,主刪外刪,主改外改。比如Beers和Sells表,刪除Beers中的元組,會把Sells里涉及被刪除的beer的元組刪除,同理對Beers的元組修改會對Sells里的值也修改
c.設空值set null:把引用的表的值設為null,主刪外NULL,主改外改。比如Sells的被刪除的beer被null替換
如果要在修改時不采用默認的(拒絕執行),需要顯式在建表時說明

5.斷言:復雜的check語句拿出來單獨寫。
格式:
CREATE ASSERTION <斷言名> <check子句>
每次對關系修改都要執行,效率不高,系統不能“智能”判斷何時執行斷言檢查。
drop constraint <約束名>
可以刪除約束
drop assertion <斷言名>
可以刪除斷言
觸發器
1.格式
CREATE TRIGGER <觸發器名> {BEFORE|AFTER|INSTEAD OF} <觸發事件>ON <表名>/*指明觸發器激活的時間*/ REFERENCING NEW|OLD ROW AS <變量>/*指出引用的變量*/ FOR EACH {ROW|STATEMENT} /*指明觸發器類型,即動作發生頻率*/ [WHEN<觸發條件>] <觸發動作> /*當觸發條件為真時才觸發動作體*/
2.觸發事件-條件-動作規則,當特定的系統事件(插入、更新等)發生時,如果規則的條件成立,則執行規則中的動作,否則不執行該動作。
3.為了解決斷言效率低,不會判斷是否應該執行check的問題,允許使用者指定何時執行check
4.觸發事件 AFTER /BEFORE /INSTEDA OF,instead of是對視圖的修改,會把被instead of的對基本表的修改替換成對視圖的修改,SQL Server專有
5.觸發器類型,for each row會對每一行都執行,for each statement只執行一次,默認是后者
6.REFERENCING里引用的內容,如果是for each row,則可以引用old row| new row表示修改前后的元組,如果是for each statement,則可以引用old table| new table表示修改前后的表
7. Inserted 、Deleted指代改變的表,前者指用戶插入的數據,后者指用戶刪除的數據
如果是update事件,則Inserted、Deleted表里都有內容(update的實質是先delete再insert) 如果只是insert、delete事件,則只有對應的表里有內容
例:視圖的觸發器


存儲過程和觸發器
Transact-SQL數據庫編程
存儲過程
存儲過程:一組完成特定功能的SQL 語句集。系統提供/用戶自定義存儲過程。
作用:在服務器端快速執行SQL語句,效率高
降低了客戶機和服務器之間的通信量
方便實施企業規則
語法:
1.聲明:
declare @局部變量 <變量類型> [,@局部變量 <變量類型>……]
全局變量用@@開頭
2.賦值:
select @局部變量 = 變量值 set @局部變量 = 變量值
3.注釋:
--單行注釋; /* 多行注釋 */
4.流程控制:begin end ,if else,
分支判斷
格式a:
CASE <運算式> WHEN <運算式> THEN <運算式> … WHEN <運算式> THEN <運算式> [ELSE <運算式>] END
格式b:
CASE WHEN <條件表達式> THEN <運算式> … WHEN <條件表達式> THEN <運算式> [ELSE <運算式>] END
循環:
WHILE <條件表達式> BEGIN <命令行或程序塊> [BREAK] [CONTINUE] [命令行或程序塊] END
等待:
WAITFOR {DELAY <‘時間’> | TIME <‘時間’>| ERROREXIT | PROCESSEXIT | MIRROREXIT}
時間必須為DATETIME類型
a.DELAY:用來設定等待的時間,最多可達24 小時
b.TIME:用來設定等待結束的時間點
c.ERROREXIT:直到處理非正常中斷
d.PROCESSEXIT:直到處理正常或非正常中斷
e.MIRROREXI: 直到鏡像設備失敗
GOTO: 跳轉到以”:”結尾的標識符
RETURN: RETURN [(整數值)],結束當前程序,返回到上一個調用它的程序或其他程 序,括號內可以指定一個返回值,否則會根據程序執行結果返回默認值
EXEC: 用於執行存儲過程,EXEC <存儲過程名>[參數1[,參數2]……]
PRINT: 打印,CONVERT()可以把不是字符串的內容強制轉換成字符串
觸發器的作用
1.通過數據庫中相關的表進行級聯修改。
2.禁止或回滾違反引用完整性的更改,從而取消所嘗試的數據修改事務。
3.實現比 CHECK 約束定義的限制更為復雜的限制。
4.找到數據修改前后表狀態的差異,並基於此差異采取行動
規范化理論
摘抄:http://www.cnblogs.com/AlvinZH/p/6856298.html
關系模式的問題:
- 數據冗余:重復出現,浪費空間。(盡可能少)
- 更新異常:更新代價(最好沒有)
- 插入異常:插入部分信息時無法插入(最好沒有)
- 刪除異常:可能刪除了其他想要的數據(最好沒有)
函數依賴
非平凡函數依賴
完全函數依賴
部分函數依賴
傳遞函數依賴
1.函數依賴:(概念省略,X、Y是屬性組U的子集)X函數確定Y或Y函數依賴於X,記作X→Y。例如:系號→系名,學號→姓名。
(1)函數依賴不是指關系模式R中的某些關系滿足的約束條件,而是指R上的一切關系都要滿足的約束條件。函數依賴關系的存在與時間無關,而只與數據之間的語義規定有關。 函數依賴的存在與時間無關,只與數據之間的語義定義有關。
(2)函數依賴的基本性質:擴張性,投影性,合並性,分解性,
2.非平凡的函數依賴X→Y:X→Y,但Y不包含於X。默認我么討論的都是非平凡的函數依賴。
3.平凡的函數依賴X→Y:X→Y,但Y包含於X。必然成立(好像是廢話)。
4.若X→Y,則稱X為這個函數依賴的決定屬性組,也稱決定因素,Y為依賴因素。
5.完全函數依賴:在R(U)中,如果X → Y,並且對於X的任何一個真子集X’,都有X’ /→ Y,則稱Y對X完全函數依賴。記作X F→ Y。
推論:單一決定因素一定是完全函數依賴。
例:(學號,課程號)→成績
6.部分函數依賴:在R(U)中,如果X→Y,且Y不完全函數依賴於X,則稱Y對X部分函數依賴。記作X P→ Y。
例:(學號,課程號)→課程名 (因為課程號→課程名,而課程號是(學號,課程號)的真子集)
7.傳遞函數依賴:在R(U)中,如果X→Y(Y不包含於X),Y /→ X,Y→Z(Z不包含於Y),則稱Z對X傳遞函數依賴。記為X 傳遞(t)→ Z。
注:條件中要有Y /→ X,是因為如果Y→ X,則Y←→ X,則X直接→ Z,屬於直接函數依賴,而非間接。
例:系號→系名,系名→系主任名。
碼
1.候選碼:設K為R<U,F>中的屬性或屬性組合,若K F→ U,則稱K為R的候選碼(候選鍵)。(即U完全依賴於K)。
2.超碼:若U部分依賴於K,即K P→ U,則稱K為超碼(超鍵)。候選碼是最小的超碼
3.候選碼可能多於一個,可選其中一個作為主碼。包含在任何一個候選碼中的屬性稱為主屬性;不包含在任何一個候選碼中的屬性稱為非主屬性(非碼屬性)。最簡單的情況,單個屬性是碼(主碼或候選碼);最極端的情況,整個屬性組U是碼,稱為全碼。(主碼和候選碼都簡稱碼)
4.關系模式R中的屬性或屬性組X不是R的碼,但X是另一個關系模式的碼,則稱X為R的外部碼(外碼)。
范式

1.第一范式(1NF):每一個分量必須是不可分的數據項(關系中每個屬性都是不可再分的簡單項)。
2.第二范式(2NF):若R滿足第一范式,且每一個非主屬性完全函數依賴於任何一個候選碼。
推論:候選碼為單屬性或者全碼,則屬於2NF。
特點:不存在非主屬性對候選碼的部分函數依賴。
1NF→2NF:消除非主屬性對候選碼的部分函數依賴,把部分函數依賴投影出來單獨成表。(一事一表)
3.第三范式(3NF):若R滿足第二范式,且它的每一個非主屬性都不傳遞依賴於任何候選碼。
定義:關系模式R<U,F>屬於第一范式,若R中不存在這樣的碼X,屬性組Y及非主屬性Z(Y不包含於Z)使得X→Y,Y→Z成立,Y/→X,則稱R屬於3NF。
定義理解:3NF的定義由1NF推過來的,不太好理解,判定的話用上上行2NF推導過來的就可以了,這個定義同時也可以證明,若R屬於3NF,則R必屬於2NF。
特點:每一個非主屬性對候選碼沒有部分函數依賴,也沒有傳遞函數依賴。
缺點:3NF只限制了非主屬性對鍵的依賴關系,而沒有限制主屬性對鍵的依賴。
2NF→3NF:消除非主屬性對鍵的傳遞函數依賴,把傳遞依賴投影出來單獨成表。(一事一表)
4.BCNF:關系模式R<U,F>中,每一個決定因素都包含R的一個碼(候選鍵),則R屬於BCNF。
定義:關系模式R<U,F>屬於第一范式,若X→Y(Y不包含於X)時X必含有碼,則R屬於BCNF。
特點:排除任何屬性對候選碼的傳遞函數依賴和部分函數依賴。在函數依賴范疇內實現徹底分離,消除插入和刪除異常。
3NF→BCNF:消除原關系中主屬性對鍵的部分函數依賴和傳遞函數依賴。
推論:如果R屬於BCNF,則
a.R中所有非主屬性對每一個碼都是完全函數依賴;
b.R中所有主屬性對每一個不包含它的碼,都是完全函數依賴;
c.R中沒有任何屬性完全函數依賴於非碼的任何一組屬性。
定理:如果R屬於BCNF,則R屬於3NF一定成立。反之不一定成立,因為3NF的不徹底性(可能存在主屬性對碼的部分依賴和傳遞依賴)。
第一、二范式(部分第三范式)的缺點:
1.數據冗余
2.插入異常
3.刪除異常
4.更新異常
數據依賴的公理系統
U為屬性集總體,R為關系模式
A1(自反性,reflexivity):若YÍ XÍU,則X→Y在R上成立。
A2(增廣性,augmentation):若X→Y在R上成立,且ZÍU,則XZ→YZ在R上成立。
A3(傳遞性,transitivity):若X→Y和Y→Z在R上成立,則X→Z在R上成立
注:XZ代指X∪Z
函數依賴的邏輯蘊涵
定義 設F是在關系模式R上成立的函數依賴的集合,X→Y是一個函數依賴。如果對於R的每個滿足F的關系r也滿足X→Y,那么稱F邏輯蘊涵X→Y,記為F ⊨ X→Y。
定義 設F是函數依賴集,被F邏輯蘊涵的函數依賴全體構成的集合,稱為函數依賴集F的閉包(closure),記為F+。即 F+={ X→Y |記為F⊨X→Y。 }
定理:推理規則(A1, A2, A3)是完備的,也就是所有F+中的函數依賴都可用此三個規則導出;能用此三規則導出的函數依賴都屬於F+
屬性集的閉包
設F是屬性集U上的函數集,X是U的子集,那么(相對於F)屬性集X的閉包用X+表示,它是一個從F集使用函數依賴推理規則推出的所有滿足X→A的屬性A的集合:X+={ 屬性A | X→A在F+中 }
定理: X→Y能用函數依賴推理規則推出的充分必要條件是YÍX+。
例 屬性集U為ABCD,函數依賴集為{ A→B,B→C,D→B }。則可求出A+=ABC,(AD)+=ABCD,(BD)+=BCD,等等。
最小函數依賴集
定義 如果關系模式R(U)上的兩個函數依賴集F和G,有F+=G+,則稱F和G是等價的函數依賴集。
定義 設F是屬性集U上的函數依賴集。如果Fmin是F的一個最小依賴集,那么Fmin應滿足下列四個條件:
⑴ Fmin+ =F+;
⑵ 每個函數依賴的右邊都是單屬性;
⑶ Fmin中沒有冗余的函數依賴(即Fmin中不存在這樣的函數依賴X→Y,使得Fmin與Fmin -{ X→Y }等價);
⑷ 每個函數依賴的左邊沒有冗余的屬性(即Fmin中不存在這樣的函數依賴X→Y,X有真子集W使得Fmin -{ X→Y }∪{ W→Y }與Fmin等價)
例 設F是關系模式R(ABC)的函數依賴集,F={ A→BC,B→C,A→B,AB→C },試求Fmin。
① 先把F中的函數依賴寫成右邊是單屬性形式:
F={ A→B,A→C,B→C,A→B,AB→C }
顯然多了一個A→B,可刪去。得F={ A→B,A→C,B→C,AB→C }
② F中A→C可從A→B和B→C推出,因此A→C是冗余的,可刪去。得F={ A→B,B→C,AB→C }
③ F中AB→C可從A→B和B→C推出,因此AB→C也可刪去。最后得F={ A→B,B→C },即所求的Fmin。
規范化:投影分解
規范化的基本原則就是遵從概念單一化“一事一表”的原則,即一個關系只描述一個實體或者實體間的聯系。
若多於一個實體,就把它“分離”出來。
因此,所謂規范化,實質上是概念的單一化,即一個關系表示一個實體
規范化就是對原關系進行投影,消除決定屬性不是候選鍵的任何函數依賴。具體可以分為以下幾步:
1.對1NF關系進行投影,消除原關系中非主屬性對鍵的部分函數依賴,將1NF關系轉換成若干個2NF關系。
2.對2NF關系進行投影,消除原關系中非主屬性對鍵的傳遞函數依賴,將2NF關系轉換成若干個3NF關系。
3.對3NF關系進行投影,消除原關系中主屬性對鍵的部分函數依賴和傳遞函數依賴,也就是說使決定因素都包含一個候選鍵。得到一組BCNF關系

■ 對於那些只要求查詢而不要求插入、刪除等操作的系統,幾種異常現象的存在並不影響數據庫的操作。這時便不宜過度分解,否則當要對整體查詢時,需要更多的多表連接操作,這有可能得不償失。
■ 在實際應用中,最有價值的是3NF和BCNF,在進行關系模式的設計時,通常分解到3NF就足夠了。
無損連接性(Lossless Join):設關系模式R(U,F)被分解為若干個關系模式R1(U1,F1),R2(U2,F2),…, Rn(Un,Fn),其中U=U1U2…UN,且不存在UNUj式,Fi為F在Uj上的投影,如果R與R1,R2,…,Rn自然連接的結果相等,則稱關系模式R的分解具有無損連接性。
簡單來說,就是如果對分解后的新關系進行自然連接得到的元組的集合與原關系完全一致,則稱為無損連接。
函數依賴保持性(Preserve Dependency):設關系模式R(U,F)被分解為若干個關系模式R1(U1,F1),R2(U2,F2),…, Rn(Un,Fn),其中U=U1U2…UN,且不存在UNUj式,Fi為F在Uj上的投影;如果F所蘊含的任意一個函數依賴一定也由(F1 U F2 …U Fn)所蘊含,則稱關系模式R的分解具有函數依賴保持性
簡單來說,如果F上的每一個函數依賴都在其分解后的某一個關系上成立,則這個分解是保持函數依賴的(注意:這是一個充分條件)
分解等價判斷
判斷對關系模式的一個分解是否與原關系模式等價可以有三種不同的標准:
1.分解要具有無損連接性。
2.分解要具有函數依賴保持性。
3.分解既要具有無損連接性,又要具有函數依賴保持性。
注:
a.如果一個分解具有無損連接性,則能夠保證不丟失信息。如果一個分解具有函數 依賴保持性,則可以減輕或解決各種異常情況。
b.如果要求分解既具有無損連接性,又具有函數依賴保持性,則分解一定能夠達到 3NF,但不一定能夠達到BCNF。
c.在3NF的規范化中,既要檢查分解是否具有無損連接性,又要檢查分解是否具有 函數依賴保持性。只有這兩條都滿足,才能保證分解的正確性和有效性,才既不會 發生信息丟失,又保證關系中的數據滿足完整性約束。
非規范化技術:
有時候可以適當降低甚至拋棄關系模式的范式,提高數據庫運行效率。比如經常從兩個表中查詢數據,為了避免頻繁連接,可以適當數據冗余。
(1)表分割:
水平分割: 根據一列或多列數據的值把數據行放到兩個獨立的表中,通常在查詢時需要多個表名,查詢所有數據需要union操作
垂直分割: 把主鍵和一些列放到一個表,然后把主鍵和另外的列放到另一個表中,需要管理冗余列,查詢所有數據需要join操作
(2)非規范化設計的主要優點
減少了查詢操作所需的連接
減少了外部鍵和索引的數量
可以預先進行統計計算,提高了查詢時的響應速度
(3)非規范化存在的主要問題
增加了數據冗余
影響數據庫的完整性
降低了數據更新的速度
增加了存儲表所占用的物理空間
事務(Transaction)
用戶定義的一個數據庫操作序列。ACID特性(原子性Atomicity、一致性Consistency、隔離性Isolation、持續性Durability)。
原子性:事務是數據庫的邏輯工作單位,一個事務中的操作要么都做,要么都不做
一致性:數據庫中只包含成功事務提交的結果時,數據庫處於一致性狀態,否則處於不一致性狀態
隔離性:事務的執行不能被其他事務干擾,並發執行的事務之間不互相干擾
持續性:一個事務提交以后對數據庫數據的改變就是永久性的,其他操作不能對結果有影響
事務的狀態:
active 初始狀態,事務在執行時處於此狀態
partially committed,事務最終的操作執行之前
failed,事務不能正常執行
aborted,在事務回滾后,數據庫恢復到執行事務之前的狀態,中止,可以有兩種處理:1.重新執行事務;2.殺死事務
committed,在成功執行之后

SQL與Transaction
每個SQL語句都是默認的事務,隱式啟動,如果成功執行會隱式提交
事務可以在SQL里表示,begin transaction , commit, rollback
數據庫系統的恢復管理部件負責對原子性和持續性的支持
shadow-database方案:
1.假設每次只有一個事務處於激活狀態.
2.指針db_pointer 總是指向當前的數據庫的一致拷貝.
3.所有更新都是對數據庫的一份shadow copy 進行的, 僅當事務到達部分提交狀態並且所有更新頁都已寫回磁盤db_pointer 才指向更新后的shadow copy.
4.如果事務失敗, db_pointer所指向的舊的一致拷貝仍可用, 而shadow copy 則被刪除.
注:不處理並發事務
並發執行:
多個事務可同時運行,優點:
1.增加處理器和磁盤利用率
2.減少事務的平均響應時間(短事務不需要等在長事務后)
調度(Schedule)
指定並發事務指令執行的按時間順序執行的指令序列
一組事務的調度必須由這些事務的所有指令,必須保存每個事務內部的指令順序。
可串行性概念
1.可串行化調度:多個事務的並發執行結果與按某一次序串行地執行這些事務結果相同。(P317)
2.沖突操作:不同事務對同一數據的讀寫操作和寫寫操作(至少有一個寫操作)。
3.沖突可串行化調度:判斷可串行化調度的充分條件。一個調度Sc在保證沖突操作次 序不變的情況下交換兩個事務不沖突操作次序得到調度Sc‘,若Sc‘是串行的,則Sc是 沖突可串行化的調度。
注:前趨圖
事務作結點,對於沖突的事務Ti和Tj,不妨設Ti先訪問沖突的內容,則畫弧 Ti->Tj,可串行化的調度的前趨圖沒有閉環。
沒有閉環的前趨圖可以通過拓撲排序得到串行化序列
4.可恢復調度:對於每對事務Ti和Tj,如果Tj讀取了由Ti所寫的數據項,則Ti應先於 Tj提交。這樣的調度稱為可恢復調度。
不可恢復調度:事務Ti和Tj,Tj讀取了由Ti所寫的數據項,如果Ti后於Tj提交,那么 Ti提交時出現錯誤,Ti回滾,而Tj卻回滾不了了。
5.級聯回滾(Cascading Rollbacks):事務Ti和Tj,Tj讀取了由Ti所寫的數據項,如果Ti回滾,那么Tj也要回滾。
系統應該避免級聯回滾,因為級聯回滾需要撤銷大量的操作。
6.無級聯調度:為了避免調度中事務的級聯回滾,對於每對事務Ti和Tj,如果Tj讀取 了由Ti所寫的數據項,則Ti必須在Tj讀取之前提交。這樣的調度稱為無級聯調度。(同 時保證了可恢復性)
並發控制(Concurrency Control)
為保證數據庫的一致性, 調度必須是沖突或觀察可串行化的, 可恢復的, 並且最好是無級聯回滾的。
並發操作帶來的數據不一致性,主要原因是並發操作破壞了事務的隔離性。
1.丟失修改:
2.不可重復讀:
3.讀臟數據:
因此需要並發控制,其主要技術有:封鎖,時間戳,樂觀控制法,多版本並發控制等
鎖機制
並發控制:事務是並發控制的基本單位。
1.封鎖:排他鎖(Exclusive locks,簡稱X鎖)、共享鎖(share locks,簡稱S鎖)。
X鎖(寫鎖):若事務T對數據對象A加上X鎖,則其他事務在T釋放此鎖之前不能讀取和修改A。
S鎖(讀鎖):若事務T對數據對象A加上S鎖,則T可以讀A但不能修改A,其他事務只能再對A加S鎖,不能加X鎖,直到T釋放A上的S鎖為止。
2. 一級封鎖協議:防止丟失修改。
二級封鎖協議:一級+防止讀“臟”數據。
三級封鎖協議:二級+防止了不可重復讀。
3.兩段鎖協議:所有事務必須分兩個階段對數據項加鎖和解鎖。第一階段獲得封鎖,稱為擴展階段(Growing Phase);第二階段釋放封鎖,也稱收縮階段(Shrinking Phase)。(下面兩個用來判斷一個調度是否符合兩段鎖協議)(P319)
① 在對任何數據進行讀寫之前首先申請並獲得對該數據的封鎖。
② 在釋放一個封鎖之后,事務不再申請和獲得任何其他封鎖。
推論1:若並發執行的所有事務均遵循兩段鎖協議,則對這些事務的任何並發調度策略都是可串行化的。注意這是一個充分條件。
推論2:兩段鎖協議與防治死鎖的一次封鎖法有異同之處,遵循兩段鎖協議的事務可能發生死鎖。(P320)
擴展:加強版兩段鎖協議(Strict 2PL):除了2PL內容,還有所有事務持有的鎖只有當事務完成才被釋放。可嚴格避免級聯回滾。
4.有關鎖的請求由Lock Manager處理,LM包含當前持有鎖的事務列表、鎖的類型、鎖請求隊列指針。鎖定請求到達時,如果有其他事務持有沖突的鎖,則把請求者放入請求隊列,否則創建條目並授予請求的鎖。共享鎖升級為排他鎖可能導致死鎖問題。
5.死鎖:
a.預防:根據時間戳分配優先級,假設Ti想要得到Tj持有的鎖,有兩種方式:
1)等待死亡:如果Ti比Tj優先級高,則Ti等待Tj,否則Ti中止
2)傷害等待:如果Ti比Tj優先級高,Tj中止,否則Ti等待
b.檢測:允許死鎖發生,需要檢查和修復它們。創建一個等待圖,節點是事務,如 果Ti在等待Tj釋放一個鎖,那么從Ti到Tj有一條有向邊。定期檢查等待圖里 是否有循環,如果發現了死鎖,中止/回滾其中的一個事務
備份恢復(Recovery)
事務的基本操作:
INPUT(X)->READ(X,t)->WRITE(X,t)->OUTPUT(X)
讀取X到內存緩沖區->把X拷貝給事務局部變量t->把事務局部變量t拷貝給X->把X寫進磁盤
日志
只能添加的包含日志記錄的文件,多個事務並發執行時日志記錄是交叉存的
系統崩潰后,使用日志 重做一些未提交的事務/撤銷其他沒有提交的事務
登記日志文件時必須遵循兩條原則:登記的次序嚴格按並發事務執行的時間次序;必須先寫日志文件,后寫數據庫。
撤銷
記錄:
<START T>事務T開始
<COMMIT T>事務T提交
<ABORT T>事務T中止
<T,X,v>事務T更新了元素X,舊的值為v
撤銷日志規則:
1.如果事務T修改了X,那么<T,X,v>必須在X被寫入磁盤之前寫入磁盤
2.如果事務T提交,那么<COMMIT T>必須在所有事務T要執行的修改執行之后再寫入磁盤
因此,輸出是早期完成的(相比commit)
撤銷的恢復步驟:

注:undo操作是冪等的,可以多次執行,所以如果恢復時系統崩潰,只需再執行一遍恢復
日志文件需要讀完整,效率低,可以用檢查點來提高效率
重做
定期檢查數據庫
1.停止接收新的事務
2.等待當前的所有事務完成
3.刷新日志到磁盤
4.寫入<CKPT>日志記錄並刷新
5.繼續接收事務
檢查點記錄:
<START T>事務T已經開始
<COMMIT T>事務T已經提交
<ABORT T>事務T已經中止
<T,X,v>事務T更新了元素X,新的值為v
重做日志規則:
如果事務T修改了X,那么<T,X,v>和<COMMIT T>必須在X被寫入磁盤之前寫入磁盤
因此,輸出是后來完成的(相比commit)
重做的恢復步驟:

綜合
撤銷(Undo)和重做(Redo)的對比:
撤銷:1.輸出在前;2.如果日志里有<COMMIT T>,那么T一定把它要寫的數據全部寫入磁盤(所以此時不需要再撤銷)
重做:1.輸出在后;2.如果日志里沒有<COMMIT T>,那么T一定還沒有把任何數據寫入磁盤(所以此時磁盤里沒有臟數據)
輸出時的靈活性:
把數據改變的記錄修改:<T,X,u,v>,表示事務T修改了X,舊值為u,新值為v
撤銷/重做的規則:
如果事務T修改了X,則<T,X,u,v>必須在X被修改之前寫入磁盤。
修改后的規則對輸出相對於commit的時間沒有要求,可以在commit之前輸出,也可以在commit之后輸出
系統的恢復步驟:
1.掃描日志文件,確定每個事務是否完成(commit, abort都算完成),在故障發生前已經結束的事務記入重做序列,未完成的事務記入撤銷隊列
2.對撤銷隊列中的每個事務執行撤銷(按照從后到前的順序)
3.對重做隊列中的每個事務執行重做(按照從前到后的順序)
需求分析&概念結構設計&邏輯結構設計
數據庫設計(重要程度:普通)
需求分析: 重點是調查、收集與分析用戶在數據管理中的信息要求、處理要求、安全性與完整性要求
數據字典(Data Dictionary)是各類數據描述的集合,是進行詳細的數據收集和數據分析所獲得的主要結果
(1) 方法:直觀設計法(不適應信息管理發展的需要)、規范設計法。
規范設計法:基於E-R模型的數據庫設計方法、基於3NF的數據庫設計方法、基於視圖的數據庫設計方法等。
(2) 六個階段:系統需求分析階段、概念結構設計階段、邏輯結構設計階段、物理結構設計階段、數據庫實施階段、數據庫運行與維護階段。(說不定會考)
(3) 需求分析與表達需求方法
① SA方法(自頂向下、逐層分解的結構化分析方法):用數據流圖和數據字典描述系統。
數據字典:數據項、數據結構、數據流、數據存儲、處理過程。數據字典是各類數據描述的集合,是進行詳細的數據收集和數據分析所獲得的主要結果
② 面對對象的分析方法:
(4) 概念結構設計:概念模型的特點(P215簡要看一下)。
- 方法:①自頂向下;②自底向上(常用);③逐步擴張;④混合策略。
注:通常采用自頂向下地進行需求分析、自底向上地設計概念結構(先抽象數據設計局部視圖,再集成局部視圖得到全局概念結構),通常以中層數據流圖作為設計分E-R圖的依據。
- 設計分E-R圖:1.選擇局部應用;2.逐一設計分E-R圖
- 三種數據抽象:分類(ER圖實體型)、聚集(ER圖屬性)、概括。
- 合成E-R圖沖突:屬性沖突、命名沖突、結果沖突(P228);
- 實體和屬性的轉換准則:1.屬性不能具有需要描述的性質;2.屬性不能與其他實體具有聯系
- 概念結構設計:1.抽象數據並設計局部視圖;2.集成局部視圖得到全局概念結構;3.驗證整體概念結構
(5) 邏輯結構設計:E-R圖向關系模型的轉換(與5有重復)
a. 原則:
1.一個實體型轉換為一個關系模式;
2.一個m:n聯系轉換為一個關系模式(關系的屬性為與聯系相連的各實體的鍵以及聯系的屬性,關系的鍵為各實體鍵的組合);
3.一個1:1聯系可以轉換為一個獨立的關系模式(關(關系的屬性為各實體的鍵+聯系的屬性,每個實體的鍵都是關系的候選鍵),也可以與任意一端對應的關系模式合並(合並后關系的屬性包括加入的鍵和聯系的屬性,關系的鍵不變); 注:目的是盡量減少連接操作
4.一個1:n聯系可以轉換為一個獨立的關系模式((關系的屬性為各實體的鍵+聯系的屬性,關系的鍵為n端實體的鍵),也可以與n端對應的關系模式合並(合並后關系的屬性為在n端加入1端關系的鍵和聯系本身的屬性);
5.三個或三個以上實體間的一個多元聯系轉換為一個關系模式(關系的屬性為各實體的鍵+聯系的屬性,關系的鍵為各實體鍵的組合);
6.同一實體集的實體間的聯系,即自聯系,可以按照1:1,1:n,m:n分別處理
7.具有相同鍵的關系可以合並,將其中一個關系模式的全部屬性加入到另一個關系模式中,去掉其中的同義屬性(不一定同名),適當調整次序
b. 數據模型的優化:
1.確定數據依賴;
2.對於各個關系模式之間的數據依賴進行極小化處理,消除冗余的聯系;
3.按照數據依賴的理論對關系模式逐一分析,考查是否存在部分函數依賴、傳遞函數依賴、多值依賴等,確定各關系模式分別屬於第幾范式;
4.按照需求分析階段得到的各種應用對數據處理的要求,分析對於這樣的應用環境這些模式是否合適,確定是否要對它們進行合並或分解;注意並不是規范化程度越高就越優,在經常涉及連接時規范度高的關系的代價會很高。
5. 按照需求分析階段得到的各種應用對數據處理的要求,對關系模式進行必要的分解或合並,以提高數據操作的效率和存儲空間的利用率。
(1)水平分解:把(基本)關系的元組分為若干子集合,定義每個子集合為一 個子關系,以提高系統的效率。
適用范圍:80/20原則,經常被使用的數據約20%;或並發事務經常存取不相交的數據;
(2)垂直分解:把關系模式R的屬性分解為若干子集合,形成若干子關系模式
先進數據庫技術
關系模型缺點:
有限的數據類型;不能清晰表達復雜對象和對象之間的關系;缺少對象身份標識。
O-R映射(ORMapping):
用戶開發和維護的中間件層,該層負責將對象數據映射到關系數據庫的表中。系統中其他模塊可以通過OR映射層以操作對象的方法操作關系表中的數據。
(沒有改變數據庫的本質)
極大提高了應用系統開發的生產率。
用關系數據庫存取對象,阻抗失配(Impedance mismatch)
對象映射到表的困難:對象含有復雜結構;存在大的非結構化的對象;存在類繼承
會導致:表存取的效率很差,或在表中檢索對象很困難
面向對象模型OODB:用面向對象數據模型代替關系數據模型。
對象關系模型ORDB:將關系數據模型擴展為對象關系數據模型。
對象關系模型
優勢:
1.復雜對象構造能力使得對客觀世界的模擬能力強,方式自然
2.封裝性向開發人員和最終用戶屏蔽復雜性和實現細節
3.繼承性使得數據庫設計和應用編程成為可重用的
特點:
a.通過引入面向對象及處理復雜數據類型的構造來擴展關系數據模型.
b.允許元組屬性具有復雜類型, 包括非原子值(如嵌套關系).
c.保持關系基礎, 尤其是對數據的描述性存取, 同時擴展建模能力.
d.與現有關系語言向上兼容.
違反第一范式
對象在其REF類型的屬性中存儲所關聯的對象的OID值,實現對其它對象的引用
ORDB 對象-關系數據庫是發展趨勢
集合模型
關系模型:
把要存儲的信息划分成元組(行)
元組是受限的數據結構
獲得一組值
不能把一個元組嵌套進另一個元組,也不能把一個表中的元組放進另一張表
允許把數據操作看成具有輸入元組和返回元組
集合模型:
意識到用戶想要操作比元組更復雜的數據單元
復雜記錄允許List,Map,以及其他嵌套在內部的數據結構
鍵值對、文檔、列族數據庫使用這種復雜的結構
一個集合是我們想要作為數據操作單元並管理一致性的相關對象集合
采用原子操作更新集合
用集合合數據存儲通信
這個定義與鍵值對,文檔和列族數據庫工作。
使用集合,我們可以更容易地在集群上工作,因為它們是復制和共享的單元。
由於解決了關系數據庫的阻抗失配問題,聚合程序也更易於應用程序員工作。
不可分配存儲
集合模型關系映射可以很好地捕獲數據元素和它們之間的關系。
因為它使用外鍵,所以它不需要任何集合實體的概念。
無法從代表集合的關系中分辨出來
因此,我們不能利用這些知識來存儲和分發數據。
鍵值數據庫&文檔數據庫
都面向集合
都包含大量含鍵的集合
區別:
鍵值存儲的集合不可見
文檔存儲的集合可以看到結構
鍵值數據庫的優勢是可以存儲任何類型的對象
文檔存儲對可以存儲的內容有限制,對數據有結構定義,可以用一種語言查詢文檔
鍵值存儲只能通過鍵訪問
文檔存儲可以提交基於字段的索引,可以檢索部分集合,數據庫可以創建基於集合字段的索引
文檔存儲可以當鍵值來用
Riak(key-value)允許向集合添加用於索引的元數據
Redis允許把集合拆分成lists,sets,maps
使用鍵值存儲期待集合使用鍵
使用文檔存儲期待對文檔內部結構提交某種形式的查詢
止於 先進數據庫技術03 P57
一致性(C):在分布式系統中的所有數據備份,在同一時刻是否同樣的值。(等同於所有節點訪問同一份最新的數據副本)
可用性(A):在集群中一部分節點故障后,集群整體是否還能響應客戶端的讀寫請求。(對數據更新具備高可用性)
分區容忍性(P):以實際效果而言,分區相當於對通信的時限要求。系統如果不能在時限內達成數據一致性,就意味着發生了分區的情況,必須就當前操作在C和A之間做出選擇。
