層次模型
tree
- Record and field
- Parent-Child relationship(PCR)
每個記錄類型只有一個父節點
無法表達多對多信息
采用虛記錄解決多對多
網狀數據模型
系:主記錄->屬記錄
主記錄和屬記錄都可以有好多個
關系模型
表:table/relation
-
擁有更高的抽象級別,可以用數學里面集合論的知識研究
-
屏蔽底層編程細節,易于理解
-
可以引入代數系統
-
非過程化查詢語言
-
軟鏈接,邏輯指針
-
屬性和域
- 原子數據:要求表的每個屬性是原子的,不能再分。不允許出現表中套表。(一范式)
- 允許空值
- 關系(表)和元組
屬性的個數稱作目
屬性,列,字段
元組,行,記錄
主鍵:一組屬性
- unique
- not null
- 可以決定其他元組的其他屬性
- 屬性組的子集不滿足上述條件。如果不滿足這個條件就稱作超鍵。
- 如果多個屬性組滿足上述條件,我們可以指定一個為主鍵,其他的為候補鍵
- 如果這個屬性組就是元組本身,稱這個屬性組為全鍵
外鍵:一組屬性
- 來自其他關系,并且是其他關系的主鍵。邏輯指針
- 且必須在另一個表里面存在這個主鍵
域完整性約束:每個元組的每個屬性的值都必須滿足值域
實體完整性約束:主鍵不允許為空
引用完整性約束:外鍵的值必須在所引用的表中存在
關系代數
基本操作
- 選擇Selection σ\sigmaσ :選擇一些行
- 投影Projection π\piπ:選擇一些列。投影操作應該消除可能出現的重復元素。實際的系統不會自動進行消除重復元素,除非用戶要求。
- 叉乘Cross-product ×\times× : 笛卡爾乘積
- 集合差Set-difference?-?:集合減法
- 合并Union∪\cup∪:將兩個表合并起來
上述五種操作構成了數據庫完備的操作集合。任何其他操作都可以通過這些操作完成。
上面的操作都是封閉的。
后面兩種操作要求參與運算的兩個集合滿足并兼容的條件:
- 屬性個數一樣
- 屬性類型一樣
連接操作:先做笛卡爾乘積,再做選擇。實際上可以進行查詢優化,否則效率比較低。
- 等值連接
- 自然連接:按照兩個表的共同屬性進行等值連接
除法操作:A/B
A/B=πx(A)?πx(πx(A)×B?A)A/B = \pi_x(A)-\pi_x(\pi_x(A)\times B-A) A/B=πx?(A)?πx?(πx?(A)×B?A)
首先先將A中特有的屬性x和B中的屬性y分離開,然后再叉乘,得到的是一個比A大的集合,減去A后剩下的就是那些原本沒有B屬性的元組,將這些x提取出來再減去他們就是正確的x.
外連接:找不到匹配仍然保留元素,用空值填補
- 左外連接:保留左邊表的所有元素
- 右外連接:保留右邊表的所有元素
- 全外連接:保留兩張表中的所有元素
外并:將不滿足并兼容的表并在一起,新表的屬性是原來兩張表的屬性的并,元組加在一起,缺少的元素補空值。
關系演算
基于謂詞邏輯的非過程化的表達
- 元組關系演算TRC
- 域關系演算DRC
等價的,區別在于變量的定義不同。域關系演算的變量是屬性。
域關系演算
- 原子公式
- <x1,x2,…,xn>屬于表
- X op Y
- X op constant
- 公式
- 原子公式
- 邏輯運算
- 使用量詞
對某個變量使用量詞就稱這個量詞被綁定
不安全的查詢:如果查詢結果是無限的,就說這個查詢是不安全的。
安全的關系演算和關系代數是等價的。
SQL語言建立在關系演算之上。
元組關系演算
變量定義在元組上
ER數據模型
傳統的數據模型擅長表達以記錄為基礎的結構化的數據,支持日常事務型的應用。
不能根據用戶的需求或者應用的需求
不能用一種很自然的方法表達實體之間的關系
語義信息不夠明確
支持的數據類型太少,有時候不能滿足應用的需求
實體Entity:現實世界中可區別的對象,使用一組屬性來描述
實體集Entity Set:實體的集合
允許復合類型,多值屬性
聯系Relationship:實體之間的聯系
E-R圖:對E-R模型的圖形化的展示。
方框:實體
圓圈:屬性
菱形:聯系
基數比例約束:
- 一對一
- 一對多
- 多對多
參與度約束:一個實體參與一個聯系的最少和最多次數
全參與
部分參與
擴展ER模型:
弱實體:不能單獨存在,必須依賴其他實體存在的實體。例如職工的家屬
普遍化和特殊化
聚集:把聯系看作實體集和其他實體發生聯系
范疇:不同類型的實體組成范疇
面向對象數據模型
突破一范式的限制