apache wordpress mysql 微软 php Android 程序员 shell Ubuntu Python google centos Windows linux 开源 云计算 nginx java Firefox 编程

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

1.2 數據管理技術的發展

數據庫技術是應數據管理任務的需要而產生和發展的。數據管理包括對數據進行分類、組織、編碼、存儲、檢索和維護,是數據處理的核心,而數據處理則是對各種數據進行收集、存儲、加工和傳播等一系列活動的總和。
自計算機產生之後,人們就希望用它來幫助我們對數據進行存儲和管理。最初對數據的管理是以文件方式進行的,也就是通過編寫應用程序來實現對數據的存儲和管理。後來,隨著數據量越來越大,人們對數據的要求越來越多,希望達到的目的也越來越復雜,文件管理方式已經很難滿足人們對數據的需求,由此產生了數據庫技術,也就是用數據庫來存儲和管理數據。數據管理技術的發展因此也就經歷了文件管理和數據庫管理兩個階段。
本節介紹文件管理方式和數據庫管理方式在數據管理上的主要差別。

1.2.1 文件管理

理解今日數據庫特征的最好辦法是了解在數據庫技術產生之前,人們是如何通過文件的方式對數據進行管理的。
20世紀50年代後期到60年代中期,計算機的硬件方面已經有了磁盤等直接存取的存儲設備,在軟件方面,操作系統中已經有了專門的數據管理軟件,一般稱為文件管理系統。文件管理系統把數據組織成相互獨立的數據文件,利用“按文件名訪問,按記錄進行存取”的管理技術,可以對文件中的數據進行修改、插入和刪除等操作。
在出現程序設計語言之後,開發人員不但可以創建自己的文件並將數據保存在自己定義的文件中,而且還可以通過編寫應用程序的方式來處理文件中的數據,即編寫應用程序來定義文件的結構,實現對文件內容的插入、刪除、修改和查詢操作。當然,真正實現磁盤文件的物理存取操作的還是操作系統中的文件管理系統,應用程序只是告訴文件管理系統對哪個文件的哪些數據進行哪些操作。我們將由開發人員定義存儲數據的文件及文件結構,並借助文件管理系統的功能編寫訪問這些文件的應用程序,以實現對用戶數據的處理的方式稱為文件管理。為敘述簡單,在本章後面的討論中將忽略文件管理系統,假定應用程序是直接對磁盤文件進行操作的。
如果用文件管理數據,用戶必須編寫應用程序來管理存儲在文件中的數據,其操作模式如圖1-2所示。
假設某學校要用文件的方式保存學生及其選課的數據,並在這些數據文件基礎之上構建對學生進行管理的系統。此系統主要實現兩部分功能:學生基本信息管理和學生選課情況管理。假設教務部門管理學生選課情況,各系部管理學生基本信息。學生基本信息管理中涉及學生的基本信息數據,假設這些數據保存在F1文件中;學生選課情況管理涉及學生的部分基本信息、課程基本信息和學生選課信息。假設用F2和F3文件分別保存課程基本信息和學生選課信息的數據。
設A1為實現“學生基本信息管理”功能的應用程序,A2為實現“學生選課管理”功能的應用程序。由於學生選課管理中要用到F1文件中的一些數據,為減少冗余,它將使用“學生基本信息管理”(即F1文件)中的數據,如圖1-3所示(圖中省略了操作系統部分)。

screenshot

假設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)無安全控制功能
在文件管理方式中,很難控制某個人對文件能夠進行的操作,比如只允許某個人查詢和修改數據,但不能刪除數據,或者對文件中的某個或者某些字段不能修改等。而在實際應用中,數據的安全性是非常重要且不可忽視的。比如,在學生選課管理中,我們不允許學生修改其考試成績;在銀行系統中,更是不允許一般用戶修改其存款數額。
隨著人們對數據需求的增加,迫切需要對數據進行有效、科學、正確、方便的管理。針對文件管理方式的這些缺陷,人們逐步開發出了以統一管理和共享數據為主要特征的數據庫管理系統。

1.2.2 數據庫管理

