官术网_书友最值得收藏!

任務(wù) 掌握數(shù)據(jù)庫(kù)的基本概念

關(guān)鍵步驟如下。

? 專業(yè)術(shù)語(yǔ)

? 常見數(shù)據(jù)庫(kù)

? 數(shù)據(jù)庫(kù)基礎(chǔ)概念

數(shù)據(jù)庫(kù)(DataBase,DB)技術(shù)是程序開發(fā)人員必須掌握的技術(shù)之一,在前面的學(xué)習(xí)中,數(shù)據(jù)都是使用變量保存在內(nèi)存中的,一旦程序運(yùn)行完畢,內(nèi)存中的這些數(shù)據(jù)信息也會(huì)隨之消失。如果想長(zhǎng)期保存數(shù)據(jù),并且能夠?qū)?shù)據(jù)進(jìn)行整理,該怎么辦呢?從本章開始學(xué)習(xí)的數(shù)據(jù)庫(kù)技術(shù)就能夠解決這樣的問題。有調(diào)查數(shù)據(jù)顯示,目前70%以上的應(yīng)用軟件都需要使用到數(shù)據(jù)庫(kù)系統(tǒng),也就是說,大多數(shù)應(yīng)用系統(tǒng)都需要對(duì)數(shù)據(jù)進(jìn)行分類、存儲(chǔ)和檢索。

47422-00-013-1

數(shù)據(jù)庫(kù)基本概念

1. 術(shù)語(yǔ)解釋

術(shù)語(yǔ):信息

在日常生活中經(jīng)常聽到一個(gè)名詞“信息”,我國(guó)古代用的是“消息”,我國(guó)臺(tái)灣地區(qū)稱為“資訊”,日語(yǔ)中則稱為“情報(bào)”。信息直接與內(nèi)容掛鉤,它泛指人類社會(huì)傳播的一切內(nèi)容。

術(shù)語(yǔ):數(shù)據(jù)

數(shù)據(jù)不等于信息,數(shù)據(jù)是對(duì)客觀事件進(jìn)行記錄并可以鑒別的符號(hào),在計(jì)算機(jī)系統(tǒng)中,數(shù)據(jù)以二進(jìn)制信息單元0、1的形式表示。數(shù)據(jù)是數(shù)據(jù)庫(kù)中存儲(chǔ)的基本對(duì)象,除了最基本的數(shù)據(jù)形式——數(shù)字外,還有文字、圖片、視頻、聲音等形式。

術(shù)語(yǔ):大數(shù)據(jù)

大數(shù)據(jù)是一個(gè)體量特別大、數(shù)據(jù)類別特別大的數(shù)據(jù)集,并且這樣的數(shù)據(jù)集無(wú)法用傳統(tǒng)數(shù)據(jù)庫(kù)工具對(duì)其內(nèi)容進(jìn)行提取、管理和處理。大數(shù)據(jù)具有數(shù)據(jù)體量巨大、數(shù)據(jù)類型多樣、處理速度快、價(jià)值密度低等特點(diǎn)。大數(shù)據(jù)是數(shù)據(jù)由量變到質(zhì)變產(chǎn)生的一個(gè)概念,并發(fā)展出一整套大數(shù)據(jù)相關(guān)技術(shù)。

2. 什么是數(shù)據(jù)庫(kù)

數(shù)據(jù)庫(kù)簡(jiǎn)而言之就是存放數(shù)據(jù)的倉(cāng)庫(kù),是為了實(shí)現(xiàn)一定目的,按照某種規(guī)則組織起來的數(shù)據(jù)的集合。當(dāng)然數(shù)據(jù)有多種形式,如文字、數(shù)碼、符號(hào)、圖形、聲音等。從廣義角度定義,計(jì)算機(jī)中任何可以保存數(shù)據(jù)的文件或者系統(tǒng)都可以稱之為數(shù)據(jù)庫(kù),比如一個(gè)Word文件、一個(gè)Excel文件等。在IT專業(yè)領(lǐng)域中,數(shù)據(jù)庫(kù)一般指的是由專業(yè)技術(shù)團(tuán)隊(duì)開發(fā)的用于存儲(chǔ)數(shù)據(jù)的軟件系統(tǒng)。專業(yè)的數(shù)據(jù)庫(kù)系統(tǒng)需要具有較小的數(shù)據(jù)冗余度,較高的數(shù)據(jù)安全性和易擴(kuò)展性。

