天天看點

《資料庫原理與應用(第3版)》——1.2 資料管理技術的發展

本節書摘來自華章出版社《資料庫原理與應用(第3版)》一 書中的第1章,第1.2節,作者:何玉潔,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

資料庫技術是應資料管理任務的需要而産生和發展的。資料管理包括對資料進行分類、組織、編碼、存儲、檢索和維護,是資料處理的核心,而資料處理則是對各種資料進行收集、存儲、加工和傳播等一系列活動的總和。

自計算機産生之後,人們就希望用它來幫助我們對資料進行存儲和管理。最初對資料的管理是以檔案方式進行的,也就是通過編寫應用程式來實作對資料的存儲和管理。後來,随着資料量越來越大,人們對資料的要求越來越多,希望達到的目的也越來越複雜,檔案管理方式已經很難滿足人們對資料的需求,由此産生了資料庫技術,也就是用資料庫來存儲和管理資料。資料管理技術的發展是以也就經曆了檔案管理和資料庫管理兩個階段。

本節介紹檔案管理方式和資料庫管理方式在資料管理上的主要差别。

了解今日資料庫特征的最好辦法是了解在資料庫技術産生之前,人們是如何通過檔案的方式對資料進行管理的。

20世紀50年代後期到60年代中期,計算機的硬體方面已經有了磁盤等直接存取的儲存設備,在軟體方面,作業系統中已經有了專門的資料管理軟體,一般稱為檔案管理系統。檔案管理系統把資料組織成互相獨立的資料檔案,利用“按檔案名通路,按記錄進行存取”的管理技術,可以對檔案中的資料進行修改、插入和删除等操作。

在出現程式設計語言之後,開發人員不但可以建立自己的檔案并将資料儲存在自己定義的檔案中,而且還可以通過編寫應用程式的方式來處理檔案中的資料,即編寫應用程式來定義檔案的結構,實作對檔案内容的插入、删除、修改和查詢操作。當然,真正實作磁盤檔案的實體存取操作的還是作業系統中的檔案管理系統,應用程式隻是告訴檔案管理系統對哪個檔案的哪些資料進行哪些操作。我們将由開發人員定義存儲資料的檔案及檔案結構,并借助檔案管理系統的功能編寫通路這些檔案的應用程式,以實作對使用者資料的處理的方式稱為檔案管理。為叙述簡單,在本章後面的讨論中将忽略檔案管理系統,假定應用程式是直接對磁盤檔案進行操作的。

如果用檔案管理資料,使用者必須編寫應用程式來管理存儲在檔案中的資料,其操作模式如圖1-2所示。

假設某學校要用檔案的方式儲存學生及其選課的資料,并在這些資料檔案基礎之上建構對學生進行管理的系統。此系統主要實作兩部分功能:學生基本資訊管理和學生選課情況管理。假設教務部門管理學生選課情況,各系部管理學生基本資訊。學生基本資訊管理中涉及學生的基本資訊資料,假設這些資料儲存在f1檔案中;學生選課情況管理涉及學生的部分基本資訊、課程基本資訊和學生選課資訊。假設用f2和f3檔案分别儲存課程基本資訊和學生選課資訊的資料。

設a1為實作“學生基本資訊管理”功能的應用程式,a2為實作“學生選課管理”功能的應用程式。由于學生選課管理中要用到f1檔案中的一些資料,為減少備援,它将使用“學生基本資訊管理”(即f1檔案)中的資料,如圖1-3所示(圖中省略了作業系統部分)。

《資料庫原理與應用(第3版)》——1.2 資料管理技術的發展

假設f1、f2和f3檔案分别包含如下資訊:

f1檔案——學号、姓名、性别、出生日期、聯系電話、所在系、專業、班号。

f2檔案——課程号、課程名、授課學期、學分、課程性質。

f3檔案——學号、姓名、所在系、專業、課程号、課程名、修課類型、修課時間、考試成績。

我們将檔案中所包含的每一個子項稱為檔案結構中的“字段”或“列”,将每一行資料稱為一個“記錄”。

