六、關(guān)系數(shù)據(jù)庫的規(guī)范化理論
函數(shù)依賴
定義1 設(shè)R(U)是屬性集U上的關(guān)系模式。X,Y是U的子集。若對于R(U)的任意一個可能的關(guān)系r,r中不可能存在兩個元組在X上的屬性值相等,而在Y上的屬性值不等,則稱‘X函數(shù)確定Y’或‘Y函數(shù)依賴于X’,記作X→Y。
函數(shù)依賴和別的數(shù)據(jù)依賴一樣是語義范疇的概念。只能根據(jù)語義來確定一個函數(shù)依賴。例如姓名→年齡這個函數(shù)依賴只有在沒有同名人的條件下成立。如果允許有相同名字,則年齡就不再函數(shù)依賴于姓名了。設(shè)計者也可以對現(xiàn)實世界作強制的規(guī)定。例如規(guī)定不允許同名人出現(xiàn),因而使姓名→年齡函數(shù)依賴成立。這樣當插入某個元組時這個元組上的屬性值必須滿足規(guī)定的函數(shù)依賴,若發(fā)現(xiàn)有同名人存在,則拒絕插入該元組。注意,函數(shù)依賴不是指關(guān)系模式R的某個或某些關(guān)系滿足的約束條件,而是指R的一切關(guān)系均要滿足的約束條件
七、數(shù)據(jù)庫的安全與保護
1.安全性
數(shù)據(jù)庫的安全性是指保護數(shù)據(jù)庫以防止不合法的或非正常的使用所造成的數(shù)據(jù)泄露、更改或破壞。安全性問題不是數(shù)據(jù)庫系統(tǒng)所獨有的,計算機系統(tǒng)都有這個問題。只是在數(shù)據(jù)庫系統(tǒng)中大量數(shù)據(jù)集中存放,而且為許多用戶直接共享,是十分重要的信息資源。從而使安全性問題變得更為突出。系統(tǒng)安全保護措施是否有效是數(shù)據(jù)庫系統(tǒng)的主要性能指標之一。對于數(shù)據(jù)庫的安全保密方式可以有系統(tǒng)處理的和物理的兩個方面。所謂物理的是指,對于強力逼迫透露口令、在通信線路上竊聽、以至盜竊物理存儲設(shè)備等行為。對此所采取的措施是將數(shù)據(jù)編為密碼,加強警衛(wèi)以識別用戶身份和保護存儲設(shè)備等措施。在一般計算機系統(tǒng)中,安全措施是一級一級層層設(shè)置的。
(1)用戶標識和鑒定首先,系統(tǒng)提供一定的方式讓用戶標識自己的名字或身份。系統(tǒng)進行核實,通過鑒定后才提供機器使用權(quán)。常用的方法有:用一個用戶名或者用戶標識號來標明用戶身份。系統(tǒng)鑒別此用戶是否是合法用戶。若是,則可以進入下一步的核實;若不是,則不能使用計算機。用戶名的登錄只由系統(tǒng)管理員進行,一般用戶不能實施用戶名登錄?诹(Password),為了進一步核實用戶,系統(tǒng)常常要求用戶輸入口令。
(2)存取控制對于獲得上機權(quán)的用戶還要根據(jù)預(yù)先定義好的用戶權(quán)限進行存取控制,保證用戶只能存取他有權(quán)存取的數(shù)據(jù)。所謂用戶權(quán)限是指不同的用戶對于不同的數(shù)據(jù)對象允許執(zhí)行的操作權(quán)限。它由兩部分組成,一是數(shù)據(jù)對象,二是操作類型。數(shù)據(jù)對象有二類。一類是數(shù)據(jù)本身,如關(guān)系數(shù)據(jù)庫中的表、字段,非關(guān)系數(shù)據(jù)庫中的記錄、字段(亦稱為數(shù)據(jù)項)。另一類是外模式、模式、內(nèi)模式。在關(guān)系系統(tǒng)中DBA可以把建立、修改基本表的權(quán)力授予用戶,用戶獲得此權(quán)力后可以建立基本表、索引、視圖。這說明關(guān)系系統(tǒng)中存取控制的數(shù)據(jù)對象不僅有數(shù)據(jù)而且有模式、外模式、內(nèi)模式等數(shù)據(jù)字典中的內(nèi)容。對于存取權(quán)限的定義稱為授權(quán)(Authorization)。這些定義經(jīng)過編譯后存儲在數(shù)據(jù)字典中。每當用戶發(fā)出存取數(shù)據(jù)庫的操作請求后,DBMS查找數(shù)據(jù)字典,根據(jù)用戶權(quán)限進行合法權(quán)限檢查(Authorization Check)。若用戶的操作請求超出了定義的權(quán)限,系統(tǒng)拒絕執(zhí)行此操作。授權(quán)編譯程序和合法權(quán)限檢查機制一起組成了安全性子系統(tǒng)。衡量授權(quán)子系統(tǒng)精巧程度的另一個盡度是否提供與數(shù)據(jù)值有關(guān)的授權(quán)。有的系統(tǒng)還允許存取謂詞中引用系統(tǒng)變量,如一天中的時刻,終端設(shè)備號。這樣用戶只能在某臺終端、某段時間內(nèi)存取有關(guān)數(shù)據(jù),這就是與時間和地點有關(guān)的存取權(quán)限。另外,在操作系統(tǒng)中對文件、目標等的存取還有一些安全保護措施。其中加密是一種防止數(shù)據(jù)內(nèi)容被別人引用或了解的切實可行的辦法。加密有程序加密和硬件加密卡兩種形式。
2.完整性
數(shù)據(jù)庫的完整性是指數(shù)據(jù)的正確性和相容性。DBMS必須提供一種功能來保證數(shù)據(jù)庫中數(shù)據(jù)的完整性。這種功能亦稱為完整性檢查,即系統(tǒng)用一定的機制來檢查數(shù)據(jù)庫中的數(shù)據(jù)是否滿足規(guī)定的條件。這種條件在數(shù)據(jù)庫中稱為完整性約束條件。數(shù)據(jù)的約束條件是語義的體現(xiàn),這些完整性約束條件將作為模式的一部分存放數(shù)據(jù)字典中。數(shù)據(jù)的完整性和安全性是兩個不同的概念。前者是為了防止數(shù)據(jù)庫中存在不符合語義的數(shù)據(jù),防止錯誤信息的輸入和輸出,即所謂垃圾進垃圾出(Garbage In Garbage Out)所造成的無效操作和錯誤結(jié)果。而后者是保護數(shù)據(jù)庫防止惡意的破壞和非法的存取。當然,完整性和安全性是密切相關(guān)的。特別從系統(tǒng)實現(xiàn)的方法來看,往往是一種機制常常既可用于安全性保護亦可用于完整性保證。完整性約束條件可以分類如下:(1)值的約束和結(jié)構(gòu)的約束前者指對數(shù)據(jù)的值的限制,后者指對數(shù)據(jù)之間聯(lián)系的限制。關(guān)于對數(shù)據(jù)值的約束 這類約束條件是指對數(shù)據(jù)取值類型、范圍、精度等的規(guī)定。關(guān)于數(shù)據(jù)之間聯(lián)系的約束 數(shù)據(jù)庫中同一關(guān)系的不同屬性之間可以有一定的聯(lián)系,從而也應(yīng)滿足一定的約束條件。同時,由于數(shù)據(jù)庫中數(shù)據(jù)是結(jié)構(gòu)化的,不同的關(guān)系之間也可以有聯(lián)系,因而不同關(guān)系的屬性之間也可滿足一定的約束條件。
(2)靜態(tài)約束和動態(tài)約束所謂靜態(tài)約束是指對數(shù)據(jù)庫每一確定狀態(tài)的數(shù)據(jù)所應(yīng)滿足的約束條件。以上所講的約束都屬靜態(tài)約束。動態(tài)約束是指數(shù)據(jù)庫從一種狀態(tài)轉(zhuǎn)變?yōu)榱硪环N狀態(tài)時新、舊值之間所應(yīng)滿足的約束條件。
(3)立即執(zhí)行約束和延遲執(zhí)行約束立即執(zhí)行約束是指在執(zhí)行用戶事務(wù)時,對事務(wù)中某一更新語句執(zhí)行完后馬上對此數(shù)據(jù)所應(yīng)滿足的約束條件進行完整性檢查。延遲執(zhí)行是指在整個事務(wù)執(zhí)行結(jié)束后方對此約束條件進行完整性檢查,結(jié)果正確方能提交。完整性的實現(xiàn)應(yīng)包括兩個方面,一是系統(tǒng)要提供定義完整性約束條件的功能,二是提供檢查完整性約束條件的方法。對于數(shù)據(jù)值的那類完整性約束條件通常在模式中定義。例如在模式中定義屬性名、類型、長度、碼屬性名并標明其值是唯一的、非空的等等。另外的那些約束條件就要用專門的方式加以定義。
3.并發(fā)控制
數(shù)據(jù)庫是一個共享資源,可以由多個用戶使用。這些用戶程序可以一個一個地串行執(zhí)行,也可以并行執(zhí)行。在單CPU計算機上,為了充分利用數(shù)據(jù)庫資源,應(yīng)該允許多個用戶程序并行的存取數(shù)據(jù)。這樣就會產(chǎn)生多個用戶程度并發(fā)地存取同一數(shù)據(jù)的情況。若對并發(fā)操作不加控制就會存取和存儲不正確的數(shù)據(jù),破壞數(shù)據(jù)庫的完整性(這里也稱為一致性)。在多CPU計算機或多計算機網(wǎng)絡(luò)環(huán)境下,并發(fā)控制尤為重要。
(1)事務(wù)的概念 事務(wù)(Transaction)是并發(fā)控制的基本單位。所謂事務(wù)是一個操作序列。這些操作作為一個序列形成一個整體要么都做,要么都不做,是一個不可分割的工作單位。事務(wù)通常以BEGIN TRANSACTION開始,以COMMIT或ROLLBACK操作結(jié)束。COMMIT即提交,提交事務(wù)中所有的操作,事務(wù)正常結(jié)束。ROLLBACK即撤消已作的所有操作,滾回到事務(wù)開始時的狀態(tài)。這里的操作指對數(shù)據(jù)庫的更新操作。滾回即相當于所有操作均未執(zhí)行。事務(wù)和程序是兩個概念。一般地講,一個程序可包括多個事務(wù),由于事務(wù)是并發(fā)控制的基本單位,所以下面的討論均以事務(wù)為對象。
(2)數(shù)據(jù)一致性級別的概念。所謂并發(fā)控制就是要用正確的方式調(diào)度并發(fā)操作,避免造成數(shù)據(jù)的不一致性,使一個用戶事務(wù)的執(zhí)行不受其它事務(wù)的干擾。
4.封鎖
封鎖(Locking)就是事務(wù)T可以向系統(tǒng)發(fā)出請求,對某個數(shù)據(jù)對象(最常用的是記錄)加鎖。于是事務(wù)T對這個數(shù)據(jù)對象就有一定的控制。例如,其它事務(wù)不能更新此數(shù)據(jù)直到T釋放(unlock)它的鎖為止。確切的控制由封鎖的類型決定;镜姆怄i類型有兩種:排它鎖(Exclu sive locks簡記為X鎖)和共享鎖(Share locks簡記為S鎖)。若事務(wù)T對數(shù)據(jù)R加上X鎖,則只允許T讀取和修改R;其它一切事務(wù)對R的任何(包括封鎖)請求都不成功,直至T釋放R上的X鎖為止。這就保證了其它事務(wù)不能再讀取和修改R,直到T釋放X鎖。若事務(wù)T對數(shù)據(jù)R加上S鎖,則其它事務(wù)對R的X鎖請求不能成功,而對R的共享請求可以得到。這就保證了其它事務(wù)以讀取R但不能修改R,直至T釋放S鎖為止。
5.可串行性
定義 當且僅當某組事務(wù)的一定交叉調(diào)度產(chǎn)生的結(jié)果和這些事務(wù)的某一串行調(diào)度的結(jié)果相同,則這個交叉調(diào)度是可串行化的?纱行(Serializability)是并行事務(wù)正確性的準則。這個準則規(guī)定,一給定的交叉調(diào)度,當且僅當它是可串行化的,才認為是正確的。
6.兩段鎖協(xié)議
兩段鎖協(xié)議規(guī)定所有的事務(wù)應(yīng)遵守下列規(guī)則:
(1)在對任何數(shù)據(jù)進行讀、寫操作之前,事務(wù)首先要獲得對該數(shù)據(jù)的封鎖,而且:
(2)在釋放一個封鎖之后,事務(wù)不再獲得任何其它鎖。所謂“兩段”鎖的含義是:事務(wù)分為兩個階段。第一階段是獲得封鎖,也稱為擴展階段。第二階段是釋放封鎖,也稱為收縮階段。定理 若所有事務(wù)均遵守兩段鎖協(xié)議,則這些事務(wù)的所有交叉調(diào)度都是可串行化的(證明略)。為了確保事務(wù)并行執(zhí)行的正確性,許多系統(tǒng)采用兩段鎖協(xié)議。同時系統(tǒng)設(shè)有死鎖檢測機制,發(fā)現(xiàn)死鎖后按一定的算法解除死鎖。
7.恢復
盡管系統(tǒng)中采取了各種保護措施來保證數(shù)據(jù)庫的安全性和完整性不被破壞,保證并行事務(wù)的正確執(zhí)行,但是計算機系統(tǒng)中硬件的故障、軟件的錯誤、操作員的失誤以及故意的破壞仍是不可避免的。這些故障輕則造成運行事務(wù)非正常地中斷,影響數(shù)據(jù)庫中數(shù)據(jù)的正確性,重則破壞數(shù)據(jù)庫,使數(shù)據(jù)庫中全部或部分數(shù)據(jù)丟失。因此數(shù)據(jù)庫管理系統(tǒng)必須具有把數(shù)擾庫從錯誤狀態(tài)恢復到某一已知的正確狀態(tài)(亦稱為完整狀態(tài)或一致狀態(tài))的功能,這就是數(shù)據(jù)庫的恢復;謴妥酉到y(tǒng)是數(shù)據(jù)庫管理系統(tǒng)的一個重要組成部分,而且還相當龐大,常常占整個系統(tǒng)代碼的10%以上(如IMS,DB2)。故障恢復是否考慮周到和行之有效,是數(shù)據(jù)庫系統(tǒng)性能的一個重要指標。大型的數(shù)據(jù)庫應(yīng)用對故障恢復的要求更加強烈。有時甚至采用雙工制。
(1)故障的種類數(shù)據(jù)庫系統(tǒng)中可能發(fā)生各種各樣的故障,大致可以分以下幾類:①事務(wù)內(nèi)部的故障;②系統(tǒng)范圍內(nèi)的故障;③介質(zhì)故障;④計算機病毒。
(2)轉(zhuǎn)儲和恢復轉(zhuǎn)儲是數(shù)據(jù)庫恢復中經(jīng)常采用的基本技術(shù)。所謂轉(zhuǎn)儲即DBA定期地將整個數(shù)據(jù)庫復制到磁帶或另一個磁盤上保存起來的過程。這些備用的數(shù)據(jù)文本為后備副本或后援副本。當數(shù)據(jù)庫遭到破壞后就可以利用后備副本把數(shù)據(jù)庫恢復。這時,數(shù)據(jù)庫只能恢復到轉(zhuǎn)儲時的狀態(tài),從那以后的所有更新事務(wù)必須重新運行才能恢復到現(xiàn)時的正常狀態(tài)。轉(zhuǎn)儲是十分耗費時間和資源的,不能頻繁進行。DBA應(yīng)該根據(jù)數(shù)據(jù)庫使用情況確定一個適當?shù)霓D(zhuǎn)儲周期。轉(zhuǎn)儲可分為靜態(tài)轉(zhuǎn)儲和動態(tài)轉(zhuǎn)儲。靜態(tài)轉(zhuǎn)儲是指轉(zhuǎn)儲期間不允許(或不存在)對數(shù)據(jù)庫進行任何存取、修改活動。動態(tài)轉(zhuǎn)儲是指轉(zhuǎn)儲期間允許對數(shù)據(jù)庫進行存取或修改。即轉(zhuǎn)儲和用戶事務(wù)可以并發(fā)執(zhí)行。靜態(tài)轉(zhuǎn)儲簡單,但轉(zhuǎn)儲必須等待用戶事務(wù)結(jié)束才能進行。同樣,新的事務(wù)必須等待轉(zhuǎn)儲結(jié)束才能執(zhí)行。顯然,這會降低數(shù)據(jù)庫的可用性。動態(tài)轉(zhuǎn)儲可克服靜態(tài)轉(zhuǎn)儲的缺點。但是,轉(zhuǎn)儲結(jié)束時后援副本上的數(shù)據(jù)并不能保證正確有效。例如,在轉(zhuǎn)儲期間的某時刻t 1 系統(tǒng)把數(shù)據(jù)A=100轉(zhuǎn)儲到了磁帶上,而在時刻t 2 ,某一事務(wù)對A進行了修改使A=200轉(zhuǎn)儲結(jié)束,后援副本上的A已是過時的數(shù)據(jù)了。為此,必須把轉(zhuǎn)儲期間事務(wù)對數(shù)據(jù)庫的修改活動登記下來,建立日志文件(log file)。這樣,后援副本加上日志文件就能把數(shù)據(jù)庫恢復到某一時刻的正確狀態(tài)。轉(zhuǎn)儲還可以分為海量轉(zhuǎn)儲和增量轉(zhuǎn)儲。海量轉(zhuǎn)儲是指每次轉(zhuǎn)儲全部數(shù)據(jù)庫。增量轉(zhuǎn)儲則指每次只轉(zhuǎn)儲上次轉(zhuǎn)儲后更新過的數(shù)據(jù)。如果數(shù)據(jù)庫很大,事務(wù)處理又十分頻繁,則增量轉(zhuǎn)儲方式是很有效的。(3)日志文件日志文件是用來記錄對數(shù)據(jù)庫每一次更新活動的文件。在動態(tài)轉(zhuǎn)儲方式中必須建立日志文件,后援副本和日志文件綜合起來才能有效地恢復數(shù)據(jù)庫。在靜態(tài)轉(zhuǎn)儲方式中,也可以建立日志文件。當數(shù)據(jù)庫毀壞后可重新裝放后援副本把數(shù)據(jù)庫恢復到轉(zhuǎn)儲結(jié)束時刻的正確狀態(tài),然后利用日志文件,把已完成的事務(wù)進行重做處理,對故障發(fā)生時尚未完成的事務(wù)進行撤消處理。這樣不必重新運行那些在轉(zhuǎn)儲前已完成的事務(wù)程序就可把數(shù)據(jù)庫恢復到故障前某一時刻的正確狀態(tài)。
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |