《數據庫系統概論》筆記

1 緒論

數據庫是長期存儲在計算機內有組織、大量、共享的數據集合。它可以供各種用戶共享,具有最小冗餘度和較高的數據獨立性。數據庫管理系統在數據庫建立、運用和維護時對數據庫進行統一控制,以保證數據的完整性和安全性,並在多用戶同時使用數據庫時進行併發控制,在發生故障後對數據庫進行恢復。

數據與數據的結構

視圖(view),或數據(data)是某種表現形式下表現出來的數據庫中的數據。

模式(schema)是對數據庫中數據所進行的一種結構性的描述,是所觀察到數據的結構信息。

三級模式

外模式,或用戶模式,是某一用戶能夠看到與處理的數據的結構描述,是局部的。

模式,或概念模式,是從全局角度理解/管理的數據的結構描述,含相應的關聯約束。

內模式,或物理模式,是存儲在介質上的數據的結構描述。

兩層映像

E-C Mapping:將外模式映射爲概念模式,從而支持數據概念視圖向外部視圖的轉換,便於用戶觀察和使用。保證了邏輯獨立性。

C-I Mapping:將概念模式映射爲內模式,從而支持數據概念視圖向內部視圖的轉換,便於機器存儲和處理。保證了物理獨立性。

模式與模式的結構

數據模型,是規定模式統一描述方式的模型,是對模式本身結構的抽象。

三大經典數據模型:關係模型(表)、層次模型(樹)、網狀模型(圖)。

關係模型

關係模型是處理關係(Table)的,由三部分組成:基本結構、關係運算和完整性約束。

2 關係數據庫

2.1 關係數據庫結構及形式化定義

域是一組具有相同數據類型的值的集合

笛卡爾積

$D_1 \times D_2 \times … \times D_n = {(d_1, d_2, …, d_n)|d_i \in D_i, i = 1, 2, …, n} $

每個元素 (d1,d2,...,dn)(d_1, d_2, ..., d_n) 稱爲元組,元素中每一個值 did_i 稱爲分量

一個域允許的不同取值個數稱爲這個域的基數,笛卡爾積得到的集合的基數爲 M=i=1nmiM=\prod_{i=1}^n m_i

關係

D1×D2×...×DnD_1 \times D_2 \times ... \times D_n 的子集(一般是具有某一方面意義的真子集)叫做在域 D1,D2,...,DnD_1, D_2, ..., D_n 上的關係,表示爲 R(D1,D2,...,Dn)R(D_1, D_2, ..., D_n),R 是關係的名字,n 是關係的目或度數。

關係的中某一屬性組的值能唯一地標識一個元組,而其子集不能,則稱該屬性組爲候選碼。若一個關係中有多個候選碼,則選定其中一個爲主碼。候選碼中的屬性稱爲主屬性,其他的則爲非主屬性。若所有屬性都是候選碼,則爲全碼

關係的三種類型

  1. 基本表/基本關係(實際存儲數據的邏輯表示)
  2. 查詢表(查詢結果對應的表)
  3. 視圖表(虛表,不對應實際存儲的數據)

基本關係的性質

  1. 列是同質的,即同屬一個域
  2. 不同的列可出自不同的域
  3. 列是無序的
  4. 候選碼的值不能相同
  5. 行是無序的
  6. 每一個分量必須是一個不可分的數據項(最基本的性質)
關係模式

R(U,D,DOM,F)R(U, D, DOM, F),R 爲關係名,U 爲屬性名集合,D 爲 U 中屬性的域,DOM 爲屬性到域的映射集合,F 爲屬性間的數據依賴關係集合。

關係是關係模式在某一時刻的狀態或內容。關係模式是靜態的,而關係是動態的。

2.3 關係的完整性

實體完整性

關係數據庫中每個元組應該是可區分的,是唯一的,這樣的約束條件用實體完整性來保證。

實體完整性的規則即基本關係的主屬性不可取空值

參照完整性

屬性 F 不是基本關係 R 的碼,屬性 K 是基本關係 S 的主碼,若 F 與 K 相對應,則 F 是 R 的外碼,且 R 稱爲參照關係,S 稱爲被參照關係。外碼不一定要與相對應的主碼同名,但實踐中往往同名。

參照完整性規則就是定義外碼與主碼之間的引用規則:若屬性 F 是基本關係 R 的外碼,那麼對於 R 中的每個元組,F 必須取空值等於被參照關係中某個元素的主碼值

用戶定義的完整性

用戶定義的完整性就是針對某一具體關係數據庫的約束條件,它反應某一具體應用所涉及的數據必須滿足的語義要求。

2.4 關係代數

基本關係操作

選擇、投影、並、差、笛卡爾積

傳統的集合運算