3. 使用數(shù)據(jù)庫(kù)的必要性

隨著互聯(lián)網(wǎng)技術(shù)的高速發(fā)展,2015年我國(guó)網(wǎng)民的數(shù)量已達(dá)6.88億,網(wǎng)民數(shù)量的增加同時(shí)帶動(dòng)了網(wǎng)上購(gòu)物、微博、網(wǎng)絡(luò)視頻等新產(chǎn)業(yè)的發(fā)展。那么,隨之而來的就是龐大的網(wǎng)絡(luò)數(shù)據(jù)量。

大量的數(shù)據(jù)正在不斷產(chǎn)生,伴隨而來的是如何安全有效地存儲(chǔ)、檢索、管理它們。對(duì)數(shù)據(jù)的有效存儲(chǔ)、高效訪問、方便共享和安全控制等問題成為信息時(shí)代一個(gè)非常重要的問題。

使用數(shù)據(jù)庫(kù)可以高效且條理分明地存儲(chǔ)數(shù)據(jù),它使人們能夠更加迅速和方便地管理數(shù)據(jù),主要體現(xiàn)在以下幾個(gè)方面。

(1)可以結(jié)構(gòu)化存儲(chǔ)大量的數(shù)據(jù)信息,方便用戶進(jìn)行有效的檢索和訪問。數(shù)據(jù)庫(kù)可以對(duì)數(shù)據(jù)進(jìn)行分類保存,并且能夠提供快速的查詢。例如,去百度搜索我們想要的數(shù)據(jù)。實(shí)際上,百度搜索也正是基于數(shù)據(jù)庫(kù)和數(shù)據(jù)分類技術(shù)來達(dá)到快速搜索的目的。

(2)可以有效地保持?jǐn)?shù)據(jù)信息的一致性、完整性,降低數(shù)據(jù)冗余。保存在數(shù)據(jù)庫(kù)中的數(shù)據(jù),可以很好地保證數(shù)據(jù)的有效性和不被破壞,而且數(shù)據(jù)庫(kù)自身有避免數(shù)據(jù)重復(fù)的功能,以此來降低數(shù)據(jù)的冗余。

(3)可以滿足應(yīng)用的共享和安全方面的要求。把數(shù)據(jù)放在數(shù)據(jù)庫(kù)中很多情況下也是出于安全的考慮。例如,若把所有員工的信息、工資數(shù)據(jù)都放在磁盤文件中,則工資的保密性就無(wú)從談起;若把員工信息和工資信息放在數(shù)據(jù)庫(kù)中,則可以只允許員工查詢和修改個(gè)人信息,而工資信息只允許財(cái)務(wù)人員查看,從而保證數(shù)據(jù)的安全性。

4. 常見數(shù)據(jù)庫(kù)

在數(shù)據(jù)庫(kù)技術(shù)日益發(fā)展的今天,主流數(shù)據(jù)庫(kù)代表著成熟的數(shù)據(jù)庫(kù)技術(shù),了解常用的數(shù)據(jù)庫(kù),就能知道當(dāng)前數(shù)據(jù)庫(kù)技術(shù)發(fā)展的程度,以及未來的發(fā)展趨勢(shì)。常見數(shù)據(jù)庫(kù)模型如圖1.1所示。

47422-00-014-1

圖1.1 常見數(shù)據(jù)庫(kù)模型

