本節書摘來自異步社群出版社《你不可不知的關系資料庫理論》一書中的第1章,第1.2節,作者:【美】c.j.date,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
從現在開始,每當我提到“給出一個典型的資料庫”,如圖1.1所示,意味着給出一個如使用者想象的那樣的資料庫(有時稱之為邏輯資料庫[logical database])。邏輯資料庫與實體資料庫是相對而言的,實體資料庫是被資料庫管理系統(dbms,database management system)所了解的(即它是實際存儲在計算機中的資料)。是以,需要進一步強調的是,這裡所謂的邏輯和實體資料庫并不是兩個完全不同的事情,相反,它們是從不同視角來看待的同一事情,如圖1.2所示。

從圖1.2可以看出,dbms(即管理資料庫的軟體)作為系統邏輯層和實體層之間的一個媒介,可以有效地提供以下服務:使用者向資料庫送出請求的格式可以依據邏輯資料庫的形式來辨別,然後依據對應的實體資料庫,dbms會一一實作這些請求。
dbms提供的一個通用功能就是向使用者隐藏系統實體級别的實作細節(大多數的程式設計語言也是在實體級别向使用者隐藏實作細節),換句話說,dbms給使用者提供了一個更抽象的資料庫概念,相比實體資料庫級别而言,這種方式會更友好。例如:以實際存儲在系統中的方式來表示資料庫概念3。
現在我們知道了dbms是一個複雜的軟體,它包含很多構件。但是有一個構件我現在必須提一下,因為它是這本書的主題,它就是優化器(optimizer)。優化器是dbms的構件之一,其主要職責是決定如何正确執行使用者的請求。大多數請求(實際上幾乎是所有的請求)都能夠通過各種不同的方法來實作。而且,這些不同的方法一般在性能特點上有很大差別。特别是在執行時間上它們确實有很大差別,可以從幾微秒到幾天。因而,對于優化器來說,選擇一個“好”方法去實作特定的請求是非常重要的,這裡的“好”實際上是指好的性能(good performance)。
前文中存在一個直接而且重要的暗示就是假設優化器能很好地發揮它的作用,使用者根本不必考慮性能的問題。但有一個事實我必須在這裡聲明一下(這是突然在我腦海中閃現的一個想法),記錄一直是關系模型中的一個主要目标,性能問題應該是系統所擔憂的,而不是使用者應該關心的。從某種程度上來說,如果這個目标沒有達到,就說明系統是失敗的(或者确切地說,至少是不成功的)。
邏輯資料庫和實體資料庫是有差別的,要嚴格進行區分,但這個事實也允許我們實作一個重要的目标,就是資料獨立性(data independence)。資料獨立性(順便說一下,這其實不是一個很恰當的資料,但似乎我們也隻能堅持使用它)意味着我們可以随意改變資料在系統中的存儲和通路方式,而對于使用者看到的資料庫卻不需要做任何相應的變化。其實我們可能想改變資料庫存儲或通路方式的原因就是性能(performance)。我們做這樣的改變而不用去修改使用者看到的資料庫,這意味着已存在的一些應用程式、查詢等都可以在變化之後仍然按照原來的方式工作。是以,非常重要的一點是資料獨立性可以保護已存在的資産,這些資産可以存在于已有的應用程式、使用者教育訓練、資料庫設計或者其他事情中。
再重複一下,dbms是邏輯資料庫和實體資料庫之間的一個媒介。換句話說,它支援通向資料庫的接口(interface)(在本書中的其他地方,我一直不加限制地使用資料庫[database]來專門表示邏輯資料庫,除非在上下文環境中另有要求)。是以,dbms 的主要職責包括:(a)負責接收使用者請求,這些請求可以是查詢或者修改,具體形式要根據邏輯資料庫的要求來決定;(b)通過解釋或執行的方式對這些請求做出響應,換句話說,就是根據實體資料庫的形式來執行這些請求。注意:在極少的情況下4,術語修改(update)一般用來指的是插入新資料、删除或修改已存在的資料等這類請求。
是以,dbms可以“保護使用者已有的資料”(例如,可以保護資料在系統内部真正的存儲形式等細節)。我們可以有些得意地說,它保護了使用者資料。但是我的真正意思是,它提供了安全性(security)、并發性(concurrency)、完整性(integrity)和恢複等(recovery)控制。簡要說明如下。
安全控制:用來保證使用者請求的合法性。即有疑問的使用者正在請求一個操作,允許他或她來操作有權利通路的資料。例如,在供應商和零件資料庫中,某些使用者可能不會被允許檢視供應商狀态資料;某些使用者可能根本就不允許檢視供應商表;某些使用者可以被允許檢視倫敦的供應商,但不允許檢視其他城市的供應商;某些使用者可以被允許檢索供應商資訊但不允許修改,等等。簡而言之,必須限制使用者執行那些他們允許被執行的操作。注意:安全當然是很重要的,但對安全控制的更多細節介紹已經超出了本書的範圍(在第7章中将給出一個簡短的描述)。
并發控制:就是要處理同一時間可能會有多個使用者使用同一資料庫的問題。假設你要查詢資料庫中是否有供應商s1供應的商品,得到肯定回答後繼續提問供應的零件數量平均值是多少,當被告知根本沒有這樣的供應關系時,這是一個讓人很讨厭的事情。推測一下,可能是因為一些其他使用者删除了這些資料。并發控制的目的就是要處理這樣的問題,我将在本書的第二部分對其進行詳細講解。
完整性控制:就是要保證資料庫中的資料是正确的(因為在某種程度上提供這樣的保證是可能的)。例如,要向供應關系的表中插入一條供應商s6的供應關系記錄,如果供應商表中沒有s6供應商,則這個請求一定會被拒絕。同樣,要把供應商s1的狀态值修改為200時,如果這個狀态值規定不能超過100,則這個請求也會被拒絕。這些例子還不足以說明完整性控制是相當重要的,我将在第3章和第6章中對其進行詳細講解(在第13章也會涉及完整性控制)。
恢複控制:就是假設資料庫從不會忘記任何事情,它會一直記得所有的事情。也就是說,一旦資料被插入到資料庫中,就再也不會被删除了(除非使用者有特别明确的要求),即使發生一些失敗的操作,如系統被破壞或者磁盤被破壞。我将在本書的第二部分對其進行講解。
最後,關于dbms,我還要說一件事情。從我前面講解的每一件事情中可以看出,有一點是相當清楚的,那就是資料庫之間的邏輯結構是有差別的,它是存儲資料的倉庫,而dbms是管理這個倉庫的軟體。不幸的是,在資料庫領域使用術語資料庫(database)表示dbms已經很普遍了5,但我想強調的是,這個術語已經非常非常普通了,在本書中我不會再采用此種說法。因為如果要把dbms稱為資料庫,那真正的資料庫又是什麼呢,這是個問題。