原博文出自於: http://www.cnblogs.com/xdp-gacl/p/3619249.html 感謝!html
關係模型數據庫系統的數據結構簡單,表示數據及其數據之間的聯繫均採用關係(二維表),同時關係模型有紮實的數學理論作基礎,使得數據的操做能夠經過關係的運算來完成。數據庫
關係是數學上的一個概念,創建在平常生活中所論及的關係概念之上,例如咱們一般所說的鄰里關係、朋友關係、學生與所選修的課程及該課程的成績關係等。在這裏咱們所論及的朋友關係涉及到了互爲朋友的雙方,在數學上可表示爲(張,李);鄰里關係也涉及到了互爲鄰里的雙方,表示爲(李家,張家);學生與所選修的課程及該課程的成績關係,涉及到學生、所選的課程以及所取得的成績,在數學上表示爲(李蘭,軟件基礎,90)。(李,張)、(李家,張家)、(李蘭,軟件基礎,90)在數學上稱爲元組,括號裏用逗號隔開的對象,數學上稱爲元組的份量。數據結構
數學上關係的概念是平常生活中關係概念的抽象,下面給出關係的簡單、直觀的概念:spa
關係是以元組爲元素的集合。數據庫技術中論及的關係概念應該是:關係是同類型元組的結合。htm
簡單說,關係就是集合,能夠用大寫字母R1,R2,R來表示。對象
範例:學生與所選課程之間的關係R能夠表示爲:blog
R={(李蘭,軟件基礎,90),(張娜,高等數學,87),(張偉,C語言,76),…,(韶華,英語,79)}ci
這樣的一個關係R,在平常生活中可一般表示成一個表格的形式:數學
姓名it |
課程名 |
成績 |
李蘭 |
軟件基礎 |
90 |
張娜 |
高等數學 |
87 |
張偉 |
C語言 |
76 |
… |
… |
… |
韶華 |
英語 |
79 |
咱們能夠看到,這張表表示一個關係,表中的每一行表示一個元組,也就是關係集合的元素,表格中每列的數據表示元組的份量。
從上面的例子中能夠看到,數學上關係的概念能夠用來描述一個二維表,而二維表就是咱們現實世界中進行各類檔案管理使用的方法,其中記錄了大量的數據。這樣就用數學理論中的一個概念描述了現實世界的一個對象。關係型數據庫就是用關係描述數據的數據庫系統。
(1)二維表與關係
關係能夠用來描述二維表,對應的術語是:
(2)二維表與關係型數據庫中的數據
一個關係型數據庫中的數據對應於一個二維表,其中對應的術語是:
範例:
這裏的教學管理系統的E-R模型圖,其中實體「學生」的屬性爲學號,姓名、年齡、性別,分別用S#,SNAME,AGE,SEX表示,實體「課程」的屬性爲課程號,課程名,授課教師,分別用C#,CNAME,TEACHER表示,實體學生用S表示,課程用C表示,學生與課程之間的關係用SC表示,SC的屬性成績用GRADE表示。
用關係描述教學管理模型的數據:
分析:在這個E-R圖中,實體有學生和課程兩個,兩個實體之間的聯繫是多對多的,按照將E-R模型轉換成關係模型的轉換方法,因爲學生實體與課程實體之間的聯繫是多對多的,因此轉換成關係模型時,實體和聯繫分別轉換爲關係模式:
S(S#,SNAME,AGE,SEX)
C(C#,CNAME,TEACHER)
SC(S#,C#,GRADE)
這些關係模式集能夠描述三類關係,下面是這三類關係模式的關係實例:
上面的三個關係中,關係S的關鍵字是:S#(學號),關係C的關鍵字是:C#(課程號),關係SC的關鍵字是:S#+C#(學號+課程號)。關鍵字是能惟一標識記錄的字段或字段表達式。這樣咱們就將現實世界(教學管理系統)用S、C、SC三個關係模式描述清楚了。
(3)關係模型的三類完整性規則
關係描述了現實世界中的數據,這些數據以數據庫(表)的形式存儲到計算機中,根據現實世界的變化,計算機中的數據也要進行相應的改變。爲了維護數據庫數據與現實世界數據的一致性,關係數據庫中的數據的創建與數據的更新必須遵照如下規則:
例如在聯繫關係SC中課程號字段出現的課程號,必須在課程關係中存在,假如在關係C中找不到「小學算術」這個課程的課程號,而SC中出現了記錄:(李冰,CC01(小學算術),95),那麼這條記錄就是一條錯誤的記錄,由於它違背了參照完整性規則
參照完整性規則能夠理解以下:
若是屬性集K是關係模式R1的關鍵字,K也是關係模式R2的屬性,那麼在關係R2中K爲外鍵,在R2的關係中K的取值只容許有兩種可能,或者爲空值,或者等於R1關係中某個關鍵字的值。
其中提到的外鍵是指:當關系中的某個屬性或屬性組雖然不是該關係的關鍵字或只是該關係關鍵字的一部分,但倒是另外一個關係的關鍵字,則成該屬性是這個關係的外鍵,如上面提到的SC關係中的課程號不是SC的關鍵字,但課程號是關係C的關鍵字,所以課程號是SC的外鍵,在關係SC中屬性課程名的值只能爲空或者爲C中課程號字段中的某個值。
主鍵不能爲空,而且不能夠重複,外鍵能夠爲空
3.用戶完整性規則:這是針對某一具體數據的約束條件,由應用環境決定。用戶定義的完整性規則反映某一具體應用涉及的數據必須知足語義的要求。系統提供定義和檢驗這類完整性的機制,以便用統一的方法處理它們,再也不由應用程序承擔這項工做,例如在定義關係模式時,定義關係中的每一個字段,對每一個字段必須定義該字段的字段名(年齡),字段類型(整型),字段寬度(2位),小數位數(0位),通過這樣的定義,在給每條記錄的年齡字段輸入數據時,能夠輸入兩位整型數據,這就是一種約束,若是咱們還想進一步對錄入的數據進行約束,以減小數據錄入的錯誤,須要定義一個具體的約束條件(能夠寫一條規則),把年齡限制在15歲到25歲之間(實際上這是學生的實際年齡範圍),以知足實際數據的須要,這就是用戶完整性規則,在進行數據操做時由系統負責檢驗數據的合理性。
總結前面關於關係模型的論述,咱們看到,在定義一個關係模式時,須要進行如下三個部分的定義:
1) 數據結構的定義:數據庫中的所有數據及其互相聯繫都被組織成「關係」的形式,而且關係模型的基本數據結構也是關係。
2) 數據操做的定義:關係模型提供一組完備的高級關係運算,以支持數據庫的各類操做。關係運算分爲關係代數和關係演算兩類。
3) 關係模型的三類完整性規則的定義:除了進行數據結構、數據操做的定義,爲了確保數據的正確性,還要進行三類完整性規則的定義。
關係是一個數學上的概念,是一類集合(以同類型元組爲元素的結合),所以關係代數是以集合代數爲基礎發展起來的,關係是能夠進行運算的。如同數字運算的對象和結構都是數字、集合運算的對象和結果都是集合同樣,關係運算的對象和結果都是關係。關係運算能夠分爲兩類:
傳統的集合運算:這類運算從關係是集合的定義出發,把關係看出集合,則集合的全部運算對關係也是有效的。這類運算有:關係的並集、交集、差集、笛卡爾積。
專門的關係運算:這類運算是用來進行數據庫的查詢操做。這些運算能夠把二維表進行任意的分割和組裝,隨機地由已有的二維表構造出各式各樣用戶所須要的二維表。這類運算有:投影、選擇、鏈接、除法運算。
傳統的集合運算是二元運算。所謂二元運算是指運算的對象爲兩個,好比加法就是二元運算,進行運算的對象是兩個數;二元關係運算是指,兩個關係進行運算,結果爲一個新關係。
(1)關係的並運算
關係的並運算的運算符號與集合並運算的符號相同,都是∪,關係運算中,只有兩個同類型關係的並纔有意義。設R1和R2是兩個同類型的關係,它們之間的並運算表達式是:R1∪R2,其結果也是同類型的關係,其中R1∪R2的元組或者是R1的元組或者是R2的元組,記爲:
R1∪R2={t|t∈R1∨t∈R2}
「∨」這個符號的意思是「或」,即t是屬於(∈)R1裏面的元組,或者t是屬於R2裏面的元組。因此這裏的表達式的意思是R1∪R2產生了一個新的關係,這個新的關係由元組t組成,t多是來自R1裏面的元組,也多是來自R2裏面的元組。
範例:
設R一、R2爲學生實體模式下的兩個關係:
則由關係並的定義得R1∪R2
(2)關係交運算
關係交運算符號與集合交運算的符號相同,都是∩,關係運算中,只有兩個同類型關係的交纔有意義。設R1和R2是兩個同類型的關係,它們之間的交運算表達式是:R1∩R2,其結果也是同類型的關係,其中R1∩R2的元組是由既是R1的元組也是R2的元組構成,記爲:
R1∩R2={t|t∈R1∧t∈R2}
「∧」這個符號的意思是「且」,即t既是屬於(∈)R1裏面的元組,同時t也是屬於R2裏面的元組。因此這裏的表達式的意思是R1∩R2產生了一個新的關係,這個新的關係由元組t組成,t既是來自R1裏面的元組,也是來自R2裏面的元組。
範例:設R一、R2爲上述範例中的學生實體模式下的兩個關係,求R1∩R2
由關係交運算的定義可得R1∩R2
(3)關係差運算
關係差運算的運算符合與集合差運算的符號相同,都是-,關係運算中,只有兩個同類型關係的差纔有意義。設R1和R2是兩個同類型的關係,它們之間的差運算表達式是R1-R2,其結果也是同類型的關係,其中 R1-R2的元組是由R1的元組,而不是R2的元組構成,記爲:
R1-R2={t|t∈R1∧t∉R2}
範例:設R一、R2爲上述範例中的學生實體模式下的兩個關係,求R1-R2
由關係差運算的定義可得R1-R2
(4)笛卡爾積運算
笛卡爾積是關係這類集合所特有的一種運算,其運算符合是乘法運算符「×」,是一個二元關係運算,兩個運算對象能夠是同類型的關係也能夠是不一樣類型的關係,若R1是r1元元組的集合,R2是r2元元組的集合,則R1×R2是r1+r2元組的集合,R1×R2的元組(元組對應着二維表中的行)是由R1的份量(份量對應着二維表中的列)和R2的份量組成的,記爲:
R1×R2={t|t=(r1,r2)∧r1∈R1∧r2∈R2}
範例:設關係R一、R2分別爲學生實體和學生與課程聯繫的兩個關係,求R1×R2。
由笛卡爾積的定義可得R1×R2
從上例中咱們看到R1×R2是一個很大的運算,由R一、R2進行笛卡爾積運算獲得的新關係是比關係R一、R2大得多的關係。這個運算的運算量大、佔有的存儲空間大,而且咱們看到在R1×R2關係中,四條記錄只有第一條記錄有實際意義的,而其餘的三條記錄均沒有實際的意義。咱們分析第一條記錄,又是一條很是有用的信息,反映了李蘭同窗的全部信息包括她的學號、姓名、性別、年齡、選學的課程名以及所選課程的成績,這條記錄的信息來源於兩個關係中,是兩個關係的一種鏈接。
專門的關係運算有選擇、投影、關係的天然鏈接和關係的除法,其中關係的選擇運算和投影運算是一元運算,是對一個關係進行垂直和水平分解而獲得一個關係,而關係的天然鏈接和關係的除法是二元運算,是把兩個關係的信息根據須要組織成一個新關係,是信息的綜合,這幾種關係的運算都與記錄的查詢操做有關。
(1)選擇運算
關係的選擇運算的運算符是「δ」,關係的選擇運算是一元運算,運算的對象是關係,運算的結果也是關係,新關係是原關係的子集,記爲:
δF(R)={t|t∈R∧F(t)}
在上式中δ表示的是選擇運算,F是一個條件表達式,R是進行關係運算的對象,δF(R)是選擇運算的結果,其元組首先是關係R的元組,而且這些元組要使得條件F爲真,即F(t)爲真,所以,選擇運算也可敘述爲:在關係R中選擇知足條件F的記錄,組成一個新的關係
範例:設關係R1是實體學生關係模式的一個關係,在關係R1中查找知足年齡小於等於17的學生。
解決這個問題可使用選擇運算來完成。
R=δ年齡≤17(R1)={t|t∈R1∧age≤17}
運算的結果爲:
經過這個例子能夠看到,關係的選擇運算能夠用來在一個關係中查找知足條件的記錄,由這些知足條件的記錄組成的新關係就是選擇運算的結果。在這個例子中條件是學生關係中記錄的年齡字段的值小於等於17。選擇運算是對關係進行水平分割生成用戶須要的關係。
(2)投影運算
關係投影運算的運算符是「Ⅱ」,關係投影運算是一元運算,運算的對象是關係,運算的結果也是關係,新關係的元組是在原關係的元組中選出的若干個份量組成的元組,記爲:
Ⅱti1,ti2,…tim(R)={t|t=(ti1,ti2,…tim)∧(t1,t2,…,tk)∈R}(其中K>im)
上式中「Ⅱ」是投影運算的運算符,R是投影運算的運算對象,(t1,t2,…,tk)是關係R的元組,(ti1,ti2,…tim)是投影運算所獲得新關係的元組。
範例:設S是學生關係模式的一個關係,在某次查詢中要求查找每一個學生的年齡
解決這個問題,可使用投影操做:
R=Ⅱ姓名,年齡(S)={t|t=(姓名,年齡)∧(學號,姓名,性別,年齡)∈S}
運算結果R爲:
在關係R中查找某個學生的年齡比在關係S中查找某個學生的年齡運算量要小得多。
投影運算是對關係進行垂直分割,產生用戶所須要的關係
(3)鏈接運算
鏈接運算與投影和選擇運算不一樣,鏈接運算是將兩個關係鏈接起來,以知足查詢任務的要求,鏈接運算是二元運算。實際上,關係笛卡爾積運算就是一種鏈接運算,是兩個關係的最大鏈接。笛卡爾積運算的結果,產生了不少沒有實際意義的記錄,而鏈接運算是將兩個關係鏈接起來,得到與用戶查詢有關的新關係。關係的鏈接有兩類;條件鏈接和天然鏈接