20世紀(jì)80—90年代是關(guān)系型數(shù)據(jù)庫(kù)產(chǎn)品發(fā)展和競(jìng)爭(zhēng)的時(shí)代,在市場(chǎng)逐漸淘汰了第一代數(shù)據(jù)庫(kù)管理系統(tǒng)的大局面下,MySQL、Oracle、SQL Server等一批很有實(shí)力的關(guān)系型數(shù)據(jù)庫(kù)產(chǎn)品走到了主流商用數(shù)據(jù)庫(kù)的位置。

(1)Oracle簡(jiǎn)介

Oracle是Oracle(甲骨文)公司的數(shù)據(jù)庫(kù)產(chǎn)品。Oracle公司成立于1977年,最初就是專門的數(shù)據(jù)庫(kù)公司,為大、中、小型計(jì)算機(jī)提供數(shù)據(jù)庫(kù)產(chǎn)品,Oracle數(shù)據(jù)庫(kù)在那時(shí)就已經(jīng)出現(xiàn)并且相當(dāng)成熟。1984年,Oracle公司將Oracle移植到臺(tái)式計(jì)算機(jī)上時(shí),Oracle的版本就已經(jīng)是4.0。20世紀(jì)90年代末期,Oracle公司又推出了更新的版本——9i,全面支持Internet應(yīng)用。不久之后,Oracle開發(fā)工具套件10g問世。Oracle 10g是業(yè)界第一個(gè)完整的智能化的新一代Internet基礎(chǔ)架構(gòu),可用于快速開發(fā)使用Java和XML語(yǔ)言的Internet應(yīng)用和Web服務(wù),支持任何語(yǔ)言、任何操作系統(tǒng)、任何開發(fā)風(fēng)格、開發(fā)生命周期的任何階段及所有最新的互聯(lián)網(wǎng)標(biāo)準(zhǔn)。后續(xù),Oracle繼續(xù)推出Oracle 11g和12c等Oracle數(shù)據(jù)庫(kù)產(chǎn)品。目前,Oracle產(chǎn)品已經(jīng)覆蓋了包括個(gè)人計(jì)算機(jī)在內(nèi)的大、中、小型機(jī)等幾十個(gè)機(jī)型。

(2)SQL Server簡(jiǎn)介

SQL Server是微軟的數(shù)據(jù)庫(kù)產(chǎn)品,Microsoft SQL Server源于Sybase SQL Server。在設(shè)計(jì)上,Microsoft SQL Server大量利用了Microsoft Windows操作系統(tǒng)的底層結(jié)構(gòu),直接面向Microsoft Windows操作系統(tǒng),尤其是NT系列服務(wù)器操作系統(tǒng)。SQL Server基本上不能移植到其他操作系統(tǒng)上,就算勉強(qiáng)移植,也無(wú)法發(fā)揮很好的性能。

Microsoft SQL Server作為一個(gè)商業(yè)化的產(chǎn)品,它的優(yōu)勢(shì)是Microsoft產(chǎn)品所共有的易用性。Microsoft Windows擁有最多的用戶群,Microsoft所有的產(chǎn)品都遵循相似、統(tǒng)一的操作習(xí)慣,一個(gè)對(duì)數(shù)據(jù)庫(kù)基本概念熟悉的Windows用戶,可以很快地學(xué)會(huì)使用SQL Server,上手比較容易。Windows系統(tǒng)的易用性也讓數(shù)據(jù)庫(kù)管理員可以更容易、更方便、更輕松地進(jìn)行管理。

(3)MySQL簡(jiǎn)介

MySQL是一種開放源代碼的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS),由于MySQL是開放源代碼的,因此任何人都可以在General Public License的許可下下載并根據(jù)個(gè)性化的需要對(duì)其進(jìn)行修改。MySQL以其速度、可靠性和適應(yīng)性而備受關(guān)注,在不需要支持事務(wù)處理的情況下,大多數(shù)人都認(rèn)為MySQL是管理內(nèi)容最好的選擇。