“學生選課管理”的處理過程大緻為:在學生選課管理中,若有學生選課,則先查f1檔案,判斷有無此學生;若有,則再通路f2檔案,判斷其所選的課程是否存在;若一切符合規則,就将學生選課資訊寫到f3檔案中。

這看似很好,但仔細分析一下,就會發現直接用檔案管理資料有如下缺點。

(1)編寫應用程式不友善

應用程式編寫者必須清楚地了解所用檔案的邏輯及實體結構,如檔案中包含多少個字段,每個字段的資料類型,采用何種邏輯結構和實體存儲結構。作業系統隻提供了打開、關閉、讀、寫等幾個底層的檔案操作指令,而對檔案的查詢、修改等處理都必須在應用程式中程式設計實作。這樣就容易造成各應用程式在功能上的重複,比如圖1-3中的“學生基本資訊管理”和“學生選課管理”都要對f1檔案進行操作,而共享這兩個功能相同的操作卻很難。

(2)資料備援不可避免

由于a2應用程式需要在學生選課資訊檔案(f3檔案)中包含學生的一些基本資訊,比如學号、姓名、所在系、專業等,而這些資訊同樣包含在學生資訊檔案(f1檔案)中,是以f3檔案和f1檔案中存在相同資料,進而造成資料的重複,稱為資料備援。

資料備援所帶來的問題不僅僅是存儲空間的浪費(其實,随着計算機硬體技術的飛速發展,存儲容量不斷擴大,空間問題已經不是我們關注的主要問題),更為嚴重的是造成了資料的不一緻(inconsistency)。例如,某個學生所學的專業發生了變化,我們一般隻會想到在f1檔案中進行修改,而往往忘記了在f3中應進行同樣的修改。由此就造成了同一名學生在f1檔案和f3檔案中的“專業”不一樣,也就是資料不一緻。人們不能判定哪個資料是正确的,尤其是當系統中存在多處資料備援時,更是如此。這樣資料就失去了可信性。

檔案本身并不具備維護資料一緻性的功能,這些功能完全要由使用者(應用程式開發者)負責維護。這在簡單的系統中還可以勉強應付,但在複雜的系統中,若讓應用程式開發者來保證資料的一緻性,幾乎是不可能的。

(3)應用程式依賴性

就檔案管理而言,應用程式對資料的操作依賴于存儲資料的檔案結構。檔案和記錄的結構通常是應用程式代碼的一部分,如c程式的struct。檔案結構的每一次修改,比如添加字段、删除字段,甚至修改字段的長度(如電話号碼從7位擴充到8位),都将導緻應用程式的修改,因為在打開檔案進行資料讀取時,必須将檔案記錄中不同字段的值對應到應用程式的變量中。随着應用環境和需求的變化,修改檔案的結構不可避免,這些都需要在應用程式中作相應的修改,而(頻繁)修改應用程式是很麻煩的。人們首先要熟悉原有程式,修改後還需要對程式進行測試、安裝等;甚至在隻是修改了檔案的存儲位置或者檔案名的情況下,也需要對應用程式進行修改,這顯然會給程式維護人員帶來很多麻煩。

所有這些都是由于應用程式對檔案結構以及檔案實體特性的過分依賴造成的,換句話說,用檔案管理資料時,其資料獨立性(data independence)很差。

(4)不支援對檔案的并發通路

在現代計算機系統中,為了有效利用計算機資源,一般都允許同時運作多個應用程式(尤其是在多任務作業系統環境中)。檔案最初是作為程式的附屬資料出現的,它一般不支援多個應用程式同時對同一個檔案進行通路。回憶一下,某個使用者打開了一個excel檔案,當第二個使用者在第一個使用者未關閉此檔案前打開此檔案時,會得到什麼資訊呢?他隻能以隻讀方式打開此檔案,而不能在第一個使用者打開的同時對此檔案進行修改。再回憶一下,如果用某種程式設計語言編寫一個對某檔案内容進行修改的程式,其過程是先以寫的方式打開檔案,然後修改其内容,最後再關閉檔案。在關閉檔案之前,不管是在其他的程式中,還是在同一個程式中都不允許再次打開此檔案,這就是檔案管理方式不支援并發通路的含義所在。

