前言
1.關聯式模式要求關係必須是正常化的,這些規範條件中最基本的一條就是,關係的每一分量(元組)必須是一個不可分得資料項目中的一個屬性。
2.模式反應的是資料的結構及其聯絡,而執行個體反應的是資料庫某一時刻的狀態。
3.資料庫的三級模式是指資料庫系統由外模式、模式和內模式構成。資料庫管理系統在這三級模式之間提供了兩層映像:外模式/模式映像和模式/內模式映像。正是這兩層映像保證了資料庫系統中的資料能夠具有較高的邏輯獨立性和物理獨立性。
4.模式實際上是資料庫資料在邏輯上的視圖,一個資料庫只有一個模式。dbms提供模式描述語言(模式ddl)來嚴格地定義模式。
本文資料庫的三級模式結構
一個資料庫可以有多個外模式,同一個模式可被某一使用者的多個應用系統使用,但一個應用程式只能使用一個外模式。
1.一個模式可以有任意外模式,對於每一個外模式,資料庫系統都有一個外模式/模式映像。
2.當模式改變時,有資料庫管理員對外模式/模式映像做相應的改變,達到外模式不用改變的目的。
.應用程式是依據資料的外模式編寫的,從而應用程式不必修改,這樣保證了資料與程式的邏輯獨立性。除非應用需求本身發生變化,否則應用程式一般不需要修改。
關聯式資料庫
關係是笛卡爾積的有限子集
1.關係可以有三種類型:
基本表:實際存在的表,它是實際儲存資料的邏輯表示。
查詢表:查詢結果對應的白哦
視圖表:由基本表或其他的視圖表匯出的表,是虛表,它不對應實際儲存的資料
2.關係模式是型,關係是值
關係的描述稱為關係模式,他可以形式化的表示為R(U,D,DOM,F).
其中R為關係名,U為組成該關係的屬性集合;D為屬性群組U中的屬性所來自得域;DOM為屬性向域的映像集合;F為屬性間資料的依賴關係集合。
3.關係操作
4.關係的完整性
1.實體完整性和關係完整性是關聯式模式必須滿足的完整性條件約束條件。
實體完整性規則:如果屬性A是基本關係R的主屬性(候選碼),則A不能取空值。
參照完整性規則:如果屬性F是關係基本關係R的外碼,它與基本關係s的主碼K相對應,則對於R中的每一個元組在F上的值必須為:
或者取值為空白,或者等於s中某個元組的主碼值
其中的R和S可以是同一個關係,比如班長是外碼。
5.關係代數
傳統的集合運算時二目運算,即並、差、交和笛卡爾積四種,將關係看成元組的集合,其運算是從關係的水平方向即行的角度來進行,而專門的關係運算包括選擇、投影、串連和除運算,不僅涉及行而且涉及列。比較子>,<,=,<>和邏輯運算子是用來輔助專門的關係運算的。
1.等值串連:它是從關係RYuS的廣義笛卡爾積中選取A和B屬性值相等的那些元組。
2.自然串連是一種特殊的等值串連,他要求兩個關係中進行比較的分量必須是相同的屬性群組,並且在結果中把重複的屬性列去掉。一般的串連操作是從行的角度進行運算,但自然串連還需要取消重複列,所以自然串連是從行和列的角度進行的運算。
3.外串連:把捨棄的元組頁儲存在結果關係中,而在其他屬性上填空值。如果把左邊關係R中要捨棄的元組保留就叫左串連;如果把右邊關係的元組保留就叫右外串連。
4.除運算
給定關係R(x,y)和s(y,z),其中x,y,z為屬性群組,R中的Y與S中的Y可以有不同的屬性名稱,但必須出自相同的域集。R與S的除運算得到一個新的關係p(x),P是R中滿足一下關係的元組在x屬性列上的投影:元組在X上分量值x的象集Yx包含S在Y上投影的集合。
例子“
1.查詢選修了全部課程的學生姓名。
select sname from student where not exists (select * from course where no exists(select * from sc where sno=student.sno and cno=course.cno));--sql中沒有全稱量詞,但是,我們總可以把帶有全稱量詞的謂詞轉換為等價的帶有存在量詞的謂詞。
2.查詢至少選修了學生10094030011選修的全部課程的學號。可以使用蘊含邏輯運算。
select distinct sno from sc scx where not exists(select * from sc scy where scy.sno='100940311' and not exists(select * from sc scz where scz.sno=scx.sno and scz.cno=scy.cno));
刪除模式
drop schema <模式名> <cascade|restrict> --cascade級聯和restrict兩者必選其一。
定義視圖
rdbms執行 create view 語句只是把視圖的定義存入資料字典,並不執行其中的select語句。只是在對視圖查詢時,才按視圖的定義從基本表中將資料查出。對於非行列子集視圖的查詢,就不一定能轉換。因為where子句中是不能用聚集合函式作為條件運算式。
grant和revoke
grate和revoke語句向使用者授予或回收對資料的操作許可權。對資料庫模式的授權則由dba在建立使用者時實現。
資料庫角色
資料庫角色是被命名的一組與資料庫操作相關的許可權,角色是許可權的集合,使用角色來管理資料庫許可權可以簡化授權的過程。
mac 強制存取控制
僅當主體的許可證層級大於或等於客體的密級時,該主體才能讀取相應的客體;僅當主體的許可證層級等於客體的密級時,該主體才能寫相應的客體。
註:
1.主體是系統中的活動實體,即包括都不陌生所管理的實際使用者,頁包括代表使用者的各進程;客體是系統中的被動實體,是受主體操作的,包括檔案、基本表、索引和視圖。
2.mac是對資料庫本身進行密級標誌,無論資料如何複製,標記與資料是一個不可分的整體,只有符合密級標記要求的使用者才可以操作資料。
3.較高安全性層級提供的安全保護要包含較低層級的所有保護,因此在實現mac時要首先實現dac,系統首先進行dac檢查,對通過dac檢查的允許存取的資料庫物件再由系統自動進行mac檢查,只有通過mac檢查的資料庫物件方可存取。
audit 審計
audit語句用來設定審計功能,noaudit語句取消審計功能。
audit alter,update on 表名;
審計設定以及審計內容一般都存放在資料字典中,必須把審計開關開啟。即把系統參數audit_rail設定為true,才可以在系統資料表sys_audittrail中查看審計資訊。
註:
號的安全性措施應該使得那些試圖破壞安全的人所花費的代價遠遠超過他們所獲得的利益
觸發器 trigger
trigger是使用者定義在關係表上的一類由事件驅動的特殊過程
1.建立觸發器
create trigger <觸發器名>
{before|after}<觸發事件>on <表名>
foreach{row|statement}
[when <觸發事件>]
<觸發動作體>
2.刪除觸發器
drop trigger <觸發器名> on <表名>
註:
1.foreach statement是語句級,觸發動作只發生一次,如果表的觸發器是行級的話,觸發動作將作用於所有的行。
如果是行級觸發器,使用者可再過程中使用new和old引用update、insert事件之後的新值和update、delete事件之前的舊值。如果為語句級觸發器,則不可使用new和old進行引用。
2.觸發動作體可以是一個匿名PL/SQL塊,也可以是對已建立的預存程序的調用。
3.同一個表的多個觸發器啟用時遵循如下的執行順序。
1)執行該表上的before觸發器
2)啟用觸發器上的sql語句
3)執行該表上的after觸發器。
正常化
設R(U)是屬性集U上的關係模式。X,Y是U的子集。如果對於R(U)的任意一個可能的關係R,R中不可能存在兩個元組在X上的屬性值,而在Y上的屬性值不等,則稱x函數圈定y,或者是y函數依賴於x。
1.完全函數依賴
在R(U)中,如果y函數依賴於y,並且對於x的任何一個真子集x',都有y函數不依賴於x'.則稱y對x完全函數依賴。
2.範式
1)。一個低一級範式的關係模式,通過模式分解可以轉換為若干個高一級範式的關係模式的啟用。這種過程叫做正常化。
2)。關係,作為一張二維表,對他有一個最起碼的要求:每一個分量必須是不可分的資料項目。滿足這一條件的關係模式就屬於第一範式。
3.如果關係R屬於第一範式,且每一個非主屬性完全函數依賴於嗎,即消除部分函數依賴,來達到第二範式。
4)。關係模式R<U,F>中如果不存在這樣的嗎Y,屬性群組Y及非數主屬性Z(Z不屬於Y),使得y函數依賴於X,且Z函數依賴於Y成立,X不依賴於Y.。則稱關係模式屬於第三範式。如果是第三範式,它的任何非鍵屬性都並不傳遞依賴於任何候選索引鍵。
進程
進程的概念一分為二,task是申請資源的最小單位,而thread是調度和啟動並執行最小單位。一個task可以有多個thread,這些thread共用task的所有資源,共同完成一個任務。
1.線索機制與進程機制的比較
1)線索比進程佔用更少的資源。
2線索調度比較靈活。.
3)線索切換開銷較小:線索共用同一地址空間,而進程的地址空間是私人的。
4)線索通訊簡便
遊標
系統為使用者開設的一個資料緩衝池,存放sql語句的執行結果,每一個遊標區都有一個名字。
PL/SQL ( procedural language/sql)
pl/sql是編寫資料庫預存程序的一種過程語言,是對sql的擴充,使其增加了過程化語句功能。
1.pl/sql概述
pl/sql程式的基本結構是塊,每個快完成一個邏輯操作
註:
1.pl/sql塊主要有兩種類型,即命名塊和匿名塊。匿名塊每次執行時都要進行編譯,它不能儲存到資料庫中,也不能在其他的pl/sql塊中引用。
2.預存程序和函數是命名快,他們被編譯後儲存在資料庫中,可以被反覆的調用,運行速度較快。
pl/sql的建立
1.creste procedure 過程名(【參數1,參數2,...】)
as
<pl/sql塊>
2.alter procedure 過程名1 rename to 過程名2;
執行pl/sql
call /perform procedure 過程名(【參數列表】);
刪除pl/sql
drop procedure 關係名();
註:
1.l最佳化時,在既有選擇操作和連結操作時,應當先做選擇操作,這樣參加串連的元組就可以大大減少。者是代數最佳化
2.選擇操作演算法有全表掃描和索引掃描,應當選用索引掃描。
3.表的串連採用index join代價頁較小。這是物理最佳化。
總結
1.關係的完整性條件約束條件包括三大類:實體完整性、參照完整性和使用者自訂完整性。
2.預存程序與函數的區別
預存程序是使用者定義的一系列sql語句的集合,設計特定的表或其他對象的任務,使用者可以調用預存程序;
而函數通常是資料庫已定義的方法,它接受參數並返回某種類型的值並且不涉及特定的使用者表。