MySQL關(guān)系型數(shù)據(jù)庫(kù)于1998年1月發(fā)布第一個(gè)版本。它使用系統(tǒng)核心提供的多線程機(jī)制提供完全的多線程運(yùn)行模式,包括面向C、C++、Eiffel、Java、Perl、PHP、Python及TCL等編程語(yǔ)言的編程接口,支持多種字段類型,并且包括完整的操作符,支持查詢中的SELECT和WHERE操作。很多大型的網(wǎng)站也用到MySQL數(shù)據(jù)庫(kù),MySQL的發(fā)展前景非常光明。

下面我們來詳細(xì)了解一下MySQL的版本和優(yōu)勢(shì)。

目前MySQL數(shù)據(jù)庫(kù)按照用戶群,分為社區(qū)版(Community)和企業(yè)版(Enterprise),這兩個(gè)版本的主要區(qū)別如下。

社區(qū)版:可自由下載且完全免費(fèi),但官方不提供任何技術(shù)支持,適用于大多數(shù)普通用戶。

企業(yè)版:不能自由下載且收費(fèi),該版本提供了更多的功能,可以享受完備的技術(shù)支持,適用于對(duì)數(shù)據(jù)庫(kù)的功能和可靠性要求比較高的企業(yè)用戶。

MySQL版本更新非常快,從MySQL 5開始支持觸發(fā)器、視圖、存儲(chǔ)過程等數(shù)據(jù)庫(kù)對(duì)象。本課程使用的MySQL版本為5.5。

相對(duì)其他數(shù)據(jù)庫(kù)產(chǎn)品而言,MySQL的主要優(yōu)勢(shì)如下。

1)運(yùn)行速度快。MySQL體積小,命令執(zhí)行的速度快。

2)使用成本低。MySQL是開源的,且提供免費(fèi)版本,對(duì)大多數(shù)用戶來說大大降低了使用成本。

3)容易使用。與其他大型數(shù)據(jù)庫(kù)的設(shè)置和管理相比,其復(fù)雜程度較低,易于使用。

4)可移植性強(qiáng)。MySQL能夠運(yùn)行于多種系統(tǒng)平臺(tái)上,如Windows、Linux、UNIX等。

5)適用于更多用戶。MySQL支持最常用的數(shù)據(jù)管理功能,適用于中小型企業(yè)甚至大型網(wǎng)站應(yīng)用。

注意

很多軟件開發(fā)企業(yè)在招聘的時(shí)候通常要求應(yīng)聘者“熟練使用MySQL、Oracle、SQL Server等一種或者多種數(shù)據(jù)庫(kù)”,而不會(huì)嚴(yán)格要求會(huì)使用哪一個(gè)數(shù)據(jù)庫(kù),這是因?yàn)槎鄶?shù)數(shù)據(jù)庫(kù)的數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)查詢都大同小異,甚至某些操作數(shù)據(jù)庫(kù)的命令都是一樣的。

在非關(guān)系型數(shù)據(jù)庫(kù)中,本書將選擇文檔存儲(chǔ)數(shù)據(jù)庫(kù)——MongoDB作為學(xué)習(xí)內(nèi)容。由于每一種數(shù)據(jù)庫(kù)存在不同的適用場(chǎng)景以及優(yōu)劣勢(shì),選擇哪種數(shù)據(jù)庫(kù)進(jìn)行開發(fā),需要根據(jù)公司業(yè)務(wù)需求以及團(tuán)隊(duì)技術(shù)能力等因素綜合考慮。

5. 實(shí)體和數(shù)據(jù)庫(kù)表

在前面的程序開發(fā)技術(shù)的學(xué)習(xí)中,也許你聽到過“實(shí)體”(Entity)一詞。在數(shù)據(jù)庫(kù)概念中,實(shí)體指的是所有客觀存在的、可以被描述的事物。例如,計(jì)算機(jī)、人、課本、桌子甚至課本的結(jié)構(gòu),都屬于客觀存在的、可以被描述的,這些都稱為實(shí)體。