對于以資料為中心的系統來說,必須要支援多個使用者對資料的并發通路,否則就不會有我們現在這麼多的火車或飛機的訂票點,也不會有這麼多的銀行營業網點。

(5)資料間聯系弱

當用檔案管理資料時,檔案與檔案之間是彼此獨立、毫不相幹的,檔案之間的聯系必須通過程式設計來實作。比如上述的f1檔案和f3檔案,f3檔案中的學号、姓名等學生的基本資訊必須是f1檔案中已經存在的(即選課的學生必須是已經存在的學生);同樣,f3檔案中課程号等與課程有關的基本資訊也必須存在于f2檔案中(即學生選的課程也必須是已經存在的課程)。這些資料之間的聯系是實際應用當中所要求的很自然的聯系,但檔案本身不具備自動實作這些聯系的功能,我們必須通過編寫應用程式,即手工地建立這些聯系。這不但增加了編寫代碼的工作量和複雜度,而且當聯系很複雜時,也難以保證其正确性。是以,用檔案管理資料時很難反映現實世界事物間客觀存在的聯系。

(6)難以滿足不同使用者對資料的需求

不同的使用者(資料使用者)關注的資料往往不同。例如對于學生基本資訊,負責配置設定學生宿舍的部門可能隻關心學生的學号、姓名、性别和班号,而教務部門可能關心的是學号、姓名、所在系和專業。

若多個不同使用者希望看到的是不同的基本資訊,就需要為每個使用者單獨建立一個檔案,這勢必造成更多的資料備援。而我們希望的是,使用者關心哪些資訊就為他生成哪些資訊,将使用者不關心的資料屏蔽,使使用者感覺不到其他資訊的存在。

可能還會有一些使用者,其所需要的資訊來自于多個不同的檔案,例如,假設各班班主任關心的是班号、學号、姓名、課程名、學分、考試成績等。這些資訊涉及了三個檔案:從f1檔案中得到“班号”,從f2檔案中得到“學分”,從f3檔案中得到“考試成績”;而“學号”和“姓名”可以從f1檔案或f3檔案中得到,“課程名”可以從f2檔案或f3檔案中得到。在生成結果資料時,必須對從三個檔案中讀取的資料進行比較,然後組合成一行有意義的資料。比如,将從f1檔案中讀取的學号與從f3檔案中讀取的學号進行比較,學号相同時,才可以将f1檔案中的“班号”與f3檔案中的目前記錄所對應的學号和姓名組合起來。之後,還需要将組合結果與f2檔案中的内容進行比較,找出課程号相同的課程的學分,再與已有的結果組合起來。然後再從組合後的資料中提取出使用者需要的資訊。如果資料量很大,涉及的檔案比較多時,我們可以想象這個過程有多複雜。是以,這種大容量複雜資訊的查詢,在按檔案管理資料的方式中是很難處理的。

(7)無安全控制功能

在檔案管理方式中,很難控制某個人對檔案能夠進行的操作,比如隻允許某個人查詢和修改資料,但不能删除資料,或者對檔案中的某個或者某些字段不能修改等。而在實際應用中,資料的安全性是非常重要且不可忽視的。比如,在學生選課管理中,我們不允許學生修改其考試成績;在銀行系統中,更是不允許一般使用者修改其存款數額。

随着人們對資料需求的增加,迫切需要對資料進行有效、科學、正确、友善的管理。針對檔案管理方式的這些缺陷,人們逐漸開發出了以統一管理和共享資料為主要特征的資料庫管理系統。

自20世紀60年代末以來,計算機管理資料的規模越來越大,應用範圍越來越廣泛,資料量急劇增加,多種應用同時共享資料集合的要求也越來越強烈。

随着大容量磁盤的出現,硬體價格不斷下降,軟體價格不斷上升,編制和維護系統軟體和應用程式的成本相應地不斷增加。在資料處理方式上,對聯機實時處理的要求越來越多,同時開始提出和考慮分布式處理技術。在這種背景下,以檔案方式管理資料已經不能滿足應用的需求,于是出現了新的管理資料的技術——資料庫技術,同時出現了統一管理資料的專門軟體——資料庫管理系統。

