CH2 關系模型介紹
文章目錄
-
- CH2 關系模型介紹
-
- 2.1 關系資料庫的結構
-
- 2.1.1 關系執行個體
- 2.1.2 屬性類型
- 2.2 資料庫模式
- 2.3 碼
- 2.4 模式圖
- 2.5 關系查詢語言
- 2.6 關系運算
-
- 2.6.1 選擇
- 2.6.2 投影
- 2.6.3 合并
- 2.6.4 集合差
- 2.6.5 Cartrsian-Product Operation
- 2.6.5 Rename Operation
- 2.6.6 集合笛卡爾乘積和重命名的聯合
- 2.6.7 查詢範例
-
- Example1
- Example 2
- Example 3
- Example 4
- 2.7 Additional Operations
-
- 2.7.1 集合交 Intersection Operation
- 2.7.2 Joined Relations
-
- θ − \theta- θ−連接配接
- Natural join operation 自然連接配接
- Outer Join
- 例 1
- 例2:
- 2.7.3 Division Operation 除
2.1 關系資料庫的結構
2.1.1 關系執行個體
關系資料庫由表(table)的集合構成,每個表有唯一的名字。
表的一行代表一組值之間的一種聯系。表是聯系的集合,也是實體的集合。
n個值之間的聯系在數學上可以用這些值的一個n元組來表示,換言之,n元組可以對應表中的一行。
于是,在關系模型中,關系用來指代表,元組用來指代行。
關系是元組的集合,是以元組在關系中出現的順序是無關緊要的。
2.1.2 屬性類型
- 域 domain:關系的每個屬性,都存在一個允許取值的集合,稱為該屬性的域。
-
屬性值一般要求是原子性 atomic的,不可再分的。
非 原 子 性 { 多 值 屬 性 複 合 屬 性 非原子性 \begin{cases} 多值屬性\\ 複合屬性\\ \end{cases} 非原子性{多值屬性複合屬性
-
null值是每個域的成員
n u l l 值 出 現 的 情 況 { 值 不 知 道 值 不 存 在 null值出現的情況 \begin{cases} 值不知道\\ 值不存在 \end{cases} null值出現的情況{值不知道值不存在
null值導緻很多操作的定義變得複雜。要盡量避免使用空值。
2.2 資料庫模式
資料庫模式 database schema:資料庫的邏輯設計
資料庫執行個體 database instance:資料庫中資料的一個快照
-
關系模式 relation schema<—>程式設計語言中的類型
R = ( A 1 , A 2 , . . . , A n ) R = (A_1,A_2,...,A_n) R=(A1,A2,...,An),其中 A i A_i Ai是列名(屬性名),是一個關系模式。關系模式由屬性序列和屬性對應的域組成。
i n s t r u c t o r = ( I D , n a m e , d e p t n a m e , s a l a r y ) instructor = (ID,name,dept_name,salary) instructor=(ID,name,deptname,salary)是一個關系模式
要差別:instructor模式和Instructor執行個體。
同時,在關系模式中使用相同的屬性是将不同關系的元組聯系起來的一種辦法。比如下面的department關系執行個體中的dept_name就将兩個表格聯系了起來。
關系 relation instance<—>程式設計語言中的變量
2.3 碼
需求:要有一種能區分給定關系中的不同元組的方法。
一個元組的屬性值必須是能夠唯一區分元組的<==>一個關系中沒有兩個元組在所有屬性取值上都相同。
-
超碼
超碼是一個或多個屬性的集合。這些屬性的集合能使我們在一個關系中唯一地辨別一個元組。
比如instructor的ID足以将不同的教師區分開來,因為ID是一個超碼。另外,instructor的name屬性不是一個超碼,因為不同的教師可能重名。
-
候選碼
如果一個超碼,他的任意真子集都不是超碼,那麼這樣的最小超碼稱為候選碼。
有可能多個屬性集都能做候選碼。
-
主碼
資料庫設計者選中的,主要用來在一個關系中區分不同元組的候選碼。
主碼的選擇需要慎重,應選擇值從不或極少變化的屬性。
主碼一般列在所有屬性的前面。
-
外碼
一個關系模式( r 1 r_1 r1)可能在它的屬性中包含另一個關系模式( r 2 r_2 r2)的主碼。這個屬性在 r 1 r_1 r1上稱作參照 r 2 r_2 r2的外碼。
關系 r 1 r_1 r1稱為外碼依賴的參照關系。
關系 r 2 r2 r2稱為外碼的被依賴參照關系。
2.4 模式圖
模式圖可以表示主碼和外碼關系。
2.5 關系查詢語言
查詢語言:使用者用來從資料庫中請求擷取資訊的語言。
查 詢 語 言 { 過 程 化 語 言 : 用 戶 指 導 數 據 庫 執 行 一 系 列 操 作 以 計 算 出 所 需 結 果 非 過 程 化 語 言 : 用 戶 隻 描 述 所 需 信 息 , 而 不 用 給 出 獲 取 信 息 的 具 體 過 程 。 查詢語言\begin{cases} 過程化語言:使用者指導資料庫執行一系列操作以計算出所需結果\\ 非過程化語言:使用者隻描述所需資訊,而不用給出擷取資訊的具體過程。 \end{cases} 查詢語言{過程化語言:使用者指導資料庫執行一系列操作以計算出所需結果非過程化語言:使用者隻描述所需資訊,而不用給出擷取資訊的具體過程。
實際使用的查詢語言既包括過程化的成分,又包括非過程化的成分。
2.6 關系運算
邏輯代數是一種過程化語言。
過程化語言提供了一組運算:
- 要麼施加于單個關系上,要麼施加于一對關系上
- 運算的結果總是單個的關系
基礎的操作有:
- s e l e c t : σ select : \sigma select:σ 選擇
- p r o j e c t : π project : \pi project:π 投影
- u n i o n : ∪ union : ∪ union:∪ 合并
- s e t d i f f e r e n c e : − set\quad difference : - setdifference:− 集合差
- C a r t e s i a n p r o d u c t : × Cartesian\quad product : \times Cartesianproduct:× 笛卡爾乘積
- r e n a m e : ρ rename : \rho rename:ρ 重命名
這些操作的操作對象和結果都是關系:可以在結果上繼續施加運算。
2.6.1 選擇
符号: σ p ( r ) \sigma_p(r) σp(r)
p:選擇謂語 selection predicate(選擇的條件)
r:選擇的關系表
p的形式是一個謂詞公式,用∧(and),∨(or),¬(not)
比如:
σ d e p t _ n a m e = " P h y s i c s " ( i n s t r u c t o r ) σ ( A = B ) ∧ ( D > 5 ) ( r ) \sigma_{dept\_name="Physics"}(instructor)\\ \sigma_{(A=B)∧(D>5)}(r) σdept_name="Physics"(instructor)σ(A=B)∧(D>5)(r)
2.6.2 投影
符号: ∏ A 1 , A 2 , . . . , A k ( r ) \prod_{A_1,A_2,...,A_k}(r) ∏A1,A2,...,Ak(r)
A 1 , A 2 , . . . , A k A_1,A_2,...,A_k A1,A2,...,Ak是屬性名,表示顯示關系表r中的這些屬性,其他屬性不顯示。
這不是一個原地操作。
不顯示某些屬性可能會造成重複行,是以投影操作中會把重複的行去除,隻留下單一的一行。
比如:
∏ I D , n a m e , s a l a r y ( i n s t r u c t o r ) \prod\ _{ID,name,salary}(instructor) ∏ ID,name,salary(instructor)
2.6.3 合并
符号: r ∪ s r∪s r∪s
合并有下面的要求:
- r , s r,s r,s必須同元:屬性相同
- 屬性的域相同
2.6.4 集合差
符号: r − s r-s r−s
表示去掉r中含有的s的部分
r − s = { t ∣ t ∈ r a n d t ∉ s } r-s=\{t|t∈r\quad and\quad t∉ s\} r−s={t∣t∈randt∈/s}
要求:
- r和s必須同元 have the same arity
- 元的域相同
2.6.5 Cartrsian-Product Operation
符号: r × s r\times s r×s
如果無相加屬性,那麼直接做笛卡爾乘積。
如果有屬性相交,那麼需要重命名
2.6.5 Rename Operation
把關系改名:E改為x
ρ x ( E ) \rho_x(E) ρx(E)
關系改名的同時改屬性名:E改為x的同時,屬性名改為 A 1 , A 2 , . . . , A n A_1,A_2,...,A_n A1,A2,...,An
ρ x ( A 1 , A 2 , . . . , A n ) ( E ) \rho_{x(A_1,A_2,...,A_n)}(E) ρx(A1,A2,...,An)(E)
2.6.6 集合笛卡爾乘積和重命名的聯合
關系r和關系s如下:
關系r:
A | B |
---|---|
α \alpha α | 1 |
β \beta β | 2 |
關系s:
C | D | E |
---|---|---|
α \alpha α | 10 | a |
β \beta β | 10 | a |
β \beta β | 20 | b |
γ \gamma γ | 10 | b |
2.6.7 查詢範例
Example1
找到最大的balance:
先找到非最大的,然後減法:
∏ b a l a n c e ( a c c o u n t ) − ∏ A . b a l a n c e ( σ A . b a l a n c e < B . b a l a n c e ( ρ A ( b a l a n c e ) × ρ B ( b a l a n c e ) ) ) \prod \ _{balance}(account) - \prod \ _{A.balance}(\sigma_{A.balance<B.balance}(\rho_{A}(balance)\times\rho_B(balance))) ∏ balance(account)−∏ A.balance(σA.balance<B.balance(ρA(balance)×ρB(balance)))
從這個例子說明:
- 表與自身做笛卡爾乘積需要重命名,同時屬性的名字會自動改為:new_name.attribute。(即改了表名,沒有特别需要的話不需要再次更改屬性名)
- 提供思路:如何查找最大的和最小的?
Example 2
Find the loan number for each loan of an amount greater than $1200.
$$ \prod \ _{loan\_number}(\sigma_{amount>1200}(loan)) $$ 除了特别需要,寫查詢表達式時不需要寫出結果集。
Example 3
Find the customers name who have at least one deposit of a balance greater than $700.
表達式 1:
∏ c u s t o m e r _ n a m e ( σ ( d e p o s i t o r . a c c o u n t _ n u m b e r = a c c o u n t . a c c o u n t _ n u m b e r ) ∧ ( a c c o u n t . a c c o u n t _ n u m b e r > 700 ) ( a c c o u n t × d e p o s i t o r ) ) \prod \ _{customer\_name}(\sigma_{(depositor.account\_ number=account.account\_number)∧(account.account\_number>700)}(account\times depositor)) ∏ customer_name(σ(depositor.account_number=account.account_number)∧(account.account_number>700)(account×depositor))
表達式 2:
∏ c u s t o m e r _ n a m e ( σ x . a c c o u n t _ n u m b e r = d e p o s i t o r . n u m b e r ( ρ x ( σ a c c o u n t . b a l a n c e > 700 ( a c c o u n t ) ) × d e p o s i t o r ) ) ) \prod \ _{customer\_name}(\sigma_{x.account\_number=depositor.number}(\rho_x(\sigma_{account.balance>700}(account))\times depositor))) ∏ customer_name(σx.account_number=depositor.number(ρx(σaccount.balance>700(account))×depositor)))
Example 4
Find all customers who have at least two deposits.
∏ c u s t m o r _ n a m e ( σ D 1. c n a m e = D 2. c n a m e ∧ D 1. a n u m < > D 2. a n u m ( ρ D 1 ( c n a m e , a n u m ) ( d e p o s i t o r ) × ρ D 2 ( c n a m e , a n u m ) ( d e p o s i t o r ) ) ) \prod \ _{custmor\_name}(\sigma_{D1.cname=D2.cname∧D1.anum<>D2.anum}(\rho_{D1(cname,anum)}(depositor)\times\rho_{D2(cname,anum)}(depositor))) ∏ custmor_name(σD1.cname=D2.cname∧D1.anum<>D2.anum(ρD1(cname,anum)(depositor)×ρD2(cname,anum)(depositor)))
不等于的寫法! < > <> <>
2.7 Additional Operations
2.7.1 集合交 Intersection Operation
符号:r∩s
r ∩ s = r − ( r − s ) r∩s = r-(r-s) r∩s=r−(r−s)
Find the names of all customers who have a loan and an account at bank。
π c u s t o m e r _ n a m e ( b o r r o w e r ) ∩ π c u s t o m e r _ n a m e ( d e p o s i t o r ) \pi_{customer\_name}(borrower)∩\pi_{customer\_name}(depositor) πcustomer_name(borrower)∩πcustomer_name(depositor)
2.7.2 Joined Relations
θ − \theta- θ−連接配接
θ − \theta- θ−連接配接是一個比較通用的連接配接,他不需要兩個操作的關系有相同的屬性,并且連接配接條件可以是任何比較操作符。
R t i m e s S W H E R E F R\quad times\quad S\quad WHERE\quad F RtimesSWHEREF
等值連接配接是另一種連接配接,他的合并條件是相等操作。
Natural join operation 自然連接配接
Notion:$r\Join s $
R的模式: ( A , B , C , D ) (A,B,C,D) (A,B,C,D);S的模式: ( E , B , D ) (E,B,D) (E,B,D)
R ⋈ S R\Join S R⋈S的模式: ( A , B , C , D , E ) (A,B,C,D,E) (A,B,C,D,E)
r ⋈ s r\Join s r⋈s被定義為:
π r . A , r . B , r . C , r . D , s . E ( σ r . B = s . B ∧ r . D = s . D ( r × s ) ) \pi_{r.A,r.B,r.C,r.D,s.E}(\sigma_{r.B=s.B\wedge r.D = s.D}(r\times s)) πr.A,r.B,r.C,r.D,s.E(σr.B=s.B∧r.D=s.D(r×s))
自然連接配接的原表會有損失
自然連接配接舉例:
Outer Join
外連接配接避免了資訊的丢失。使用null值替換不存在的項目。
- 左外連接配接
左表為主表。
- 右外連接配接
右表為主表。
- 全連接配接
例 1
例1給出2.6.7的example的表達式三:直接使用自然連接配接,可以不寫笛卡爾乘積後的篩選條件了。
π c u s t o m e r _ n a m e ( σ b a l a n c e > ′ 70 0 ′ ( a c c o u n t ⋈ d e p o s i t o r ) ) \pi_{customer\_name}(\sigma_{balance>'700'}(account\Join depositor)) πcustomer_name(σbalance>′700′(account⋈depositor))
例2:
2.7.3 Division Operation 除
适用于包含短語for all的語句
假設關系r和關系s的模式R和S分别為:
R = ( A 1 , A 2 , . . . , A m , B 1 , . . . , B n ) S = ( B 1 , . . . , B n ) R=(A_1,A_2,...,A_m,B_1,...,B_n)\\ S = (B_1,...,B_n) R=(A1,A2,...,Am,B1,...,Bn)S=(B1,...,Bn)
那麼r÷s的模式為:
R ÷ S = ( A 1 , A 2 , . . . , A m ) R÷S= (A_1,A_2,...,A_m) R÷S=(A1,A2,...,Am)