在數(shù)據(jù)庫(kù)概念中,是針對(duì)這些實(shí)體所具有的“特性”進(jìn)行描述的。例如,針對(duì)人和書本,描述的方面是不一樣的,針對(duì)人,我們可能說明其編號(hào)、姓名、年齡、民族、收入及職業(yè)等;而針對(duì)書本,我們要描述的重點(diǎn)應(yīng)當(dāng)是書本的價(jià)格、章節(jié)數(shù)、頁(yè)數(shù)、作者、出版社、出版日期等。數(shù)據(jù)庫(kù)中的數(shù)據(jù)就是按照這種格式進(jìn)行存儲(chǔ)的,而不是雜亂無(wú)章的,相同格式和類型的數(shù)據(jù)統(tǒng)一存放在一起。這樣,數(shù)據(jù)的存儲(chǔ)就如圖1.2這樣有條不紊了,類似一個(gè)裝滿數(shù)據(jù)的表格。

觀察圖1.2數(shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù)表格,每一“行”(Row)實(shí)際上對(duì)應(yīng)一個(gè)實(shí)體,在數(shù)據(jù)庫(kù)中,通常叫作一條“記錄”(Record)。表格中的每一“列”,如編號(hào)、姓名、年齡、民族等,在數(shù)據(jù)庫(kù)中,通常稱之為“字段”。

47422-00-017-1

圖1.2 數(shù)據(jù)存儲(chǔ)方式

我們把圖1.2中相同類型的記錄組織在一起的數(shù)據(jù)結(jié)構(gòu)稱為數(shù)據(jù)庫(kù)“表”(Table),表是實(shí)體的集合,用來存儲(chǔ)具體的數(shù)據(jù)。那么,上面提到的書本的信息存儲(chǔ)在哪兒呢?跟人的信息一樣,書本的信息也應(yīng)當(dāng)存儲(chǔ)在一張表中,但需要注意的是,并不是一張表就是一個(gè)數(shù)據(jù)庫(kù),那么數(shù)據(jù)庫(kù)和表存在怎樣的關(guān)系呢?

簡(jiǎn)單地說,表是記錄的集合,而數(shù)據(jù)庫(kù)是表的集合。但是,通常數(shù)據(jù)庫(kù)并不是簡(jiǎn)單地存儲(chǔ)這些實(shí)體的數(shù)據(jù),它還要表達(dá)實(shí)體之間的關(guān)系。例如,書本和人是存在聯(lián)系的,書本的作者,可能就是某個(gè)人,因此需要建立書本與人的“關(guān)系”(Relationship),“關(guān)系”的描述也是數(shù)據(jù)庫(kù)的一部分。除此之外,在處理一些復(fù)雜的業(yè)務(wù)邏輯時(shí),基于開發(fā)效率和程序運(yùn)行效率的考慮,我們通常會(huì)創(chuàng)建一些除數(shù)據(jù)庫(kù)表之外的其他數(shù)據(jù)庫(kù)對(duì)象,這些對(duì)象會(huì)在后續(xù)的課程中學(xué)習(xí)到。

邏輯上,數(shù)據(jù)庫(kù)包括數(shù)據(jù)表、關(guān)系表及其他各種數(shù)據(jù)庫(kù)對(duì)象,如圖1.3所示。

47422-00-017-2

圖1.3 數(shù)據(jù)庫(kù)表和數(shù)據(jù)庫(kù)的關(guān)系