自20世紀60年代末以來,計算機管理數據的規模越來越大,應用範圍越來越廣泛,數據量急劇增加,多種應用同時共享數據集合的要求也越來越強烈。
隨著大容量磁盤的出現,硬件價格不斷下降,軟件價格不斷上升,編制和維護系統軟件和應用程序的成本相應地不斷增加。在數據處理方式上,對聯機實時處理的要求越來越多,同時開始提出和考慮分布式處理技術。在這種背景下,以文件方式管理數據已經不能滿足應用的需求,於是出現了新的管理數據的技術——數據庫技術,同時出現了統一管理數據的專門軟件——數據庫管理系統。
從1.2.1節的介紹我們可以看到,在數據庫管理系統出現之前,人們對數據的操作是直接針對數據文件編寫應用程序實現的,這種模式會產生很多問題。在有了數據庫管理系統之後,人們對數據的操作全部是通過數據庫管理系統實現的,而且應用程序的編寫也不再直接針對存放數據的文件。有了數據庫技術和數據庫管理系統軟件之後,人們對數據的操作模式發生了根本性的變化,如圖1-4所示。
比較圖1-2和圖1-4,可以看到主要區別有兩個:第一,是在操作系統和用戶應用程序之間增加了一個系統軟件——數據庫管理系統,使得用戶對數據的操作都是通過數據庫管理系統實現的;第二,有了數據庫管理系統之後,用戶不再需要有數據文件的概念,即不再需要知道數據文件的邏輯和物理結構及物理存儲位置,而只需要知道存放數據的場所——數據庫即可。
從本質上講,即使在有了數據庫技術之後,數據最終還是以文件的形式存儲在磁盤上,只是這時對物理數據文件的存取和管理是由數據庫管理系統統一實現的,而不是由每個用戶通過應用程序編程實現。數據庫和數據文件既有區別又有聯系,它們之間的關系類似於單位的名稱和地址之間的關系。單位地址代表了單位的實際存在位置,單位名稱是單位的邏輯代表。而且一個數據庫可以包含多個數據文件,就像一個單位可以有多個不同的地址一樣(我們現在的很多大學,都是一個學校有多個校址),每個數據文件存儲數據庫的部分數據。不管一個數據庫包含多少個數據文件,對用戶來說,他只針對數據庫進行操作,而無需對數據文件進行操作。這種模式極大地簡化了用戶對數據的訪問。
在有了數據庫技術之後,用戶只需要知道數據庫的名字,就可以對數據庫對應的數據文件中的數據進行操作。而將對數據庫的操作轉換為對物理數據文件的操作是由數據庫管理系統自動實現的,用戶不需要知道,也不需要幹預。
對於1.2.1節中介紹的學生基本信息管理和學生選課管理兩個子系統,如果使用數據庫技術來管理,其實現方式如圖1-5所示。

screenshot