從1.2.1節的介紹我們可以看到,在資料庫管理系統出現之前,人們對資料的操作是直接針對資料檔案編寫應用程式實作的,這種模式會産生很多問題。在有了資料庫管理系統之後,人們對資料的操作全部是通過資料庫管理系統實作的,而且應用程式的編寫也不再直接針對存放資料的檔案。有了資料庫技術和資料庫管理系統軟體之後,人們對資料的操作模式發生了根本性的變化,如圖1-4所示。

比較圖1-2和圖1-4,可以看到主要差別有兩個:第一,是在作業系統和使用者應用程式之間增加了一個系統軟體——資料庫管理系統,使得使用者對資料的操作都是通過資料庫管理系統實作的;第二,有了資料庫管理系統之後,使用者不再需要有資料檔案的概念,即不再需要知道資料檔案的邏輯和實體結構及實體存儲位置,而隻需要知道存放資料的場所——資料庫即可。

從本質上講,即使在有了資料庫技術之後,資料最終還是以檔案的形式存儲在磁盤上,隻是這時對實體資料檔案的存取和管理是由資料庫管理系統統一實作的,而不是由每個使用者通過應用程式程式設計實作。資料庫和資料檔案既有差別又有聯系,它們之間的關系類似于機關的名稱和位址之間的關系。機關位址代表了機關的實際存在位置,機關名稱是機關的邏輯代表。而且一個資料庫可以包含多個資料檔案,就像一個機關可以有多個不同的位址一樣(我們現在的很多大學,都是一個學校有多個校址),每個資料檔案存儲資料庫的部分資料。不管一個資料庫包含多少個資料檔案,對使用者來說,他隻針對資料庫進行操作,而無需對資料檔案進行操作。這種模式極大地簡化了使用者對資料的通路。

在有了資料庫技術之後,使用者隻需要知道資料庫的名字,就可以對資料庫對應的資料檔案中的資料進行操作。而将對資料庫的操作轉換為對實體資料檔案的操作是由資料庫管理系統自動實作的,使用者不需要知道,也不需要幹預。

對于1.2.1節中介紹的學生基本資訊管理和學生選課管理兩個子系統,如果使用資料庫技術來管理,其實作方式如圖1-5所示。

《資料庫原理與應用(第3版)》——1.2 資料管理技術的發展

與檔案管理相比,資料庫管理具有以下優點。

(1)互相關聯的資料集合

在資料庫系統中,所有相關的資料都存儲在一個稱為資料庫的環境中,它們作為一個整體定義。比如學生基本資訊管理中的“學号”與學生選課管理中的“學号”,這兩個學号之間是有關聯關系的,即學生選課管理中的“學号”的取值範圍在學生基本資訊管理的“學号”取值範圍内。在關系資料庫中,資料之間的關聯關系是通過定義外鍵實作的。

(2)較少的資料備援

由于資料是統一管理的,是以可以從全局着眼,合理地組織資料。例如,将1.2.1節中檔案f1、f2和f3的重複資料挑選出來,進行合理的管理,就可以形成如下所示的幾部分資訊。

學生基本資訊:學号、姓名、性别、出生日期、聯系電話、所在系、專業、班号。

課程基本資訊:課程号、課程名、授課學期、學分、課程性質。

學生選課資訊:學号、課程号、修課類型、修課時間、考試成績。

在關系資料庫中,可以将每一類資訊存儲在一個表中(關系資料庫的概念将在第2章介紹),重複的資訊隻存儲一份,當在學生選課管理中需要學生的姓名等其他資訊時,根據學生選課管理中的學号,可以很容易地在學生基本資訊中找到此學号對應的姓名等資訊。是以,消除資料的重複存儲不影響對資訊的提取,同時還可以避免由于資料重複存儲而造成的資料不一緻問題。比如,當某個學生所學的專業發生變化時,隻需在“學生基本資訊”中進行修改即可。