在早期數(shù)據(jù)庫(kù)技術(shù)并不發(fā)達(dá)的時(shí)候,“實(shí)體”之間的“關(guān)系”常用關(guān)系表達(dá)式來實(shí)現(xiàn)。在數(shù)據(jù)庫(kù)技術(shù)相當(dāng)發(fā)達(dá)的今天,很多“關(guān)系”被高度抽象,成為較統(tǒng)一的概念,通過鍵、類型、規(guī)則、權(quán)限、約束等抽象概念來實(shí)現(xiàn)。

隨著數(shù)據(jù)庫(kù)的發(fā)展和需求的增加,還產(chǎn)生了許多其他輔助的操作對(duì)象,如存儲(chǔ)過程、視圖、操作數(shù)據(jù)行的游標(biāo)等,這些操作對(duì)象也逐漸成為數(shù)據(jù)庫(kù)的一部分。

6. 數(shù)據(jù)庫(kù)管理系統(tǒng)和數(shù)據(jù)庫(kù)系統(tǒng)

數(shù)據(jù)庫(kù)管理系統(tǒng)(DataBase Management System,DBMS)是一種系統(tǒng)軟件,由一個(gè)互相關(guān)聯(lián)的數(shù)據(jù)集合和一組訪問數(shù)據(jù)的程序構(gòu)成。簡(jiǎn)而言之,數(shù)據(jù)庫(kù)管理系統(tǒng)就是管理數(shù)據(jù)庫(kù)的系統(tǒng),數(shù)據(jù)庫(kù)管理系統(tǒng)包括數(shù)據(jù)庫(kù)以及用于訪問管理數(shù)據(jù)庫(kù)的接口系統(tǒng)。通常我們也會(huì)把數(shù)據(jù)庫(kù)管理系統(tǒng)直接稱為數(shù)據(jù)庫(kù)。如嚴(yán)格意義上說MySQL屬于數(shù)據(jù)庫(kù)管理系統(tǒng),但是通常也稱MySQL為MySQL數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)管理系統(tǒng)的基本目標(biāo)是提供一個(gè)可以方便有效地存取數(shù)據(jù)庫(kù)信息的環(huán)境。

數(shù)據(jù)庫(kù)管理系統(tǒng)的主要功能是維護(hù)數(shù)據(jù)庫(kù),并有效地訪問數(shù)據(jù)庫(kù)中各個(gè)部分的數(shù)據(jù)。如圖1.4所示的是數(shù)據(jù)庫(kù)管理系統(tǒng)與數(shù)據(jù)庫(kù)的關(guān)系。

47422-00-018-1

圖1.4 數(shù)據(jù)庫(kù)管理系統(tǒng)與數(shù)據(jù)庫(kù)的關(guān)系

數(shù)據(jù)庫(kù)系統(tǒng)(DataBase System,DBS)是一個(gè)實(shí)際可運(yùn)行的系統(tǒng),可以對(duì)系統(tǒng)提供的數(shù)據(jù)進(jìn)行存儲(chǔ)、維護(hù)和應(yīng)用,它是由存儲(chǔ)介質(zhì)、處理對(duì)象和管理系統(tǒng)共同組成的集合體,通常由軟件、數(shù)據(jù)庫(kù)以及數(shù)據(jù)庫(kù)管理員組成。

數(shù)據(jù)庫(kù)管理員(DataBase Administrator,DBA)是指在數(shù)據(jù)庫(kù)系統(tǒng)中負(fù)責(zé)創(chuàng)建、監(jiān)控和維護(hù)整個(gè)數(shù)據(jù)庫(kù)的專業(yè)管理人員。如圖1.5所示是數(shù)據(jù)庫(kù)系統(tǒng)的總體結(jié)構(gòu)。

47422-00-018-2

圖1.5 數(shù)據(jù)庫(kù)系統(tǒng)的總體結(jié)構(gòu)

7. 數(shù)據(jù)冗余和數(shù)據(jù)完整性

