数据库学习笔记
文章導航
- ppt下載
- 數據庫系統概述
- 數據
- 數據管理
- 數據庫
- 數據模型
- 數據庫系統結構
- DBMS
- 數據模型
- 基礎概念
- E(ntity)-R(elationship)概念模型(基礎)
- 基本概念
- E-R數據模型
- 層次數據模型
- 特征
- 儲存結構
- 點評
- 網狀數據模型
- 表示方法
- 點評
- 關系數據模型(主流)
- 基本概念
- 表示方法
- 數據操縱
- 點評
- 面向對象數據模型(發展)
- 關系數據庫
- 關系模型的基本概念
- 基本概念
- 關系的定義
- 基礎概念
- 關系的概念
- 關系的特殊性
- 規范化的關系
- 關系與關系模式
- 關系數據庫與關系數據庫模式
- 鍵
- 鍵定義和超鍵
- 其他鍵類型
- 關系的完整性約束
- 關系代數
- 關系代數概述
- 分類:
- 傳統的集合運算
- 并差交
- 笛卡爾積
- 專門的關系運算
- 選擇
- 投影
- 連接
- 除法
- 擴充的關系運算
- 屬性重命名
- 外連接
- 關系代數應用
- 用于增刪查改
- 案例解析
- 典型關系代數語言:ISBL
- 關系演算
- 元組關系演算
- 元組關系演算語言:ALPHA
- 域關系演算
- 域關系演算語言QBE
- 關系數據語言
- 關系運算的安全性與等價性
- SQL語言(核心)
- SQL概述
- SQL數據定義
- SCHEMA定義
- TABLE定義
- 建立索引
- SQL數據操縱——查詢
- 單表查詢
- 連接查詢
- 嵌套查詢
- IN類子查詢
- ANY/ALL子查詢
- EXIST類子查詢
- 集合查詢
- 派生表查詢
- SQL數據操縱——增刪改
- SQL視圖
- SQL數據控制
- 嵌入式SQL
- 查詢優化
- 安全性控制
- 完整性控制
- 故障恢復技術
- 并發控制
- 數據庫設計
- 理論部分
- 關系數據庫層次重論
- 關系模型的存儲異常
- 函數依賴
- 定義與類型
- 邏輯蘊涵與閉包
- 函數依賴公理——Armstrong公理
- 屬性閉包
- 最小依賴集
- 關系模式的規范化——模式分解
- 設計流程
- 數據分析與需求分析——SA方法
- 概念模型設計——E-R模型
- 數據抽象與局部視圖設計
- 視圖集成
- 驗證全局概念結構
- 數據模型——邏輯數據庫設計
- 轉換
- 優化
- 子模式設計
- 數據模型——物理數據庫設計
- 選擇存取路徑
- 設計關系,索引等數據庫文件的物理儲存結構
- 建立數據庫與測試維護
ppt下載
ppt 提取碼:cyyy
數據庫系統概述
數據
數據本質上是對現實世界的編碼,與現實一一對應,數據由各種成分組成,都是字段。
數據管理
數據庫
優點:
簡言之,數據庫高度抽象,建立程序與數據之間的通道。
通常來說,數據庫指DBMS。
發展:
數據模型
三要素:
三要求:
分類:
基本數據模型(前面的2)也分兩層:
數據庫系統結構
(視圖)外模式:與視圖對應,又名子模式,與程序,用戶綁定。
外模式-模式映像:用戶級。接口。
(概念)模式:綜合所有數據,是一種邏輯上的全局描述。
模式-內模式映像:管理員,設計師級。接口。
(物理)內模式:是模式的物理實現的描述。
操作系統:將硬件操作封裝,通過物理內模式描述來操作數據庫。
物理數據庫:文件。
DBMS
這門課主要學習DBMS,后面會逐章學習。
數據模型
基礎概念
核心:
將現實事物抽象為數據,并將現實中事物之間的聯系抽象為數據之間的聯系。說白了就是用數據去復刻現實,在此之上添加更多的操作。
內容:
基本數據模型(前面的2)也分兩層:
實現步驟:
按照上面的結構自頂向下逐層分解,直到實現。
E(ntity)-R(elationship)概念模型(基礎)
這個是樸素的關系思想,和知識圖譜非常像。
基本概念
實體:
屬性:
實體間的聯系:
E-R數據模型
圖形表示:
聯系的語義:
弱實體:
子實體:
模型綜合舉例:
層次數據模型
這是最早的,比較混沌。代表是,IBM的IMS。
特征
相比于E-R模型的圖結構,層次結構是樹形結構,有點面向對象的味道。
儲存結構
點評
優點:
缺點
網狀數據模型
有點像E-R模型,是有向圖結構。代表是DBTG系統。
層次模型可以說是網狀數據模型的一個特例。
表示方法
點評
優點
缺點
關系數據模型(主流)
IBM的研究員提出的,獲得了圖靈獎。
基本概念
表示方法
數據操縱
CRUD是基本,而且通過SQL語句高度封裝,我們這里解釋一下本質,對數據的全部操作都可以歸結為對關系的運算。
也就是說,關系型數據庫,實體是關系,聯系是關系,操作還是關系操作,操作結果仍然是關系。
關系運算:
點評
優點:
缺點:
面向對象數據模型(發展)
起源于OOP,將數據結構定義成對象,支持面向對象的各種層次結構。
但是有待研究,或許是未來的新的爆發點。
關系數據庫
關系模型的基本概念
基本概念
關系的定義
基礎概念
關系的概念
關系的特殊性
規范化的關系
理論上規范化的關系應該有以下特征:
實際上的DBMS不一定滿足。
關系與關系模式
實際上,完整的關系模式不能簡單用1來描述,而是R(U,D,DOM,F)R(U,D,DOM,F)R(U,D,DOM,F)
關系數據庫與關系數據庫模式
一個關系數據庫中有p 個關系,所以數據庫對關系是包含關系,據此引出以下概念
關系模式與關系統稱為關系,根據上下文判斷。
鍵
鍵定義和超鍵
屬性名通常記作K
鍵的本質目的在于區分元組,即區分行。所以有一個硬性要求:?t1,t2有t1[K]≠t2[K]\forall t_1,t_2 有t_1[K]\neq t_2[K]?t1?,t2?有t1?[K]=t2?[K]
鍵的形式就是用于區分作用的屬性或者屬性組合。
其他鍵類型
https://blog.csdn.net/sinat_41803693/article/details/84021238?ops_request_misc=&request_id=&biz_id=102&utm_term=%E5%A4%96%E9%94%AE&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-1-84021238.142v14pc_search_result_control_group,157v14control&spm=1018.2226.3001.4187
關系的完整性約束
為了保證數據庫與現實世界的一致性,需要維護完整性。
關系代數
關系代數概述
分類:
傳統的集合運算
并差交
對于同一個關系模型的兩個關系進行運算,產生新的集合(關系)。同傳統的并差交一樣,保留集合的唯一性。
笛卡爾積
關系來源于對域的笛卡爾積。而我們這里的笛卡爾積又是對關系作用的,但是本質相通。
對于R與S的笛卡爾積,是針對每一個元組,進行全排列組合。
新關系的度數為原有度數之和,內容是元組拼接的全排列。
專門的關系運算
選擇
對應select語句,條件就是一個布爾表達式,選出所有真值的行合并為一個新關系,是原有關系的子集。
寫法:
舉例:
投影
選擇是從行的角度提取,投影是從列的角度提取。提取一個屬性集對應的關系。
寫法:
舉例:
這里需要注意,行的提取肯定不會出現重復,但是提取列可能重復。比如僅僅提取一個列,但是這個列的屬性只有1種,那最后投影出來的就只有1行。所以投影是會去重的。
本質上,這是因為為每一行都是有唯一鍵的,但是部分列不一定具有鍵,所以存在重復可能。
連接
連接是列上的合并+行上的篩選。
條件連接
將滿足條件的元組進行拼接。
從這一點看,本質上這就是兩個元組的笛卡爾積的子集,這個子集符合我們前面的條件。所以也自然可以轉換形式。
寫法:
舉例:
等值連接
θ\thetaθ為=的條件叫做等值連接。
這里就會有個問題,明明都等值了,為什么還要保留相同的兩列呢?這里只是為了形式保持一致,符合條件連接定義。后面用自然連接特殊化。
自然連接
自然連接寫法不需要加條件,自動合并相同屬性組。
自然連接本質上是一種等值連接,但是相比于等值連接來說,進行了重復列刪除的操作,提高了簡潔性,犧牲了形式一致性。
除法
像集
像集是一個屬性中元素到另一個屬性中元素的映射。
前面的是原象,后面的是像集。
寫法:
Z原象值={Z上的像集}Z_{原象值}=\{Z上的像集\}Z原象值?={Z上的像集}
舉例:
除法
本質上就是,去掉兩個關系中相同的屬性后剩下的屬性。
步驟:
非常抽象,所以要給足例子:
例1:
例2:
這個例子里包含了實際意義。就是進行一個篩選,篩選是滿足像集包含投影的條件的。
擴充的關系運算
屬性重命名
就是簡單意義上的重命名,即,復制一份并給一個屬性重命名或者一組屬性重命名。
就是生成一個等價的新關系。
寫法:
r′(R′)=δA→B(r)r^\prime(R^\prime)=\delta_{A\rightarrow B}(r) r′(R′)=δA→B?(r)
其中,R為原來關系模式,r為原來關系。
用法:
外連接
前面的條件連接,包括自然連接,都會把不滿足條件的元組去掉。
對于不滿足條件的元組,還可以有另一種處理方法:保留,但是強行合并的部分用NULL區分,由此分出三種保留方法。
關系代數應用
用于增刪查改
對數據庫的各種操作,增刪查改,都可以用關系代數表達式來表示。這就是完備性。但是注意,某種操作并不一定只有一種關系表達式,而是可以有各種方法。
當然,一般不直接用關系代數表達式,而是將表達式封裝進SQL語言。
這里對關系代數的效果進行理解:
S?SC?CS\bowtie SC \bowtie CS?SC?C,來制造一個直觀的表,將多對多轉換成一一對應關系。
案例解析
首先聲明一下,S代表學生,C代表課程,SC代表選修關系。
首先用選擇篩選學生,然后用投影提取學號和姓名屬性。
首先將SC中選C1篩選出來,然后進行匹配鏈接,最后再將學號提取出來。
還有一種方法,先進行匹配連接,然后篩選C1課程,最后將學號提取出來。
至于不選C1的,就用差進行取補運算即可。
涉及到“全部”二字,自然要用除。為了控制除的相同屬性與最后結果,我們需要進行投影。
這里從全部變成“至少”。至少兩門的情況下,需要建立臨時關系,再除。
一般的除,只能剩下一列,那我如果結果要多列怎么辦?用除的結果匹配連接一下就好。
第一種方法簡單粗暴,直接先將多對多轉化為一一對應的選修表,然后將其中Cpno=5的選修找出來,再提取這些學生的名字。這里可能會重復,但剛好投影的特性就是去重。
后面兩種方法,運用了很多投影,投影可以將問題簡化,只關注對解決問題有效的列。
插入和刪除比較簡單,插入就并,刪除就差,條件判斷通過查找來實現。
刪除操作中,首先將S和C選擇+投影出來簡化問題,然后匹配,就可以得出一條元組(這里的選擇方式最后只能得出一條元組),然后刪去即可。
這個問題的核心在于同一個系。所以首先用重命名復制一份,只保留Sdept(專業)進行匹配,最后的話就會匹配出所有專業相同學生的組合,包括李勇和他自己。然后將和李勇專業相同的匹配篩選出來,這個時候左半邊就都是李勇,最后取出右半邊的同學。
注意李勇還是會存在,如果不想要,就進行刪去。
這個問題可以簡化,用除法。這里為什么可以放兩個元素在左邊,不會吧問題搞復雜嗎?是因為Sno和Sname是一一對應的,所以無所謂。在同一個系可以理解為這個學生所在的系包含這個系,自然引出除。
這是除的特殊用法,一個學生只能在一個系中,所包含的系也不可能同時有兩種。
典型關系代數語言:ISBL
這是關系代數的簡單抽象,僅僅是將符號編碼成計算機內的符號而已。然后屬性重命名之類的特殊操作也有對應寫法。
這個語言實用性不強,畢竟只是簡單抽象的編程語言。
關系演算
比較抽象,通過謂詞演算來進行操作,至于具體怎么實現,由系統解決。
這可以說是對關系代數的封裝。
所以這個非過程化的,通過關系演算推測背后的實現比較麻煩。
元組關系演算
進行簡單觀察看出,元組運算對列的選取采用下標方式。S(t)表示t是S中的元組,后面加上t[5]=“計算機”的限制條件。
第二個表達式,首先聲明t屬于S,然后聲明u屬于SC,u滿足選修C1課且u和t在學生方面匹配
元組關系演算語言:ALPHA
了解即可。
域關系演算
了解即可,核心在于,謂詞變元的基本對象是域變量。
域關系演算用于非專業用戶,多用于圖形界面的表格直接查詢。
域關系演算語言QBE
關系數據語言
關系數據語言,將關系代數封裝,具體的存取路徑由DBMS優化機制完成。
而且可以嵌入高級語言中使用,畢竟已經變成高級語言了。
我們現在都用SQL(Structured Query Language)語言,兼顧關系代數和關系演算的雙重特性,非過程化·,但是足夠結構化。
關系運算的安全性與等價性
這里的安全指的是,不要產生無限的關系,否則會溢出內存。
關系代數運算是安全的,因為本地關系有限,所以只要經過有限次關系代數運算,產生的結果就是有限。
關系演算不一定安全,需要加以限制,定義一個有限的符號集。
確定安全以后,關系代數,元組關系演算,域關系演算三者是可以互相轉換的,必然有表達式可以用來替代。
SQL語言(核心)
SQL概述
SQL是現在標準的數據庫描述語言。體現出聲明式特征,高度非過程化。
綜合性強:
可以提供兩種使用方式:
SQL數據定義
SCHEMA定義
如果不指定模式名,默認為用戶名。此處體現出用戶和SCHEMA的內在聯系
TABLE定義
域定義相當于typedef。
constraint是標準約束定義。
強制綁定模式可以用 模式.表命名,或者在模式創建中定義表。
改表可以增刪改列。但是新增列是空值,所以不能用NOT NULL
建立索引
索引用于自定義存取路徑,加快查詢。
通常用B+樹實現。B+樹就是平衡多路查找樹,用于二分查找。
如果不加UNIQUE意味著可能一個索引對應多個數據,但是不推薦在很多重復上建立,沒意義.
聚集索引強制儲存空間級別的排序。這樣,如果要查詢15-20之間的數,查到15順著物理空間找就好了,用不著反復二分查找,對于范圍查找有奇效。
索引不會被依賴,所以不用cascade之類的聲明
SQL數據操縱——查詢
查詢是數據庫核心技術,本質是對數據操縱對象的選擇,是一切操縱的基礎。
單表查詢
基礎,最花的玩法。
基礎查:
列可以是屬性,也可以是計算后的值,表達式,聚集函數。
列還可取別名。
選擇的各種條件是查詢的靈魂。
組內調用聚集函數,聚集函數可以選擇是否保留重復值
算出的組可以用HAVING篩選。注意WHERE作用于元組級別,HAVING作用于組級別。如果同時用,就會先進行WHERE篩選,然后聚集,最后用HAVING篩選
連接查詢
設計兩個以上表的查詢,需要連接:
A NARURAL JOIN B 則產生一個自然連接表
以此類推,INNER JOIN,LEFT OUTER JOIN ,RIGHT OUTER JOIN,FULL OUTER JOIN
只不過涉及到內,左右全連接,就要用ON條件而不是where條件,這個比較奇怪。
嵌套查詢
嵌套查詢可以替代連接查詢。其實連接查詢會產生比較大的中間結果,所以一般不這么搞。
注意子查詢不能用ORDER BY,估計也沒人用,沒意義。
子查詢分兩種:
注意:
IN類子查詢
含義就是父查詢的某個屬性處于子查詢的范圍內。
其實很多時候都是等于查詢結果,但是IN對這種兼容,等于不也是處于內部嗎。
“信息系統”只在C中,所以要與SC關聯,再和S關聯。關聯也很簡單,就是IN也可以用鏈接一步到位,由此可見,嵌套查詢多是用于多表查詢。可以替代連接操作。
ANY/ALL子查詢
any代表存在,而不是任意,all代表所有,這才是任意。
這個可以和統計查詢相替代。比如查詢比ALL都大,相當于比MAX聚集函數結果大。
EXIST類子查詢
EXIST+select字句可以產生一個布爾值,效率比較高。
相比于IN,他沒那么層次分明,習慣于將判斷一股腦對到select子句中。
而且還可以組合邏輯謂詞,這是難點,但是也可以實現復雜的邏輯。
集合查詢
集合查詢就是將兩個查詢塊通過交并差形成新結果。
但是集合查詢也是可以替代的。
派生表查詢
派生表是針對FROM進行優化。
先把數據來源用SELECT字句修改,然后再這個數據里面再進行篩選。
其實前面的自然連接就是這種修改。
SQL數據操縱——增刪改
SQL視圖
SQL數據控制
嵌入式SQL
查詢優化
安全性控制
完整性控制
故障恢復技術
并發控制
數據庫設計
理論部分
關系數據庫層次重論
前面學的是分成內模式,模式,外模式,但是實際使用中沒有這么簡單。
首先是關系和關系模式,關系指的是數據本身,關系模式指的是數據的結構定義,比如你的屬性列。
關系模式在SQL中用TABLE定義。
基于模式,產生外模式VIEW。
這里會有人問,SCHEMA是什么?SCHEMA將若干個TABLE聚合,相當于命名空間,而SCHEMA一般是和一個數據庫用戶綁定起來。這也是為什么TABLE默認創建在于用戶同名的SCHEMA上。
最終,所有SCHEMA中的所有TABLE構成數據庫。
關系模型的存儲異常
下面的例子缺點很明顯:
以上四點統稱為數據存儲異常。
根源在于模式設計有問題,沒有反映出本質聯系,這些本質聯系就是數據依賴,所謂的模式優化,就是要發現這些聯系,并且做出分解。
數據依賴:
函數依賴
定義與類型
顧名思義,就是函數映射,可以多對一,但是不可以一對多。
函數依賴分三種:
邏輯蘊涵與閉包
函數依賴集F對應一個關系模式R(U,F)
對于F中的某個依賴FD,其被F邏輯蘊涵。只要FD滿足R,那么就說F邏輯蘊涵FD。
一般給出的F都不全,所以用F的閉包F+F^+F+ 表示所有邏輯蘊涵的FD集合。
函數依賴公理——Armstrong公理
三條推理規則:
三條推論:
屬性閉包
屬性閉包是一個工具,用于導出被蘊含的FD或者判斷依賴是否屬于F。
對于一個依賴X->Y,如果可以用X導出Y,說明這個依賴被F蘊含。否則就不蘊含。
核心就是,給你一些條件屬性,你能通過F導出多少結果。
具體算法如下:
這個肯定是有限步,即使每次只得出一個屬性,也只需要做U-X+1次即可。
最小依賴集
當兩個依賴集可以互相完全導出,那么就是等價的。
在所有等價依賴集中,最小的那個就是最小函數依賴集。有趣的是,這個還不是唯一的,如果計算路徑不一樣的話。
怎么算就要從最小依賴集特性入手:
右邊都是單屬性
沒有多余的函數依賴。如果一個函數依賴可以被剩余部分導出,說明多余。
左邊沒有多余屬性。
拆分單屬性。
去掉多余依賴。逐個去掉,用屬性閉包測試是否可以用X推出Y,如果能導出,就多余,注意,如果去掉了,就直接去掉就OK,因為總是等價的,后面可以用新的集合判斷。這也就能解釋為什么最小依賴不唯一,因為你去掉的順序不一樣。
3 縮減部分依賴。看看將某個屬性縮減后,縮減后依賴是否屬于集合。比如將AB變成A或者B,看看能否導出結果,能導出就說明可以縮減,只需要一部分就可以導出結果。
關系模式的規范化——模式分解
關系模式規范化就是將原有模式分解重構成為更加優化的模式。最終目的是要解決數據存儲問題。其理論就是各種關系范式。不斷規范的過程就是關系范式升級的過程。但是實際上不一定要有多高,關鍵在于適合。
規范化就是模式分解的過程,模式分解就是將列拆分,重構成為兩個新關系。最終目的是減少數據冗余以及提高性能。
模式分解有兩個指標:
先給個定義:非候選鍵部分的屬性叫做非主屬性。
模式有以下幾個等級,逐級加強:
設計流程
數據分析與需求分析——SA方法
這一步最耗時,最困難。在進行前期調差后,對信息進行SA分析,自頂向下,逐層分解。
數據字典是核心結果。
概念模型設計——E-R模型
概念模型通常采用E-R模型。且和具體的DBMS無關。
概念模型通常采用自底向上設計。之后逐步集成。
數據抽象與局部視圖設計
三種常用抽象:
分類。表示一個實體屬于一個實體型。
聚集。表示成分,屬性。復雜的聚集,成分還可以是聚集,但是在N1原則中,這個被破除。
概括。超類型和子類型。
設計的原則如下:
大致思路是,找出實體,以及對應的屬性,然后規定聯系。聯系常常是動作,比如所屬,包含。
視圖集成
合并需要消除沖突:
合并還需要消除冗余,可以在這一步完成,后面也可以通過規范化來解決。
驗證全局概念結構
略。
數據模型——邏輯數據庫設計
將概念模型轉化為數據模型的模式,比如關系數據庫對應關系模式。
之后需要進行優化。
轉換
對于關系數據庫,將實體,屬性,聯系都轉換為關系模式。
實體和屬性簡單,難點在于聯系。
優化
這一步主要通過規范化實現。
還可以通過分解方法實現,這是針對實際應用的優化:
子模式設計
設計出模式以后,還可以設計外模式。外模式根據用戶需求來。
數據模型——物理數據庫設計
這一步設計內模式。
選擇存取路徑
這個相當于模式——內模式映像。
即如何實現SQL語句。
常用存取方法:
設計關系,索引等數據庫文件的物理儲存結構
這個涉及到儲存的硬件。用性能來評估。
建立數據庫與測試維護
數據庫投入運行需要逐步測試,
后面維護需要用到重組織,目的是提高系統性能。
可以看到,這些都是和實際的數據打交道,并不會影響到數據模型結構(包括邏輯結構和物理結構)變化。
總結
- 上一篇: 【引用】各种软件视频教学
- 下一篇: 30 岁的超级玛丽怎样改变了游戏行业?