同1.2.1節中的問題一樣,當所需的資訊來自不同地方,比如(班号,學号,姓名,課程名,學分,考試成績),這些資訊需要從3個地方(關系資料庫為3張表)得到,這種情況下,也需要對資訊進行适當的組合,即學生選課資訊中的學号隻能與學生基本資訊中學号相同的資訊組合在一起,同樣,學生選課資訊中的課程号也必須與課程基本資訊中課程号相同的資訊組合在一起。過去在檔案管理方式中,這個工作是由開發者程式設計實作的,而現在有了資料庫管理系統,這些煩瑣的工作完全交給了資料庫管理系統來完成。

是以,在資料庫管理系統中,避免資料備援不會增加開發者的負擔。在關系資料庫中,避免資料備援是通過關系規範化理論實作的。

(3)程式與資料互相獨立

在資料庫中,資料所包含的所有資料項以及資料的存儲格式都與資料存儲在一起,它們通過dbms而不是應用程式來操作和管理,應用程式不再需要處理檔案和記錄的格式。

程式與資料互相獨立有兩方面的含義。一方面是當資料的存儲方式發生變化時(這裡包括邏輯存儲方式和實體存儲方式),比如從連結清單結構改為散清單結構,或者是順序和非順序之間的轉換,應用程式不必作任何修改。另一方面是當資料的邏輯結構發生變化時,比如增加或減少了一些資料項,如果應用程式與這些修改的資料項無關,則不用修改應用程式。這些變化都将由dbms負責維護。大多數情況下,應用程式并不知道也不需要知道資料存儲方式或資料項已經發生了變化。

在關系資料庫中,資料庫管理系統可以自動保證程式與資料互相獨立。

(4)保證資料的安全和可靠

資料庫技術能夠保證資料庫中的資料是安全和可靠的。它的安全控制機制可以有效地防止資料庫中的資料被非法使用和非法修改;其完整的備份和恢複機制可以保證當資料遭到破壞時(由軟體或硬體故障引起的)能夠很快地将資料庫恢複到正确的狀态,并使資料不丢失或隻有很少的丢失,進而保證系統能夠連續、可靠地運作。保證資料的安全是通過資料庫管理系統的安全控制機制實作的,保證資料的可靠是通過資料庫管理系統的備份和恢複機制實作的。

(5)最大限度地保證資料的正确性

資料的正确性(也稱為資料的完整性)是指存儲到資料庫中的資料必須符合現實世界的實際情況,比如人的性别隻能是“男”和“女”,人的年齡應該在0~150歲之間(假設沒有年齡超過150歲的人)。如果在性别中輸入了其他值,或者将一個負數輸入到年齡中,在現實世界中顯然是不對的。資料的正确性是通過在資料庫中建立限制來實作的。當建立好保證資料正确的限制之後,如果有不符合限制的資料存儲到資料庫中,資料庫管理系統能主動拒絕這些資料。

(6)資料可以共享并能保證資料的一緻性

資料庫中的資料可以被多個使用者共享,即允許多個使用者同時操作相同的資料。當然,這個特點是針對支援多使用者的大型資料庫管理系統而言的,對于隻支援單使用者的小型資料庫管理系統(比如access),在任何時候最多隻有一個使用者通路資料庫,是以不存在共享的問題。

多使用者共享問題是資料庫管理系統内部解決的問題,它對使用者是不可見的。這就要求資料庫能夠對多個使用者進行協調,保證多個使用者之間對資料的操作不會産生沖突和沖突,即在多個使用者同時使用資料庫時,能夠保證資料的一緻性和正确性。設想一下火車訂票系統,如果多個訂票點同時對某一天的同一列火車進行訂票,那麼必須保證不同訂票點訂出票的座位不能重複。

資料可共享并能保證共享資料的一緻性是由資料庫管理系統的并發控制機制實作的。

到今天,資料庫技術已經發展成為一門比較成熟的技術,通過上述讨論,我們可以概括出資料庫具備如下特征:資料庫是互相關聯的資料的集合,它用綜合的方法組織資料,具有較小的資料備援,可供多個使用者共享,具有較高的資料獨立性,具有安全控制機制,能夠保證資料的安全、可靠,允許并發地使用資料庫,能有效、及時地處理資料,并能保證資料的一緻性和正确性。

需要強調的是,所有這些特征并不是資料庫中的資料固有的,而是靠資料庫管理系統提供和保證的。