在數(shù)據(jù)庫(kù)系統(tǒng)中,數(shù)據(jù)重復(fù)的現(xiàn)象就是數(shù)據(jù)冗余(Redundance)。例如,在企業(yè)員工信息數(shù)據(jù)庫(kù)中,使用個(gè)人信息統(tǒng)計(jì)表1-1來記錄員工信息。

表1-1 個(gè)人信息統(tǒng)計(jì)表(樣例)

47422-00-019-1
47422-00-019-2

數(shù)據(jù)冗余和數(shù)據(jù)完整性

兩條記錄中都出現(xiàn)了“人事管理部”,在數(shù)據(jù)庫(kù)中我們就認(rèn)為是數(shù)據(jù)冗余,因?yàn)榇嬖谥貜?fù)的數(shù)據(jù),有簡(jiǎn)化的必要。減少數(shù)據(jù)冗余最常見的方法是分類存儲(chǔ)。調(diào)整后的數(shù)據(jù)庫(kù)表如表1-2至表1-4所示。

表1-2 修改后的個(gè)人信息統(tǒng)計(jì)表(樣例)

47422-00-019-3

表1-3 民族編碼表

表1-4 部門編碼表

通過這樣的方法,可以減少數(shù)據(jù)冗余,但會(huì)增加數(shù)據(jù)查找的復(fù)雜性。例如,如果要查找民族為“漢族”的員工信息,原來只需要查找一個(gè)表,現(xiàn)在就需要先檢索表1-3,然后還要依據(jù)部門編碼檢索表1-4,這樣無(wú)疑增加了查找的復(fù)雜性,降低了效率,因此在數(shù)據(jù)庫(kù)中,通常允許有必要的冗余。

數(shù)據(jù)的完整性(Integrality)是指數(shù)據(jù)庫(kù)中數(shù)據(jù)的準(zhǔn)確性。如果兩個(gè)或更多的表由于其存儲(chǔ)的信息而相互關(guān)聯(lián),那么只要修改了其中一個(gè)表,與之相關(guān)的所有表都要做出相應(yīng)的修改,如果不這么做,存儲(chǔ)的數(shù)據(jù)就會(huì)不再準(zhǔn)確,也就是說,失去了數(shù)據(jù)的完整性。

例如,在一個(gè)圖書館系統(tǒng)中,一個(gè)會(huì)員要退會(huì),更新了會(huì)員表,但是卻沒有更新記錄會(huì)員借走和歸還書籍的詳細(xì)資料表,因此,盡管這個(gè)人已不再是圖書館的會(huì)員,但書籍借閱和歸還資料表中卻仍然存在他借出或者歸還書籍的信息,甚至有可能在月底結(jié)算罰金數(shù)時(shí),這個(gè)不存在的會(huì)員會(huì)被罰款,這種不能正確反映實(shí)際情況的數(shù)據(jù)不具備完整性。

數(shù)據(jù)冗余和數(shù)據(jù)不完整通常是由設(shè)計(jì)不當(dāng)引起的,實(shí)際應(yīng)用中要求數(shù)據(jù)庫(kù)不能存在大量的數(shù)據(jù)冗余,并且要確保數(shù)據(jù)的完整性。

8. 主鍵和外鍵

通過以上的學(xué)習(xí),我們了解了數(shù)據(jù)冗余和數(shù)據(jù)完整性的相關(guān)概念,為了解決上述問題,隨著數(shù)據(jù)庫(kù)技術(shù)的發(fā)展提出了主鍵和外鍵的概念。

(1)主鍵(Primary Key)

如果在表中存儲(chǔ)了很多行數(shù)據(jù),就會(huì)引發(fā)這樣的問題:如何判斷表中沒有重復(fù)的數(shù)據(jù)行?如何判斷一個(gè)學(xué)生的信息沒有被輸入兩次?

這就需要有一個(gè)列,這個(gè)列的值用來唯一標(biāo)識(shí)表中的每一行,用于強(qiáng)制表的實(shí)體完整性,這樣的列定義為表的主鍵。