並(\cap)、差(-)、交(\cup)、笛卡爾積(×\times

選擇

選擇,即從關係中選擇出滿足給定條件的諸元組,是從行的角度上進行的運算。

σF(R)={ttRF(t)=true}σ_F(R)=\{t|t \in R \land F(t)=true\} ,F 表示選擇條件 ,基本形式爲 XθYX \theta Y

投影

投影,即從關係中選擇出若干屬性列組成新的關係,是從列的角度上進行的運算。

ΠA(R)={t[A]tR}Π_A(R)= \{t[A]|t \in R\},A 爲 R 中的屬性列,需要去除重複的行。

img

img

連接

連接,即從兩個關係的笛卡爾積中選取屬性間滿足一定條件的元組。

RAθBS={trtstrRtsStr[A] θ ts[B]}R \bowtie_{A \theta B} S=\{t_rt_s|t_r \in R \land t_s \in S \land t_r[A] \ \theta \ t_s[B]\},其中 A 和 B 分別爲 R 和 S 上列數相等且可比的屬性組,θ 是比較運算符。

img

θ 爲 = 的連接運算稱爲等值連接。自然連接是一種特殊的等值連接,它要求兩個關係中進行比較的分量必須是同名的屬性組,並且在結果中把重複的屬性列去掉。即若 R 和 S 中具有相同的屬性組 B,U 爲 R 和 S 的全體屬性集合,則自然連接可記作 RS={trts[UB]trRtsStr[B]=ts[B]}R \bowtie S = \{t_rt_s[U-B]|t_r \in R \land t_s \in S \land t_r[B] = t_s[B]\}

img

做自然連接時,公共屬性在一個關係中的值,在另一個關係中不存在,就會導致這些元組被捨棄,被稱爲懸浮元組。如果把懸浮元組頁保存在結果中,而在其他屬性上填空值,那麼這種連接就叫做外連接。只保留左邊的懸浮元組叫左外連接,只保留右邊的懸浮元組叫右外連接。

給定一個關係 R(X, Z),當 t[X] = x 時,x 在 R 中的象集定義爲 Zx={t[Z]tR,t[X]=x}Z_x = \{t[Z]|t \in R,t[X]=x\}

設關係 R 除以關係 S 的結果爲關係 T,則 T 包含所有在 R 但不在 S 中的屬性及其值,且 T 的元組與 S 的元組的所有組合都在 R 中。

給定 R(X, Y) 和 S(Y, Z),其中 X、Y、Z 爲屬性組。R 中的 Y 與 S 中的 Y 可以不同名,但必須來自相同的域。R 除以 S 得到關係 P(X),其中元組在 X 上分量值 x 的象集 YxY_x 包含 S 在 Y 上投影的集合,即

R÷S={tr[X]  trRΠY(S)Yx}R \div S = \{t_r[X] \ | \ t_r \in R \land \Pi_Y(S) \in Y_x\}

這裏寫圖片描述

求解步驟過程

  1. 找出關係 R 和關係 S 中相同的屬性,即 Y 屬性。在關係 S 中對 Y 做投影,結果如下
    這裏寫圖片描述

  2. 被除關係 R 中與 S 中不相同的屬性列是 X ,關係 R 在屬性 X 上做取消重複值的投影爲 {X1,X2};

  3. 求關係 R 中 X 屬性對應的像集 Y
    根據關係R的記錄,可以得到與 X1 值有關的記錄,如圖 3 所示;與 X2 有關的記錄,如圖 4 所示
    這裏寫圖片描述

  4. 判斷包含關係
    R÷S 其實就是判斷關係 R 中 X 各個值的像集 Y 是否包含關係 S 中屬性 Y 的所有值。對比即可發現:
    X1 的像集只有 Y1,不能包含關係 S 中屬性 Y 的所有值,所以排除掉 X1;
    而 X2 的像集包含了關係 S 中屬性 Y 的所有值,所以 R÷S 的最終結果就是 X2
    這裏寫圖片描述

利用除運算,可以計算至少包含了某個屬性集合的元組對應的主碼(比如選課表中,查詢至少選修課程 1 與課程 3 的學生姓名)。

(這上面的圖和除法計算過程是參考某篇博客的,找不到原文了。。侵刪)

3 關係數據庫標準語言 SQL

學生表:Student(Sno, Sname, Ssex, Sage, Sdept)

課程表:Course(Cno, Cname, Cpno, Ccredit)

選課表:SC(Sno, Cno, Grade)

3.3 數據定義

一個關係數據庫管理系統的實例中可以建立多個數據庫,一個數據庫中可以建立多個模式,一個模式下通常包括多個表、視圖和索引等數據庫對象。

模式的定義與刪除
  • 定義模式

在這裏插入圖片描述

要創建模式,調用該命令的用戶必須擁有數據庫管理員權限,或者獲得了數據庫管理員授予的 CREATE SCHEMA 的權限。創建模式的同時,還可以在這個模式定義中進一步創建基本表、視圖,定義授權。

如果沒有指定 <模式名>,那麼模式名默認爲 <用戶名>。定義模式實際上定義了一個命名空間。

  • 刪除模式

在這裏插入圖片描述

CASCADE(級聯)表示在刪除模式的同時把該模式中所有的數據庫對象全部刪除;RESTRICT(限制)表示如果該模式中已經定義了下屬的數據庫對象(表、視圖等),則拒絕該刪除語句的執行。

基本表的定義、刪除與修改
  • 定義基本表

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

涉及多個屬性列的完整性約束條件必須定義在表級。

關係模型中的域,在 SQL 中對應的是數據類型。常用的數據類型如下

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

  • 修改基本表

在這裏插入圖片描述

  • 刪除基本表

在這裏插入圖片描述

RESTRICT 表明刪除表時有限制,刪除的表不能被其他表的約束所引用(如 CHECK, FORREIGN KEY),不能有視圖,不能有觸發器,不能有存儲過程或函數等。如果有,則此表不能被刪除。

CASCADE 表明刪除表時沒有限制,依賴於刪除的表的對象(如視圖)將被一同刪除。

默認情況是 RESTRICT。

索引的建立與刪除
  • 建立索引

在這裏插入圖片描述

UNIQUE 表明此索引的每一個索引值只對應唯一的數據記錄;CLUSTER 表明要建立的索引是聚簇索引。

次序可選 ASC(升序,默認)或 DESC(降序)。

  • 修改索引

在這裏插入圖片描述

  • 刪除索引

3.4 數據查詢

在這裏插入圖片描述

SELECT 語句根據 WHERE 子句的條件表達式從 FROM 子句指定的基本表、視圖或派生表中找出滿足條件的元組,再按 SELECT 子句中的目標列表達式選出元組中的屬性值形成結果表。如果有 GROUP BY 子句,則將結果按 <列名 1> 的值進行分組,該屬性列值相等的元組爲一個組,通常會在每組中作用聚集函數。如果 GROUP BY 子句帶 HAVING 短語,則只有滿足指定條件的組才予以輸出。如果有 ORDER BY 子句,則結果表還要按 <列名 2> 的值的升序或降序排序。

單表查詢
  • <目標列表達式> 可以是表中的屬性列(全選爲 *)、算術表達式、字符串常量、函數等,相當於投影。

  • DISTINCT 表明去除重複行,ALL 表明保留所有結果行。

  • <條件表達式> 篩選出滿足條件的元組。

在這裏插入圖片描述

BETWEEN … AND … 表明上下界(均包含)。

IN 後接 (elem1, elem2, elem3, … , elemn),相當於 <列名> = elem1 OR <列名> = elem2 OR …。

字符模糊匹配:[NOT] LIKE ‘<匹配串>’ [ESCAPE ‘<轉義字符>‘]。匹配串中還可以含有通配符 %(代表任意長度的字符串)和 _(代表任意單個字符)。數據庫字符集爲 ASCII 時一個漢字需要兩個 _,爲 GBK 時只需要一個 _。

  • ORDER BY 後接 ASC 表示結果按照升序排列,DESC 降序。默認 ASC。空值的次序由系統決定。
  • 聚集函數可以作用在列上。

在這裏插入圖片描述

當聚集函數遇到空值時,除 COUNT(*) 外,都跳過空值而只處理非空值。

WHERE 子句中不能用聚集函數作爲條件表達式。聚集函數只能用於 SELECT 子句和 GROUP BY 中的 HAVING 子句。

  • GROUP BY 子句將查詢結果按某一列或多列的值分組,值相等的爲一組。分組是爲了細化聚集函數的作用對象,也就是說,分組後聚集函數將作用於每一個組,每一個組都會有一個函數值。

WHERE 子句作用於基本表或視圖,從中選擇滿足條件的元組;HAVING 短語作用於組,從中選擇滿足條件的組。

連接查詢
  • WHERE 子句中的條件表達式可以在不同的表的屬性列間作比較,隱式地執行了表的連接運算。
  • 可以進行自身連接。爲此,需要爲表取別名以區分。

在這裏插入圖片描述

  • 可以進行外連接:LEFT OUTER JOIN(左外連接)、RIGHT OUTER JOIN(右外連接)。使用外連接時,確定連接比較的屬性列,採用 ON <條件表達式> 或 USING(<列名>) 而非 WHERE。
嵌套查詢

子查詢的 SELECT 語句不能使用 ORDER BY 子句,ORDER BY 只能用在最終結果上。

子查詢的查詢條件依賴於父查詢(相當於父查詢的變量傳參給子查詢),就叫相關子查詢,否則叫不相關子查詢。

  • IN

在這裏插入圖片描述

  • 比較運算符(明確子查詢只有一個值時可以採用比較運算符)

在這裏插入圖片描述

  • ANY(SOME)或 ALL

在這裏插入圖片描述
20200605165613272

  • EXISTS

EXISTS 代表存在量詞 \exist 。帶有 EXISTS 爲此的子查詢不返回任何數據,只產生布爾值:子查詢結果非空時爲真,爲空時爲假。EXISTS 的子查詢,其目標表達式通常都用 *。

SQL 沒有全稱量詞 \forall ,當需要用到全稱量詞的邏輯時,原查詢需要進行一定的邏輯等價替換:

在這裏插入圖片描述

所有帶 IN、比較運算符、ANY/ALL 謂詞的子查詢都能被 EXISTS 替換,但並非所有 EXISTS 都能被上述謂詞替換。

在這裏插入圖片描述

集合查詢

SELECT 語句的查詢結果是元組的集合,所以多個 SELECT 語句的結果可進行集合操作:並 UNION、交 INTERSECT、差 EXCEPT。

派生表查詢

子查詢不僅可以出現在 WHERE 子句中,還可以出現在 FROM 子句中,這時子查詢生成的臨時派生表成爲主查詢的查詢對象。

若子查詢中沒有聚集函數,派生表可以不指定屬性列,子查詢 SELECT 子句後面的列名爲其默認屬性;但必須爲派生表指定一個別名。

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

3.5 數據更新

插入數據

在這裏插入圖片描述

INTO 子句中的列名順序可以與表不一樣,但一定要與常量數據一一對應;也可以不列全,未列出的屬性列爲默認值 NULL;若 INTO 子句中沒有指明任何屬性列名,則新插入的元組必須在每個屬性列上均有值。

字符串要用單引號括起來。

INSERT 語句還可以插入子查詢的結果

在這裏插入圖片描述

修改數據

在這裏插入圖片描述

刪除數據

在這裏插入圖片描述

注意 DELETE 與 DROP 的區別,DELETE 是刪除數據,DROP 是刪除表。

3.6 空值的處理

空值由 IS NULL 判斷,而不能用 == NULL。

在條件表達式中,只有選擇條件爲 TRUE 的元組才被選出作爲輸出結果,UNKNOWN 的值不選。

在這裏插入圖片描述

3.7 視圖

視圖是從一個或幾個基本表(或視圖)導出的表,是一個虛表,即數據庫中只存放視圖的定義,而不存放視圖的數據。

定義視圖

在這裏插入圖片描述

子查詢即任意的 SELECT 語句。WITH CHECK OPTION 表示對視圖進行 UPDATE、INSERT、DELETE 操作時要保證更新、插入或刪除的行滿足視圖定義中的謂詞條件(即子查詢中的條件表達式)。

執行 CREATE VIEW 只是把視圖的定義存入數據字典,並不執行其中的 SELECT 語句。只是在對視圖查詢時,才按視圖的定義從基本表中將數據查出。因此,定義視圖時可以根據應用的需要設置一些派生屬性列(比如算術表達式),這些派生屬性列在實際中並不存在,只有需要使用時纔會臨時計算,省空間。

查詢視圖

查詢存在的視圖時,系統從數據字典中取出視圖的定義,把定義中的子查詢和用戶的查詢結合起來,轉換成等價的對基本表的查詢,然後再執行修正了的查詢,稱爲視圖消解。

更新視圖

更新視圖時,也通過視圖消解。加上 WITH CHECK OPTION 子句的視圖,在更新時會檢查定義中的條件,並拒絕掉不滿足條件的更新操作。

並不是所有表都是可更新的,反正至少行列子集視圖是可更新的。

視圖的作用
  1. 簡化用戶的操作
  2. 使用戶能以多種角度看待同一數據
  3. 對重構數據庫提供了一定程度的邏輯獨立性
  4. 能夠對機密數據提供安全保護
  5. 更清晰地表達數據

4 數據庫安全性

4.2 數據庫安全性控制

存取控制

存取控制機制主要包括定義用戶權限和合法權限檢查兩部分。

自主存取控制方法中,用戶對於不同的數據庫對象有不同的存取權限,不同的用戶對同一對象也有不同的權限,而且用戶還可將其擁有的存取權限轉授給其他用戶,因此自主存取控制非常靈活。

強制存取控制方法中,每一個數據庫對象被標以一定的密級,每一個用戶也被授予某一個級別的許可證。對於任意一個對象,只有具有合法許可證的用戶纔可以存取。強制存取控制因此相對比較嚴格。

自主存取控制

用戶權限是由兩個要素組成的:數據庫對象和操作類型。定義一個用戶的存取權限就是要定義這個用戶可以在哪些數據庫對象上進行哪些類型的操作。

  • GRANT

SQL 使用 GRANT 向用戶授予數據的操作權限。

在這裏插入圖片描述

若指定了 WITH GRANT OPTION 子句,則意味着被授予權限的用戶可以再將該權限授予其他用戶。

在這裏插入圖片描述

  • REVOKE

REVOKE 向用戶收回已授予的權限。

在這裏插入圖片描述

指定 CASCADE 將用戶轉授的權限也一併收回。

  • 數據庫角色

數據庫角色是一組權限的集合。

創建角色:CREATE ROLE <角色名>

給角色授權:GRANT 語句

將一個角色授予其他的角色或用戶:

在這裏插入圖片描述

若指定 WITH ADMIN OPTION 子句,則意味着被授予角色的角色或用戶還可以再將該角色授予其他用戶或角色。

收回角色權限:REVOKE

強制存取控制方法

在強制存取控制中,數據庫管理系統所管理的全部實體被分爲主體和客體。主體即實際用戶或用戶進程,客體即各類數據。對於主體和客體的每個實例,都會被指派一個敏感度標記。敏感度標記有:絕密(Top Secret, TS)、機密(Secret, S)、可信(Confidential, C)、公開(Public, P)等,密級依序降低。

強制存取控制機制就是通過對比主題的敏感度標記和客體的敏感度標記,最終確定主體是否能夠存取客體。規則如下:

  1. 僅當主體的許可證級別大於或等於客體的密級時,該主體才能讀取相應的客體。
  2. 僅當主體的許可證級別小於或等於客體的密級時,該主體才能寫相應的客體。

規則 2 的原因是爲了防止高密級用戶將高密級客體寫入低密級客體中,導致數據泄露。

5 數據庫完整性

數據庫的完整性是指數據的正確性和相容性的。數據的正確性是指數據是符合現實世界語義、反應當前實際狀況的;數據的相容性是指數據庫同一對象在不同關係表中的數據是符合邏輯的。

數據庫的完整性是爲了防止數據庫中存在不符合語義的數據;數據庫的安全性爲了防止數據庫被惡意破壞和非法存取。

5.1 實體完整性

實體完整性在 CREATE TABLE 中用 PRIMARY KEY 定義。

定義實體完整性後,每當插入數據或對更新主碼時,將會進行實體完整性檢查,檢查主碼是否唯一、是否不爲空。

5.2 參照完整性

參照完整性在 CREATE TABLE 中用 FOREIGN KEY 定義哪些列爲外碼,用 REFERENCES 定義這些外碼參照哪些表的主碼。

在這裏插入圖片描述

在這裏插入圖片描述

5.3 用戶定義的完整性

用戶定義的完整性在 CREATE TABLE 時根據應用需求定義約束條件。

  • 列值非空(NOT NULL)
  • 列值唯一(UNIQUE)
  • 檢查列值是否滿足一個條件表達式(CHECK)

5.4 完整性約束命名子句

定義完整性約束

CONSTRAINT <完整性約束條件名> <完整性約束條件>

在這裏插入圖片描述

修改完整性約束

用 ALTER TABLE 語句修改

在這裏插入圖片描述

5.6 斷言

任何對定義的斷言所涉及關係的操作都會觸發關係數據庫管理系統對斷言的檢查,任何使斷言不爲真的操作都會被拒絕執行。

創建斷言

CREATE ASSERTION <斷言名> <CHECK子句>

刪除斷言

DROP ASSERTION <斷言名>

5.7 觸發器

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

6 關係數據理論

R(U,D,DOM,F)R(U, D, DOM, F),在討論模式設計時,可以簡化爲 R(U,F)R(U, F),F 爲屬性組 U 上的一組數據依賴。數據依賴是一個關係內部屬性與屬性之間的一種約束關係,通過屬性間值的相等與否來體現,類似於數學中的函數,自變量確定後函數值也就唯一確定了。

6.2 規範化

函數依賴

設 R(U) 是屬性集 U 上的關係模式,X、Y 是 U 的子集。若對於 R(U) 的任意一個可能的關係 r,r中不可能存在兩個元組在 X 上的屬性值相等,而在 Y 上的屬性值不等,則稱 X 函數確定 Y,或 Y 函數依賴於 X,記作 X → Y

很顯然,與數學中的函數非常相像。

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

1NF

關係數據庫中的關係是要滿足一定要求的,滿足不同程度要求的爲不同範式。

第一範式(1NF)是最基本的範式,它要求每一個分量必須是不可分的數據項。

一個低一級範式的關係模式通過模式分解可以轉換爲若干個高一級範式的關係模式的集合,這種過程就叫規範化。

在這裏插入圖片描述

2NF

R1NFR \in 1NF ,且每一個非主屬性完全函數依賴於任何一個候選碼,則 R2NFR \in 2NF

有關係模式:S-L-C(Sno, Sdept, Sloc, Cno, Grade)

在這裏插入圖片描述

不滿足 2NF,意味着將會存在兩種非主屬性:一種完全函數依賴於碼(就叫它 FNA 吧),一種部分函數依賴於碼(PNA)。當試圖插入 PNA 時,由於只需碼中的部分屬性就能確定,也就意味着碼中有部分屬性是不需要的或暫時未知的,那麼,插入這個 PNA 時就會因爲碼值一部分爲空,違反了實體完整性而被拒絕插入。除插入異常外,不滿足 2NF 還會導致刪除異常、修改複雜等問題。

要使得上述例子滿足 2NF,可以用投影分解,將 S-L-C 分解爲兩個關係模式:SC(Sno, Cno, Grade) 和 S-L(Sno, Sdept, Sloc),即將 FNA 和 PNA 分開,讓 FNA 與當前碼分爲一個關係,讓 PNA 與碼中能完全函數確定 PNA 的部分屬性作爲新的碼分爲一個關係。

在這裏插入圖片描述

3NF

在這裏插入圖片描述

分解的方法就是打斷傳遞依賴,將 X、Y 作爲一個關係,Y、Z 作爲一個關係。

BCNF

在這裏插入圖片描述

在這裏插入圖片描述

多值依賴

設 R(U) 是屬性集 U 上的一個關係模式。X,Y,Z 是 U 的子集,並且 Z = U - X - Y。關係模式 R(U) 中多值依賴 X →→ Y 成立,當且僅當對 R(U) 的任一關係 r,給定的一對(x,z)值,有一組 Y 的值,這組值僅僅決定於 x 值而與 z 值無關。

很好理解,就是一個關係模式 R(X, Y, Z),若 Y、Z 函數依賴於 X,那沒關係,因爲函數依賴 X 到 Y,X 到 Z 分別只有一個映射,對於一個特定的 x 值,只會有確定的一組(y,z)值。若 Y、Z 多值依賴於 X,問題很大,這意味着 X 到 Y,X 到 Z 分別有多個映射,即 X 與 Y,或 X 與 Z,是一對多的關係,Y 與 Z 會產生多種組合。

假設 X 確定 Y 的有 n 個不同的值,X 確定 Z 的有 m 個不同的值,若是函數確定,那麼 n、m 都爲 1,只會產生一種組合,只需要一條記錄,相對於分別存儲 Y、Z 需要兩條記錄,是更優的;若是多值確定,那麼就有了 n * m 個組合,而實際上 Y、Z 分別存儲只需要 n + m 條記錄,顯然是分別存儲是更優的,集中存儲會出現大量的浪費。

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

4NF

在這裏插入圖片描述

規範化小結

在這裏插入圖片描述

任意一個二元模式至少可以達到 BCNF 範式;任意一個全碼模式至少可以達到 BCNF 範式。

6.3 數據依賴的公理系統

Armstrong 公理系統

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

閉包,或判定 X → Y 是否能由 F 導出

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

函數依賴集等價

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

簡單來說,就是先把右邊含有多個屬性的拆開,然後消除冗餘的依賴(即若一個屬性分別依賴於多個其他屬性,保留其中一個),最後消除部分依賴(依賴左部均爲最小屬性集) 。

7 數據庫設計

概述

數據庫設計分爲 6 個階段:

  1. 需求分析
  2. 概念結構設計
  3. 邏輯結構設計
  4. 物理結構設計
  5. 數據庫實施
  6. 數據庫運行和維護

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

需求分析

需求分析就是分析用戶的需求,包括

  • 信息要求。需要的信息的內容和性質,以得知需要存儲哪些數據。
  • 處理要求。需要的數據處理功能,和對性能的要求。
  • 安全性與完整性要求。

數據字典是需求分析的成果。它是關於數據庫中數據的描述,即元數據,而不是數據本身。數據字典包括數據項、數據結構、數據流、數據存儲、處理過程。

概念結構設計

概念結構設計就是將需求分析得到的用戶需求抽象爲信息結構(即概念模型)。常用的概念模型是 E-R 圖,它包括實體、屬性、實體之間的聯繫。

實體之間的聯繫有一對一聯繫(1:1)、一對多聯繫(1:n)、多對多聯繫(m:n)

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

E-R 圖提供了表示實體型、屬性和聯繫的方法:實體型用矩形、屬性用橢圓形、聯繫用菱形。

實體型與聯繫均可擁有屬性。屬性不能再有需要描述的性質,也不能與其他實體有聯繫。

在設計大型系統時,往往需要分別設計子系統的 E-R 圖,然後將它們集成其他,得到全局 E-R 圖。在這個過程中,首先需要合併 E-R 圖,即解決各分 E-R 圖之間的衝突,生成初步 E-R 圖。各分 E-R 圖之間的衝突主要有三類:

  1. 屬性衝突。同一屬性在不同 E-R 圖上的域不同、或取值單位不同。
  2. 命名衝突。同名異義、異名同義。
  3. 結構衝突。同一對象的抽象不一致、同一實體的屬性不一致、同一聯繫的類型不一致。

然後,需要消除不必要的冗餘(比如冗餘的數據或聯繫),設計基本 E-R 圖。可以用分析或規範化理論來解決。

邏輯結構設計

邏輯結構設計就是把概念結構設計階段設計好的概念模型轉換爲與選用數據庫管理系統產品所支持的數據模型相符合的邏輯結構。對於 E-R 圖而言,就是將實體型實體型間的聯繫轉換爲關係模式,並確定這些關係模式的屬性和碼

一個實體型轉換爲一個關係模式,關係的屬性就是實體的屬性,關係的碼就是實體的碼。對於實體型間的聯繫,有不同的情況:

  • 一個 1:1 聯繫可以轉換爲一個獨立的關係模式,也可以與任意一端對應的關係模式合併。如果轉換爲一個獨立的關係模式,則與該聯繫相連的各實體的碼以及聯繫本身的屬性均轉換爲關係的屬性,每個實體的碼均是該關係的候選碼。如果與某一端實體對應的關係模式合併,則需要在該關係模式的屬性中加入另一個關係模式的碼和聯繫本身的屬性。
  • 一個 1:n 聯繫可以轉換爲一個獨立的關係模式,也可以與 n 端對應的關係模式合併。如果轉換爲一個獨立的關係模式,則與該模式相連的各實體的碼以及聯繫本身的屬性均轉換爲關係的屬性,而關係的碼爲 n 端實體的碼。
  • 一個 m:n 聯繫轉換爲一個關係模式。與該聯繫相連的各實體的碼以及聯繫本身的屬性均轉換爲關係的屬性,各實體的碼組成關係的碼或關係碼的一部分。
  • 三個或三個以上實體間的一個多元聯繫可以轉換爲一個關係模式。
  • 具有相同碼的關係模式可以合併。
物理結構設計

物理結構設計就是爲給定的邏輯模型選取一個最適合應用要求的物理結構。通常分爲兩步:首先確定數據庫的物理結構,在關係數據庫中主要指存取方法和存儲結構;然後對物理結構進行評價,評價的重點是時間和空間效率。如果評價結果滿足設計要求,則可進入到物理實施階段,否則,就需要重新設計或修改物理結構,甚至是邏輯結構。

常用的存取方法有索引方法聚簇方法

索引方法使用最普遍的是 B+ 樹索引和 hash 索引。

聚簇方法是把屬性(組)中具有相同值的元組集中存放在連續的物理塊中,該屬性(組)就成爲聚簇碼。一個數據庫可以建立多個聚簇,一個關係只能加入一個聚簇。聚簇通常建立於經常需要進行連接、比較的關係間的連接屬性、比較屬性上。

8 數據庫編程

8.1 嵌入式 SQL

嵌入式 SQL 能夠提高 SQL 的邏輯控制能力,以補齊非過程化的短板。對嵌入式 SQL,數據庫管理系統一般採用預編譯方法處理,即由數據庫管理系統的預處理程序對用宿主語言編寫的源程序進行掃描,識別出嵌入式 SQL 語句,把它們轉換成主語言調用語句,以使主語言編譯程序能識別它們,然後由主語言的編譯程序將純的主語言程序編譯成目標碼。

當主語言爲 C 時,語法格式爲 EXEC SQL <SQL語句>;,Java 時爲 #SQL {<SQL語句>};

嵌入式 SQL 語句與主語言之間的通信
  • SQL 通信區

SQL 語句執行後,系統會反饋當前工作狀態和運行環境的若干信息(如 SQLCODE,指示語句是否執行成功),存儲於 SQL 通信區中。用 EXEC SQL INCLUDE SQLCA 定義。

  • 主變量

嵌入式 SQL 語句中可以使用主語言的程序變量(簡稱爲主變量)來輸入或輸出數據,並可選擇附帶一個指示變量來指示相應主變量的值或條件。主變量和指示變量須在 BEGIN DECLARE SECTIONEND DECLARE SECTION 之間進行說明,並加前綴 : 與數據庫對象名以區別。

  • 遊標

SQL 是面向集合的,而主語言是面向記錄的,因此需要一個數據緩衝區,即遊標,來存放 SQL 語句的執行結果。用於可以通過遊標逐一獲取記錄並賦給主變量,交給主語言進一步處理。

  • 建立和關閉數據庫連接

嵌入式 SQL 語句要訪問數據庫必須先連接數據庫,所有數據據操作執行完畢後,還要關閉數據庫連接。

不用遊標的 SQL 語句
  • 查詢結果爲單記錄的 SELECT 語句

此時,可以用 INTO 子句指定存放查詢結果的主變量,不需使用遊標。

查詢結果的某些列可能爲空值,主變量會被賦值爲 NULL,若指定了指示變量,則爲空的相應主變量的指示變量會被賦負值,而不再向主變量賦值。

在這裏插入圖片描述

  • 非 CURRENT 形式的增刪改語句
使用遊標的 SQL 語句
  • 查詢結果爲多條記錄的 SELECT 語句

使用遊標的步驟爲:

  1. 說明遊標。EXEC SQL DECLARE <遊標名> CURSOR FOR <SELECT語句>;定義遊標僅僅是一條說明性語句,並不執行。

  2. 打開遊標。EXEC SQL OPEN <遊標名>; ,打開遊標實際上執行了相應的 SELECT 語句,把查詢結果取到緩衝區中。這時遊標處於活動狀態,指針指向查詢結果集中的第一條記錄。

  3. 推進遊標指針並取當前記錄。EXEC SQL FETCH <遊標名> INTO <主變量>[<指示變量>]...; ,其中主變量必須與 SELECT 語句中的目標列表達式具有一一對應關係。

  4. 關閉遊標。EXEC SQL CLOSE <遊標名>;,關閉遊標以釋放資源,並取消了與原來的查詢結果的聯繫。被關閉的遊標可以再度打開,並與新的查詢語句相聯繫。

  • CURRENT 形式的 UPDATE 和 DELETE 語句

8.4 ODBC

在這裏插入圖片描述

9 關係查詢處理和查詢優化

9.1 關係數據庫系統的查詢處理

查詢處理過程

查詢處理是將查詢語句轉換爲高效的查詢執行計劃的過程,分爲 4 個階段:查詢分析、查詢檢查、查詢優化和查詢執行。查詢分析主要做 SQL 語句的語法分析;查詢檢查主要做 SQL 語句的語義分析、安全性完整性檢查等,並將 SQL 語句轉換爲等價的關係代數表達式,通常以查詢樹的形式;查詢優化主要做代數優化和物理優化。
在這裏插入圖片描述

查詢算法實現
  • 選擇操作
    在這裏插入圖片描述
    在這裏插入圖片描述
  • 連接操作

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

9.3 代數優化

關係代數表達式等價變換規則在這裏插入圖片描述在這裏插入圖片描述
查詢樹的啓發式優化
  1. 選擇運算應儘可能先做。
  2. 把投影運算和選擇運算同時進行。
  3. 把投影同其前或後的雙目運算結合起來。
  4. 把某些選擇同在它前面要執行的笛卡爾積結合起來成爲一個連接運算。
  5. 找出公共子表達式。
    在這裏插入圖片描述

9.4 物理優化

物理優化就是要選擇高效合理的操作算法或存取路徑,求得優化的查詢計劃,包括:基於規則的啓發式優化、基於代價估算的優化、兩者結合的優化方法。

10 數據庫恢復技術

10.1 事務的基本概念

事務是用戶定義的一個數據庫操作序列,這些操作要麼全做,要麼全不做,是一個不可分割的工作單位。一個程序通常包含多個事務。

事務通常以 BEGIN TRANSACTION 開始,以 COMMITROLLBACK 結束。COMMIT 表示提交,將事務中所有對數據庫的更新寫回到磁盤上的物理數據庫中去,事務正常結束;ROLLBACK 表示回滾,即在事務運行的過程中發生了故障,事務不能繼續執行,系統將事務中對數據庫所有已完成的操作全部撤銷,回滾到事務開始時的狀態。

事務具有 4 個特性(ACID):原子性(atomicity)、一致性(consistency)、隔離性(isolation)和持續性(durability)。

  • 原子性:事務是數據庫的邏輯工作單位,事務中的操作要麼全做,要麼全不做。
  • 一致性:事務執行的結果必須是使數據庫從一個一致性狀態變到另一個一致性狀態。一致性狀態是指數據庫只包含成功事務提交的結果的狀態。
  • 隔離性:併發執行的各事務之間不能相互干擾。
  • 持續性:一個事務一旦提交,它對數據庫中的數據的改變就應該是永久性的。

保證事務 ACID 特性,就需要在事務意外終止時提供恢復機制,在多個事務交叉執行時提供併發控制機制。

10.3 故障的種類

  1. 事務內部的故障:有些事務內部的故障可以被程序發現(如數值不滿足要求),但更多的故障是非預期的,不能由運用程序處理。事務故障意味着事務沒有達到預期終點,因此數據庫可能處於不正確狀態。此時,需要執行事務撤銷以撤銷該事務所作出的修改。

  2. 系統故障:系統停止運轉,所有運行事務都異常終止。一些尚未完成的事務的結果可能已送入物理數據庫,需要在重啓後撤銷異常終止的事務;一些已經完成的事務可能尚未寫回到磁盤上的物理數據庫中,需要在重啓後將重做已提交的事務。

  3. 介質故障:硬件損壞,破壞性大。

  4. 計算機病毒

10.4 恢復的實現技術

恢復機制的關鍵就是:如何建立冗餘數據,以及如何利用這些冗餘數據實施數據庫恢復。

建立冗餘數據最常用的技術是數據轉儲登記日誌文件

數據轉儲

轉儲即數據庫管理員定期將整個數據庫複製到其他存儲介質上保存起來的過程。但利用數據轉儲恢復數據庫時,只能將數據庫恢復到轉儲時的狀態,還必須重新運行之後的所有更新事務。

轉儲分爲靜態轉儲動態轉儲。靜態轉儲很簡單,但必須中止數據庫,降低數據庫的可用性。動態轉儲不必等待事務結束,但不能保證數據正確有效,必須將動態轉儲期間事務的更新活動記錄成日誌文件纔行,然後用恢復系統故障的方法(見後)來達到一致性狀態。

轉儲還可以分爲海量轉儲增量轉儲。海量轉儲每次轉儲全部數據,增量轉儲每次只轉儲上一次轉儲後更新過的數據。
在這裏插入圖片描述

登記日誌文件

日誌文件是用來記錄事務對數據庫的更新操作的文件。登記日誌時,必須嚴格按併發事務執行的時間次序記錄;必須先寫日誌文件,後寫數據庫。

在這裏插入圖片描述

10.5 恢復策略

事務故障的恢復

反掃一遍。

在這裏插入圖片描述

系統故障的恢復

系統故障需要撤銷故障發生時未完成的事務,重做已完成的事務。

正掃找出待操作事務 -> 反掃撤銷未完成事務 -> 正掃重做已完成事務。

在這裏插入圖片描述

介質故障的恢復

重裝數據庫,然後重做已完成的事務。

10.6 具有檢查點的恢復技術

檢查點記錄的內容包括:建立檢查點時刻所有正在執行的事務清單,以及這些事務最近一個日誌記錄的地址。週期性地建立檢查點,保存數據庫狀態,可以改善恢復效率。

系統出現故障時,恢復子系統將根據事務的不同狀態採取不同的恢復策略:

在這裏插入圖片描述

簡單來說,就是檢查點之前提交的事務可以忽略,檢查點之後系統故障之前提交的事務需要重做,系統故障時還未完成的事務需要撤銷。

恢復的步驟,簡單來說就是先找到檢查點,正掃一遍日誌,正在執行的或開始執行的事務加入 UNDO-LIST,提交的事務從 UNDO-LIST 移到 REDO-LIST,掃描結束後分別對隊列做 UNDO 和 REDO 操作。

在這裏插入圖片描述

11 併發控制

11.1 併發控制概述

併發操作破壞了隔離性,帶來的不一致性有:

  1. 丟失修改:兩個事務讀入同一數據並修改,常見的競態。
  2. 不可重複讀:一個事務 T1 讀取一個數據後,另一個事務 T2 修改了同一數據,當 T1 再次讀取該數據,發現此次讀取與前次讀取不一致。
  3. 讀髒數據:一個事務 T1 讀取並修改一個數據後,另一個事務 T2 讀取了同一數據,過後 T1 又由於某種原因撤銷了對該數據的修改,此時 T2 讀取到的數據就是髒數據。

在這裏插入圖片描述

11.2 封鎖

封鎖是實現併發控制的重要技術。所謂封鎖就是事務 T 在對某個數據對象操作之前,先向系統發出請求,對其加鎖。加鎖後事務 T 就對該數據對象有了一定的控制,在事務 T 釋放它的鎖之前,其他事務不能更新此數據對象。

基本的封鎖類型有兩種:

  1. 排他鎖,或寫鎖。若事務 T 對數據對象 A 加上 X 鎖,則只允許 T 讀取和修改 A,其他任何事務都不能再對 A 加任何類型的鎖,直到 T 釋放 A 上的鎖爲止。這就保證了其他事務再 T 釋放 A 上的鎖之前不能再讀取和修改 A
  2. 共享鎖,或讀鎖。若事務 T 對數據對象 A 加上 S 鎖,則事務 T 可以讀 A 但不能修改 A,其他事務只能再對 A 加 S 鎖,而不能加 X 鎖,直到 T 釋放 A 上的 S 鎖爲止。這就保證了其他事務可以讀 A,但在 T 釋放 A 上的 S 鎖之前不能對 A 做任何修改。
    在這裏插入圖片描述

11.3 封鎖協議

一級封鎖協議

一級封鎖協議指,事務 T 在修改數據 R 之前必須先對其加 X 鎖,直到事務結束才釋放。

一級封鎖協議可防止丟失修改,並保證事務 T 是可恢復的,但不能防止不可重複讀和讀髒數據。

二級封鎖協議

二級封鎖協議指,在一級封鎖協議的基礎上,增加事務 T 在讀取數據 R 之前必須先對其加 S 鎖,讀完後即可釋放 S 鎖。

二級封鎖協議可防止丟失修改和讀髒數據,但不能防止不可重複讀。

三級封鎖協議

三級封鎖協議指,在一級封鎖協議的基礎上,增加事務 T 在讀取數據 R 之前必須先對其加 S 鎖,直到事務結束才釋放。

三級封鎖協議可防止丟失修改、讀髒數據、不可重複讀三個問題。

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

11.4 活鎖和死鎖

活鎖

活鎖是指事務反覆嘗試訪問數據均失敗的情況。這裏採用 FCFS 就能解決。

死鎖

死鎖是兩個或多個事務相互等待各自持有的資源從而導致僵持的狀態。

預防死鎖就是要破壞產生死鎖的條件:

  1. 一次封鎖法:要求每個事務必須一次將所有要使用的數據全部加鎖,否則就不能繼續執行。但這會降低系統的併發度,並且難以預料所有需要使用到的數據。

  2. 順序封鎖法:預先對數據對象規定一個封鎖順序,所有事務都按這個順序實施封鎖。但維護封鎖順序非常困難。

診斷死鎖的方法有:

  1. 超時法:如果一個事務的等待時間超過了規定的時限,就認爲發生了死鎖。
  2. 等待圖法:生成事務等待圖,如果圖中存在迴路,則出現了死鎖。

解除死鎖的方法通常是選擇一個處理死鎖代價最小的事務,將其撤銷,釋放此事務持有的所有的鎖。

11.5 併發調度的可串行性

可串行化調度

多個事務的併發執行是正確的,當且僅當其結果與按某一次序串行地執行這些事務時的結果相同,稱這種調度策略爲可串行化調度。可串行性是併發事務正確調度的準則。

雖然同一調度的不同的可串行化調度順序不同,可能會導致不同的結果,但只要是可串行性的,就是正確的。

衝突可串行化調度

衝突操作是指不同事務對同一數據的讀寫操作寫寫操作
在這裏插入圖片描述

不同事務的衝突操作和同一事務的兩個操作是不能交換次序的。

給定一個調度,在保證衝突操作的次序不變的情況下,若該調度通過交換兩個事務不衝突操作的次序可得到一個串行的調度,則稱該調度爲衝突可串行化的調度。若一個調度是衝突可串行化的,則一定是可串行化的調度。因此,可用這種方法來判斷一個調度是否是可串行化的。但要注意,衝突可串行化只是可串行化的充分條件,而不是必要條件。

在這裏插入圖片描述

11.6 兩段鎖協議

爲了保證併發調度的正確性,併發控制機制必須提供一定的手段來保證調度是可串行化的,通常採用兩段鎖協議(2PL):

  1. 第一階段是獲得封鎖,也稱爲擴展階段,在這個階段,事務可以申請獲得任何數據項上的任何類型的鎖,但是不能釋放任何鎖;
  2. 第二階段是釋放封鎖,也成爲收縮階段,在這個階段,事務可以釋放任何數據項上的任何類型的鎖,但是不能再申請任何鎖。

若併發執行的所有事務均遵守兩段鎖協議,則對這些事務的任何併發調度策略都是可串行化的。

11.7 封鎖的粒度

多粒度封鎖

封鎖對象的大小稱爲封鎖粒度。封鎖對象可以是邏輯單元,如屬性、元組、關係;也可以是物理單元,如頁。封鎖的粒度越大,併發度就越小。

同時支持多種封鎖粒度是比較理想的,因此定義多粒度樹,根結點是整個數據庫,代表最大的粒度,葉子結點代表最小的粒度。

多粒度封鎖協議允許對多粒度樹中的各個結點獨立加鎖。對一個結點加鎖意味着對這個結點的所有子結點加同樣類型的鎖。於是,顯示封鎖是直接加到數據對象的鎖,隱式封鎖是其父結點被加了鎖,但它們的效果是一致的。因此,系統檢查封鎖衝突時,不僅要檢查結點的顯示封鎖,還要上溯父結點檢查隱式封鎖,還要檢查子結點的顯示封鎖。

意向鎖

爲了解決多粒度封鎖協議的低效率,引入了意向鎖,數據庫管理系統就無須逐個檢查下一級結點的顯示封鎖。如果對一個結點加意向鎖,則說明該結點的下層結點正在被加鎖;對任一結點加鎖時,必須先對它的上層結點加意向鎖。

三種常用的意向鎖:

  1. 意向共享鎖(IS 鎖):它的子結點將要加 S 鎖
  2. 意向排他鎖(IX 鎖):它的子結點將要加 X 鎖
  3. 共享意向排他鎖(SIX 鎖):將要對它先加 S 鎖,再加 IX 鎖。

在這裏插入圖片描述

申請封鎖時應該按自上而下的次序進行;釋放封鎖時應該按自下而上的次序進行。

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