與文件管理相比,數據庫管理具有以下優點。
(1)相互關聯的數據集合
在數據庫系統中,所有相關的數據都存儲在一個稱為數據庫的環境中,它們作為一個整體定義。比如學生基本信息管理中的“學號”與學生選課管理中的“學號”,這兩個學號之間是有關聯關系的,即學生選課管理中的“學號”的取值範圍在學生基本信息管理的“學號”取值範圍內。在關系數據庫中,數據之間的關聯關系是通過定義外鍵實現的。
(2)較少的數據冗余
由於數據是統一管理的,因此可以從全局著眼,合理地組織數據。例如,將1.2.1節中文件F1、F2和F3的重復數據挑選出來,進行合理的管理,就可以形成如下所示的幾部分信息。
學生基本信息:學號、姓名、性別、出生日期、聯系電話、所在系、專業、班號。
課程基本信息:課程號、課程名、授課學期、學分、課程性質。
學生選課信息:學號、課程號、修課類型、修課時間、考試成績。
在關系數據庫中,可以將每一類信息存儲在一個表中(關系數據庫的概念將在第2章介紹),重復的信息只存儲一份,當在學生選課管理中需要學生的姓名等其他信息時,根據學生選課管理中的學號,可以很容易地在學生基本信息中找到此學號對應的姓名等信息。因此,消除數據的重復存儲不影響對信息的提取,同時還可以避免由於數據重復存儲而造成的數據不一致問題。比如,當某個學生所學的專業發生變化時,只需在“學生基本信息”中進行修改即可。
同1.2.1節中的問題一樣,當所需的信息來自不同地方,比如(班號,學號,姓名,課程名,學分,考試成績),這些信息需要從3個地方(關系數據庫為3張表)得到,這種情況下,也需要對信息進行適當的組合,即學生選課信息中的學號只能與學生基本信息中學號相同的信息組合在一起,同樣,學生選課信息中的課程號也必須與課程基本信息中課程號相同的信息組合在一起。過去在文件管理方式中,這個工作是由開發者編程實現的,而現在有了數據庫管理系統,這些煩瑣的工作完全交給了數據庫管理系統來完成。
因此,在數據庫管理系統中,避免數據冗余不會增加開發者的負擔。在關系數據庫中,避免數據冗余是通過關系規範化理論實現的。
(3)程序與數據相互獨立
在數據庫中,數據所包含的所有數據項以及數據的存儲格式都與數據存儲在一起,它們通過DBMS而不是應用程序來操作和管理,應用程序不再需要處理文件和記錄的格式。
程序與數據相互獨立有兩方面的含義。一方面是當數據的存儲方式發生變化時(這裏包括邏輯存儲方式和物理存儲方式),比如從鏈表結構改為散列表結構,或者是順序和非順序之間的轉換,應用程序不必作任何修改。另一方面是當數據的邏輯結構發生變化時,比如增加或減少了一些數據項,如果應用程序與這些修改的數據項無關,則不用修改應用程序。這些變化都將由DBMS負責維護。大多數情況下,應用程序並不知道也不需要知道數據存儲方式或數據項已經發生了變化。
在關系數據庫中,數據庫管理系統可以自動保證程序與數據相互獨立。
(4)保證數據的安全和可靠
數據庫技術能夠保證數據庫中的數據是安全和可靠的。它的安全控制機制可以有效地防止數據庫中的數據被非法使用和非法修改;其完整的備份和恢復機制可以保證當數據遭到破壞時(由軟件或硬件故障引起的)能夠很快地將數據庫恢復到正確的狀態,並使數據不丟失或只有很少的丟失,從而保證系統能夠連續、可靠地運行。保證數據的安全是通過數據庫管理系統的安全控制機制實現的,保證數據的可靠是通過數據庫管理系統的備份和恢復機制實現的。
(5)最大限度地保證數據的正確性
數據的正確性(也稱為數據的完整性)是指存儲到數據庫中的數據必須符合現實世界的實際情況,比如人的性別只能是“男”和“女”,人的年齡應該在0~150歲之間(假設沒有年齡超過150歲的人)。如果在性別中輸入了其他值,或者將一個負數輸入到年齡中,在現實世界中顯然是不對的。數據的正確性是通過在數據庫中建立約束來實現的。當建立好保證數據正確的約束之後,如果有不符合約束的數據存儲到數據庫中,數據庫管理系統能主動拒絕這些數據。
(6)數據可以共享並能保證數據的一致性
數據庫中的數據可以被多個用戶共享,即允許多個用戶同時操作相同的數據。當然,這個特點是針對支持多用戶的大型數據庫管理系統而言的,對於只支持單用戶的小型數據庫管理系統(比如Access),在任何時候最多只有一個用戶訪問數據庫,因此不存在共享的問題。
多用戶共享問題是數據庫管理系統內部解決的問題,它對用戶是不可見的。這就要求數據庫能夠對多個用戶進行協調,保證多個用戶之間對數據的操作不會產生矛盾和沖突,即在多個用戶同時使用數據庫時,能夠保證數據的一致性和正確性。設想一下火車訂票系統,如果多個訂票點同時對某一天的同一列火車進行訂票,那麽必須保證不同訂票點訂出票的座位不能重復。
數據可共享並能保證共享數據的一致性是由數據庫管理系統的並發控制機制實現的。
到今天,數據庫技術已經發展成為一門比較成熟的技術,通過上述討論,我們可以概括出數據庫具備如下特征:數據庫是相互關聯的數據的集合,它用綜合的方法組織數據,具有較小的數據冗余,可供多個用戶共享,具有較高的數據獨立性,具有安全控制機制,能夠保證數據的安全、可靠,允許並發地使用數據庫,能有效、及時地處理數據,並能保證數據的一致性和正確性。
需要強調的是,所有這些特征並不是數據庫中的數據固有的,而是靠數據庫管理系統提供和保證的。

延伸阅读

评论