在學(xué)生信息表中,學(xué)號(hào)列可以唯一地標(biāo)識(shí)不同的學(xué)生,因此可以把該列設(shè)置為主鍵。該列被設(shè)置為主鍵以后,數(shù)據(jù)庫(kù)中就能保證不允許再輸入重復(fù)的學(xué)號(hào)了,如圖1.6所示。

47422-00-020-1

圖1.6 主鍵列中禁止相同的數(shù)據(jù)

一個(gè)表只能有一個(gè)主鍵,并且主鍵列不允許出現(xiàn)空值(Null),盡管有的表中允許沒有主鍵,但是通常情況下建議為表設(shè)置一列作為主鍵。

注意

如果兩列或多列組合起來唯一地標(biāo)識(shí)表中的每一行,則該主鍵叫作“復(fù)合主鍵”。

有時(shí)候,在同一張表中有多個(gè)列可以用來當(dāng)作主鍵,在選擇哪個(gè)列作為主鍵的時(shí)候,需要考慮最少性和穩(wěn)定性兩個(gè)原則。

1)最少性是指列數(shù)最少的鍵。如果可以從單個(gè)主鍵和復(fù)合主鍵中選擇,應(yīng)該選擇單個(gè)主鍵,這是因?yàn)椴僮饕涣斜炔僮鞫嗔幸臁.?dāng)然該規(guī)則也有例外,例如,兩個(gè)整數(shù)類型的列的組合比一個(gè)很大的字符類型的列操作要快。

2)穩(wěn)定性是指列中數(shù)據(jù)的特征。由于主鍵通常用來在兩個(gè)表之間建立聯(lián)系,所以主鍵的數(shù)據(jù)不能經(jīng)常更新。理想情況下,應(yīng)該永遠(yuǎn)不變。

(2)外鍵(Foreign Key)

在數(shù)據(jù)庫(kù)設(shè)計(jì)中,學(xué)生的信息和學(xué)生的考試成績(jī)是存放在不同的數(shù)據(jù)表中的。在成績(jī)表中,可以存儲(chǔ)學(xué)生的學(xué)號(hào)來表示是哪個(gè)學(xué)生的考試成績(jī),這又引發(fā)了一個(gè)問題:如果在成績(jī)表中輸入的學(xué)號(hào)根本不存在(如輸入的時(shí)候把學(xué)號(hào)寫錯(cuò)了),該怎么辦?

這個(gè)時(shí)候,就應(yīng)當(dāng)建立一種“引用”的關(guān)系,確保“從表”中的某個(gè)數(shù)據(jù)項(xiàng)在“主表”中必須存在,以避免上述錯(cuò)誤發(fā)生。“外鍵”就是用來達(dá)到這個(gè)目的的,它是相對(duì)于主鍵而言的,就是“從表”中對(duì)應(yīng)于“主表”的列,在從表中稱為外鍵或者引用鍵,它的值要求與主表的主鍵或者唯一鍵相對(duì)應(yīng),外鍵用來強(qiáng)制引用完整性。一個(gè)表可以有多個(gè)外鍵。

在了解了數(shù)據(jù)庫(kù)的一些基本概念后,接下來就開始正式進(jìn)行MySQL數(shù)據(jù)庫(kù)的學(xué)習(xí)。

主站蜘蛛池模板: 永嘉县| 乌审旗| 永康市| 阳高县| 宜城市| 桃源县| 安龙县| 镇宁| 积石山| 鲜城| 阳谷县| 禹城市| 内乡县| 扶绥县| 东乡| 罗城| 洛扎县| 雷州市| 深水埗区| 咸宁市| 赫章县| 新丰县| 平乐县| 卓尼县| 冀州市| 深圳市| 渝中区| 贵州省| 永州市| 望都县| 南澳县| 文安县| 东乡| 玉门市| 湟源县| 衡东县| 海原县| 疏附县| 宜春市| 德令哈市| 叶城县|