《MySQL數(shù)據(jù)庫應用實戰(zhàn)教程(微課版)》第03章-設計數(shù)據(jù)庫圖書借閱數(shù)據(jù)庫_第1頁
《MySQL數(shù)據(jù)庫應用實戰(zhàn)教程(微課版)》第03章-設計數(shù)據(jù)庫圖書借閱數(shù)據(jù)庫_第2頁
《MySQL數(shù)據(jù)庫應用實戰(zhàn)教程(微課版)》第03章-設計數(shù)據(jù)庫圖書借閱數(shù)據(jù)庫_第3頁
《MySQL數(shù)據(jù)庫應用實戰(zhàn)教程(微課版)》第03章-設計數(shù)據(jù)庫圖書借閱數(shù)據(jù)庫_第4頁
《MySQL數(shù)據(jù)庫應用實戰(zhàn)教程(微課版)》第03章-設計數(shù)據(jù)庫圖書借閱數(shù)據(jù)庫_第5頁
已閱讀5頁,還剩100頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

項目3設計數(shù)據(jù)庫

——圖書借閱數(shù)據(jù)庫任務1深入理解關(guān)系數(shù)據(jù)庫任務1深入理解關(guān)系數(shù)據(jù)庫 3.1.1數(shù)據(jù)庫開發(fā)過程 3.1.2數(shù)據(jù)模型 3.1.3ER模型 3.1.4關(guān)系模型 3.1.5關(guān)系數(shù)據(jù)庫設計 3.1.6規(guī)范化設計的6步實施法任務2需求分析任務3數(shù)據(jù)結(jié)構(gòu)設計任務4數(shù)據(jù)結(jié)構(gòu)的實施3.1.1數(shù)據(jù)庫開發(fā)過程1.需求分析階段項目啟動時:要做一個什么樣的項目,有什么功能,列出所有需求項目驗收時:滿足需求,項目成功通過,否則項目失敗2.概念設計階段在最抽象的層面上對項目進行設計,一般采用ER模型(見“3.1.3ER模型”)進行設計3.邏輯設計階段在概念設計的基礎(chǔ)上進行詳細設計,就是采用關(guān)系模型(見“3.1.4關(guān)系模型”),進行設計4.物理設計階段在具體的數(shù)據(jù)庫(即MySQL)的層面上,對邏輯設計進行補充、落實5.應用開發(fā)階段實際編寫代碼,進行項目開發(fā)。這個階段結(jié)束、項目可以驗收,標志著項目的完成6.運行維護階段開發(fā)完成后,還要進行維護,保證項目能夠正常運行??赡艹掷m(xù)十幾年至幾十年1.需求分析階段1.需求分析階段這是數(shù)據(jù)庫開發(fā)的起點,主要任務是調(diào)査、收集與分析用戶在數(shù)據(jù)處理中的數(shù)據(jù)需求、功能需求、完整性和安全性需求。經(jīng)過反復修改和用戶確認,最終形成需求分析報告,即軟件需求規(guī)格說明書這是項目設計和開發(fā)的最重要的依據(jù),也是項目驗收的核心依據(jù)如果需求分析不完整,甚至出現(xiàn)了錯誤,就會使開發(fā)出的項目達不到用戶的實際要求,導致項目開發(fā)失敗。如果在開發(fā)進行的過程中,需求有補充或變更,將會使開發(fā)的工作量成倍增長,導致項目開發(fā)延期或失敗因此,需求分析是決定項目成敗的重要環(huán)節(jié)2.概念設計階段2.概念設計階段以需求分析的結(jié)果為依據(jù),將客觀事物及其聯(lián)系抽象為實體與屬性、實體與實體間的聯(lián)系,從而建立概念數(shù)據(jù)模型具體的內(nèi)容是實體、屬性以及實體間的聯(lián)系概念設計是指在不考慮任何物理因素(如軟件和硬件平臺、編程語言、數(shù)據(jù)庫管理系統(tǒng)等)的情況下,進行數(shù)據(jù)建模的過程3.邏輯設計階段3.邏輯設計階段將上一階段得到的概念模型轉(zhuǎn)換成關(guān)系模型,成為程序員能夠理解和實施的模型,這樣的模型就是邏輯數(shù)據(jù)模型具體的內(nèi)容包括數(shù)據(jù)表的結(jié)構(gòu)、數(shù)據(jù)完整性約束(主鍵約束、外鍵約束等)邏輯設計是在不考慮具體數(shù)據(jù)庫管理系統(tǒng)選型的情況下,根據(jù)關(guān)系模型的要求進行數(shù)據(jù)建模的過程。通常是在概念模型的基礎(chǔ)上構(gòu)建邏輯模型4.物理設計階段4.物理設計階段根據(jù)選定的數(shù)據(jù)庫管理系統(tǒng)的特點和處理的需要,對邏輯設計階段得到的關(guān)系模型進行物理設計,使其能夠在具體的數(shù)據(jù)庫管理系統(tǒng)上實施在數(shù)據(jù)表的結(jié)構(gòu)、數(shù)據(jù)完整性約束(主鍵約束、外鍵約束)的基礎(chǔ)上,增加列的數(shù)據(jù)類型、唯一性約束和非空約束等約束、視圖和索引等,使其最終成為在計算機上能夠運行的模型物理設計是在選定的數(shù)據(jù)庫管理系統(tǒng)(如MySQL)的情況下,進行數(shù)據(jù)建模的過程。通常是在邏輯模型的基礎(chǔ)上構(gòu)建物理模型5.應用開發(fā)階段5.應用開發(fā)階段根據(jù)需求分析的結(jié)果,特別是功能需求,使用數(shù)據(jù)庫管理系統(tǒng)提供的數(shù)據(jù)操縱和數(shù)據(jù)查詢功能,對數(shù)據(jù)庫中的數(shù)據(jù)進行修改(插入、更新和刪除)以及檢索(查詢語句)操作在數(shù)據(jù)庫應用系統(tǒng)開發(fā)過程中,通常是將數(shù)據(jù)庫管理系統(tǒng)提供的SQL語句嵌入在程序設計語言中,例如Java或PHP語言,為用戶提供良好的界面,對數(shù)據(jù)庫進行增、刪、改,以及查詢操作。在項目1中,通過瀏覽器查看數(shù)據(jù)庫中的數(shù)據(jù),就是在Java語言中嵌入SQL語句實現(xiàn)的6.運行維護階段6.運行維護階段數(shù)據(jù)庫應用系統(tǒng)開發(fā)調(diào)試完成后,還要在服務器上安裝部署,才能投入正式運行。這時,用戶可通過網(wǎng)絡訪問和使用服務器上的數(shù)據(jù)庫應用系統(tǒng)在運行過程中還需要維護,維護的內(nèi)容包括保證數(shù)據(jù)庫的安全,數(shù)據(jù)庫的備份與恢復,以及對數(shù)據(jù)庫的性能監(jiān)視、分析和改進,并不斷地進行評估、調(diào)整與優(yōu)化數(shù)據(jù)庫項目的運行維護是一個長期的過程,只要用戶還在使用,就會需要維護教材全書結(jié)構(gòu)與數(shù)據(jù)庫開發(fā)過程3.1.2數(shù)據(jù)模型數(shù)據(jù)模型是對現(xiàn)實世界數(shù)據(jù)關(guān)系的抽象,用來描述數(shù)據(jù)、組織數(shù)據(jù)和對數(shù)據(jù)進行操作1.數(shù)據(jù)模型三要素數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)操作、數(shù)據(jù)完整性約束2.數(shù)據(jù)模型三層次概念數(shù)據(jù)模型(信息世界)、邏輯數(shù)據(jù)模型(機器世界)、物理數(shù)據(jù)模型(物理世界)3.四種典型的數(shù)據(jù)模型層次模型、網(wǎng)狀模型、關(guān)系模型、面向?qū)ο竽P?.數(shù)據(jù)模型三要素數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)是對各種實體和實體間聯(lián)系的表達和實現(xiàn),實體是現(xiàn)實世界中客觀存在的事物在項目2里講解過聯(lián)系人數(shù)據(jù)庫的數(shù)據(jù)結(jié)構(gòu),每張表對應現(xiàn)實世界中的一個實體,即類型表、人員表和電話表分別對應聯(lián)系人類型、聯(lián)系人和聯(lián)系方式3個實體數(shù)據(jù)操作數(shù)據(jù)操作是對數(shù)據(jù)庫中各種實體進行修改(插入、更新、刪除)和檢索(查詢)等操作,數(shù)據(jù)模型必須定義這些操作的確切含義、操作符號、操作規(guī)則和實現(xiàn)操作的語言項目1和項目2簡單講解了數(shù)據(jù)的插入和數(shù)據(jù)的查詢,但還沒有講解數(shù)據(jù)的更新和刪除數(shù)據(jù)完整性約束數(shù)據(jù)完整性約束是對數(shù)據(jù)庫中各種實體及其聯(lián)系的約束性規(guī)定,用以保證數(shù)據(jù)庫中數(shù)據(jù)的正確性、一致性和可靠性。數(shù)據(jù)完整性約束可以有效避免數(shù)據(jù)庫中存在不符合語義規(guī)定的數(shù)據(jù),防止因錯誤的數(shù)據(jù)而造成無效操作或錯誤操作在項目2講解過的主鍵和外鍵,就是最重要的兩種數(shù)據(jù)約束,還有一些數(shù)據(jù)完整性約束將在后面再講解2.數(shù)據(jù)模型三層次概念數(shù)據(jù)模型(信息世界)概念數(shù)據(jù)模型(ConceptualDataModel)對應概念設計階段,是對現(xiàn)實世界的認識和抽象描述,從用戶的角度對實體及其聯(lián)系建立概念化的模型,從而對信息世界進行建模。常用的概念模型有ER模型,將在“3.1.3ER模型”講解通俗地說,概念模型是以使用者能夠理解的方式來描述問題邏輯數(shù)據(jù)模型(機器世界)邏輯數(shù)據(jù)模型(LogicalDataModel)對應邏輯設計階段,是從計算機的角度,將概念模型轉(zhuǎn)換為數(shù)據(jù)庫管理系統(tǒng)支持的某一種數(shù)據(jù)模型(如關(guān)系數(shù)據(jù)模型,將在“3.1.4關(guān)系模型”講解),用于對機器世界的建模通俗地說,邏輯模型是以程序員能夠理解的方式來描述問題物理數(shù)據(jù)模型(物理世界)物理數(shù)據(jù)模型(PhysicalDataModel)對應物理設計階段,是邏輯模型在具體的計算機系統(tǒng)(包括硬件、軟件和操作系統(tǒng),以及DBMS,如MySQL等)上的實現(xiàn),例如項目2中設計好的數(shù)據(jù)結(jié)構(gòu)(見“2.1.2數(shù)據(jù)結(jié)構(gòu)設計”小節(jié)中的表2.11、表2.12和表2.13)通俗地說,物理模型是以計算機能夠理解的方式來描述問題下一節(jié)講解ER模型,本章講解關(guān)系模型,全書講解MySQL3.幾種典型的數(shù)據(jù)模型層次模型(HierarchicalModel)最早出現(xiàn)的一種數(shù)據(jù)模型,它的數(shù)據(jù)結(jié)構(gòu)是用樹形結(jié)構(gòu)來表示各類實體以及實體之間的聯(lián)系,它的結(jié)構(gòu)過于簡單,無法完整地描述現(xiàn)實世界。層次模型流行于20世紀60~70年代,已淘汰網(wǎng)狀模型(NetworkModel)是對層次模型的擴展,它的數(shù)據(jù)結(jié)構(gòu)是網(wǎng)狀的,從而導致結(jié)構(gòu)復雜,難以擴充和維護。網(wǎng)狀模型流行于20世紀60~80年代,已淘汰關(guān)系模型(RelationalModel)用二維表結(jié)構(gòu)來表示各類實體以及實體之間的聯(lián)系。關(guān)系模型誕生于20世紀70年代,直到如今都是主流的數(shù)據(jù)庫技術(shù)在項目1和項目2中采用的都是二維表,也就是關(guān)系模型。本書講解的就是關(guān)系模型,以及基于關(guān)系模型的關(guān)系數(shù)據(jù)庫面向?qū)ο竽P兔嫦驅(qū)ο竽P停∣bjectOrientedModel)是一種采用面向?qū)ο蠹夹g(shù)來進行數(shù)據(jù)建模的技術(shù)。面向?qū)ο竽P驼Q生于20世紀70年代,是一種有發(fā)展?jié)摿Φ臄?shù)據(jù)模型,例如本書第3頁表1.1中提到的排名第4的PostgreSQL就是一種同時具有關(guān)系模型和面向?qū)ο竽P吞卣鞯臄?shù)據(jù)庫管理系統(tǒng)3.1.3ER模型ER模型是概念設計階段建立的模型,主要關(guān)注以下內(nèi)容1.常用術(shù)語實體(Entity)、實體集(EntitySet)、屬性(Attribute)、屬性值(Attributevalue)、域(Domain)、鍵(Key)2.實體聯(lián)系圖用矩形表示實體用圓形表示屬性用菱形表示實體間的聯(lián)系3.實體間的聯(lián)系,有三種一對一聯(lián)系一對多聯(lián)系多對多聯(lián)系1.常用術(shù)語實體(Entity)客觀存在并可相互區(qū)別的事物稱為實體。實體可以是具體的人、事、物或抽象的概念,如一位學生、一本書、一門課程、一份成績或聯(lián)系人類型等實體集(EntitySet)同一類型實體的集合稱為實體集,如一個班級的全體學生就是一個實體集。常常簡稱為實體屬性(Attribute)對實體特性的描述稱為屬性,如描述學生實體的屬性有學號、姓名、出生日期、性別等屬性值(Attributevalue)屬性值是某個實體的屬性的取值,如“SW390105”“方博涵”“2004-11-15”“女”是方博涵這個學生實體的屬性值域(Domain)屬性值的取值范圍稱為域,如學號域為2個字母加6個數(shù)字的字符串、性別域為“男”和“女”鍵(Key)能夠唯一標識實體集中一個實體的屬性或?qū)傩约?,稱為實體的鍵。鍵是一個重要的概念,在項目1講解了主鍵,在項目2又講解了外鍵,在“3.1.4關(guān)系模型”的第3部分“候選鍵、主鍵和外鍵”還要做深入的講解。2.實體聯(lián)系圖矩形表示實體圓形表示屬性,并用無箭頭直線標出實體與屬性的關(guān)系菱形表示實體間的聯(lián)系,并用無箭頭直線標出實體間的聯(lián)系,還可以加上聯(lián)系的類型2.實體聯(lián)系圖(續(xù))例如下圖是項目2的聯(lián)系人數(shù)據(jù)庫對應的ERD其中有3個實體類型、人員和電話每個實體都有屬性,如人員有名為“姓名”的屬性實體之間有聯(lián)系,例如類型和人員之間有名為“屬于”的聯(lián)系還要標記聯(lián)系的類型,例如類型和人員是一對多(1:n)的聯(lián)系3.實體間的聯(lián)系一對一聯(lián)系例如一個班級只有一個班主任,一個班主任只管理一個班級一對多聯(lián)系例如一個班級有多個學生,一個學生只屬于一個班級,見圖3.2多對多聯(lián)系例如一個學生可以選多門課程,一門課程可以有多個學生選修,見圖3.23.1.4關(guān)系模型關(guān)系模型是邏輯設計階段建立的模型,是關(guān)系數(shù)據(jù)庫的核心,主要關(guān)注以下內(nèi)容1.關(guān)系的定義2.關(guān)系的表示3.候選鍵、主鍵和外鍵4.關(guān)系模型的三要素5.ER模型向關(guān)系模型的轉(zhuǎn)換1.關(guān)系的定義關(guān)系是在關(guān)系代數(shù)中定義的,關(guān)系是一個二維表,表中的行稱為元組,表中的列稱為數(shù)據(jù)項例如項目1的氣象記錄就是一個關(guān)系,如圖3.5所示微課:3-1關(guān)系模型1.關(guān)系的定義(續(xù))關(guān)系是一個二維表,必須滿足關(guān)系的6項基本特征(見表3.2)1.關(guān)系的定義(續(xù))在關(guān)系的6項基本特征中,前5項比較好理解第6項,列的原子性(也稱為屬性的原子性)需要解釋一下例如圖3.3中,溫度列不是原子性的,因為它被分為兩個子屬性,最高溫度和最低溫度而在圖3.4中,取消了溫度列,這里,所有列都是原子性的,包括最高溫度和最低溫度如果把圖3.3的表看作三維表,把圖3.4的表看作二維表,則“二維表”這個詞就很好地表示了列的原子性這個特征1.關(guān)系的定義(續(xù))在概念模型、關(guān)系模型和物理模型中,一些概念是相同的,但是具有不同的名稱表3.3列出這些術(shù)語,表中在同一行的術(shù)語是同義詞雖然它們是同義詞,但是不同的術(shù)語仍然隱含了一些特定的含義,因此本書會根據(jù)場合的不同,使用不同的術(shù)語2.關(guān)系的表示關(guān)系由關(guān)系名和數(shù)據(jù)項組成,在關(guān)系代數(shù)中,可以用下述方式表示一個關(guān)系關(guān)系名(數(shù)據(jù)項1,數(shù)據(jù)項2,…,數(shù)據(jù)項n)例如,氣象記錄的關(guān)系可以表示如下氣象記錄(序號,日期和時間,觀測點,溫度,風速)3.候選鍵、主鍵和外鍵候選鍵(AlternateKey或CandidateKey)能夠唯一標識一個元組(實體)的屬性或?qū)傩约Q為候選鍵。在表示學生信息的二維表中,“學號”和“身份證號”都可以作為唯一標識學生的屬性,因此這兩個屬性都是候選鍵候選鍵也可能是由多個屬性組成的屬性集,如一個“成績”實體,擁有“姓名”“課程名”和“成績”3個屬性,這時候選鍵是“姓名”和“課程名”的屬性集,因為“姓名”或“課程名”都不能獨自唯一標識一個“成績”,只有“姓名”和“課程名”的組合才能唯一標識一個“成績”3.候選鍵、主鍵和外鍵(續(xù))主鍵(PrimaryKey)在候選鍵中指定其中一個作為主要候選鍵,簡稱為主鍵。例如,在學生表中,可以指定學號為主鍵,也可以指定身份證號為主鍵,但只能取其中之一在實際開發(fā)中,應該添加一個無業(yè)務含義的屬性作為主鍵,其值由程序自動生成,這樣的主鍵可以稱為唯一標識(Identity,id),在項目1和項目2的兩個案例中都是這樣做的3.候選鍵、主鍵和外鍵(續(xù))外鍵(ForeignKey)關(guān)系中的某個屬性或?qū)傩约m然不是該關(guān)系的主鍵,但卻是另外一個關(guān)系的主鍵,則稱其為外鍵。換句話說,外鍵是在本關(guān)系中標識另外一個關(guān)系中的實體的屬性或?qū)傩约陧椖?的聯(lián)系人數(shù)據(jù)庫中,就對人員表和電話表分別設計了外鍵。主鍵唯一標識本表的一個實體(行)。外鍵標識了其他表中的特定的實體(行),這時,外鍵參照(引用)了主表的實體(行)4.關(guān)系模型的三要素1、關(guān)系模型的數(shù)據(jù)結(jié)構(gòu)是二維數(shù)據(jù)表(即關(guān)系)。關(guān)系模型的數(shù)據(jù)結(jié)構(gòu)非常簡單,實體以及實體之間的聯(lián)系都是用關(guān)系來表示。因此,可以用簡單的模型來表示非常復雜的現(xiàn)實世界在關(guān)系的定義中,已經(jīng)對關(guān)系的數(shù)據(jù)結(jié)構(gòu)作了詳細的討論。這里不再贅述4.關(guān)系模型的三要素(續(xù))2、關(guān)系模型的數(shù)據(jù)操作關(guān)系模型的數(shù)據(jù)操作叫作關(guān)系操作,關(guān)系操作是對關(guān)系模型中的元組進行修改(插入、刪除、更新)和檢索(查詢)等的操作。在關(guān)系模型中,理論上是采用關(guān)系代數(shù)語言實現(xiàn)關(guān)系操作,實際編程中是采用SQL語言進行關(guān)系操作。例如,關(guān)系代數(shù)語言有投影π、選擇σ、連接RS、并R∪S、交R∩S、差R-S、除R÷S、笛卡兒積R×S等操作,常用的關(guān)系操作與SQL語言的關(guān)系如表3.4所示。4.關(guān)系模型的三要素(續(xù))2、關(guān)系模型的數(shù)據(jù)操作(續(xù))關(guān)系是元組的集合,對關(guān)系的運算就是對集合的運算,運算的結(jié)果是集合,這個集合也是關(guān)系。因此,關(guān)系操作的運算結(jié)果也是關(guān)系。關(guān)系模型以堅實的數(shù)學理論(關(guān)系代數(shù)、集合論和數(shù)理邏輯)為基礎(chǔ),可以對數(shù)據(jù)進行嚴格的定義、規(guī)范化和運算,這是關(guān)系數(shù)據(jù)庫成為主流技術(shù)的根本原因。4.關(guān)系模型的三要素(續(xù))3、關(guān)系模型的數(shù)據(jù)完整性約束(三種)實體完整性約束(主鍵約束)指任何一個關(guān)系必須有且只有一個主鍵,主鍵的值不能重復,也不能為空。簡單來說,就是不允許存在一個缺少唯一標識的實體。參照完整性約束(外鍵約束)指外鍵的值可以為空或不能為空,但其值必須是所參照的表的主鍵的值。簡單來說,就是不允許參照一個不存在的實體。用戶定義完整性約束:反映了具體應用中的業(yè)務需求,主要是下述三種約束非空約束:例如,學生的姓名不能為空唯一性約束:例如學生的身份證號不允許重復默認約束:例如學生的婚姻狀態(tài)默認為“未婚”5.ER模型向關(guān)系模型的轉(zhuǎn)換實體的轉(zhuǎn)換實體可以直接轉(zhuǎn)換為關(guān)系,轉(zhuǎn)換的規(guī)則如下。實體名轉(zhuǎn)換為關(guān)系名。實體的屬性轉(zhuǎn)換為關(guān)系的屬性。實體的鍵轉(zhuǎn)換為關(guān)系的鍵。聯(lián)系的轉(zhuǎn)換聯(lián)系的轉(zhuǎn)換需要根據(jù)聯(lián)系的類型,采用不同的規(guī)則進行轉(zhuǎn)換一對多聯(lián)系:轉(zhuǎn)換為主鍵和外鍵的參照一對一聯(lián)系:轉(zhuǎn)換為主鍵和外鍵(添加唯一性約束)的參照多對多聯(lián)系:轉(zhuǎn)換為兩個一對多聯(lián)系合并具有相同鍵的關(guān)系微課:3-2ER模型轉(zhuǎn)關(guān)系模型5.ER模型向關(guān)系模型的轉(zhuǎn)換(續(xù))5.ER模型向關(guān)系模型的轉(zhuǎn)換(續(xù))5.ER模型向關(guān)系模型的轉(zhuǎn)換(例子)3.1.5關(guān)系數(shù)據(jù)庫設計1.關(guān)系中的異常2.范式理論3.關(guān)系中異常的消除4.規(guī)范化設計的6步實施法1.關(guān)系中的異常一個好的關(guān)系模型應該具備以下兩個條件:①盡可能少的數(shù)據(jù)冗余;②沒有插入異常、刪除異常和更新異常微課:3-3關(guān)系數(shù)據(jù)庫的設計數(shù)據(jù)冗余班主任“李進中”的名字和電話在數(shù)據(jù)中多次出現(xiàn),這種現(xiàn)象稱為數(shù)據(jù)冗余。冗余的數(shù)據(jù)會浪費大量的存儲空間,并且也會降低數(shù)據(jù)庫的運行效率。更新異常當班主任“李進中”更換了電話號碼,這時必須更新“軟件31431”班所有學生的班主任電話。如果由于某種原因只更新了一部分,這時就會出現(xiàn)更新異常刪除異常如果刪除了學生“趙六”,由于趙六是班上的最后一名學生,這時班級“軟件31432”和班主任“汪一萍”的信息就會隨之消失。這是由于刪除學生而導致意外刪除了班級和教師,這時就會出現(xiàn)刪除異常插入異常如果學校新來了一位教師“張明亮”,由于他還沒有擔任班主任,當插入這位教師的信息后,會引起班級為空,以及主鍵“學號”為空的情況。這時就出現(xiàn)了插入異常2.范式理論函數(shù)依賴第一范式(1NF)第二范式(2NF)第三范式(3NF)函數(shù)依賴第一范式(1NF)如果一個關(guān)系滿足關(guān)系模型的基本特征(見“3.1.4關(guān)系模型”中關(guān)系的定義),并且屬性的值只包含域中的一個單一的值,則稱該關(guān)系屬于第一范式(1NF)。就是說,屬性值必須滿足原子性的要求。對于圖3.12所示的關(guān)系,“李四”的“電話號碼”保存了兩個值,違反了屬性值原子性的要求,因此達不到1NF的要求。注:第一范式的要求是屬性值必須滿足原子性的要求,而在關(guān)系的基本特征中有一條是屬性必須滿足原子性的要求。注意,前者是屬性值,后者是屬性。第一范式(1NF)——解決方案一第一范式(1NF)——解決方案二第二范式(2NF)如果一個關(guān)系已經(jīng)屬于1NF,另外再滿足一個條件,每個非主屬性(不構(gòu)成候選鍵的屬性)都必須完全依賴于候選鍵,不能部分依賴于候選鍵,則稱該關(guān)系屬于第二范式(2NF)就是說,不能存在某個非主屬性只依賴于候選鍵的一部分的情況。第二范式(2NF)——解決方案第三范式(3NF)如果一個關(guān)系已經(jīng)屬于2NF,另外再滿足一個條件,每個非主屬性(不構(gòu)成候選鍵的屬性)都必須直接依賴于候選鍵,不能傳遞依賴于候選鍵,則稱該關(guān)系屬于第三范式(3NF)就是說,不能存在非主屬性A依賴于非主屬性B,非主屬性B再依賴于候選鍵的情況。第三范式(3NF)——解決方案范式理論總結(jié)范式理論是關(guān)系數(shù)據(jù)庫理論的核心規(guī)范化設計需要滿足下述3個要求。滿足關(guān)系模型的6項基本特征:見“3.1.4關(guān)系模型”關(guān)系的定義的表3.2。滿足關(guān)系模型的數(shù)據(jù)完整性約束:主要是主鍵約束和外鍵約束。滿足范式理論的要求:主要是滿足1NF、2NF和3NF的要求,總結(jié)如表3.7所示。3.關(guān)系中異常的消除下面對前面“關(guān)系中的異?!碧岢龅睦舆M行分析,圖3.10所示對應的關(guān)系如下。在這個關(guān)系中,“學號”是主鍵,“班主任”和“班主任電話”通過“班級名稱”傳遞依賴于“學號”,根據(jù)規(guī)范化設計的要求,可以拆分為如下兩個關(guān)系。兩個關(guān)系各添加一個主鍵,學生關(guān)系添加一個外鍵,參照班級關(guān)系的主鍵。這時在班級關(guān)系中,“班主任電話”通過“班主任姓名”,傳遞依賴于“班級編號”,因此還要進一步拆分,結(jié)果如下。學生(班級名稱,班主任,班主任電話,學號,姓名,性別)班級(班級編號,班級名稱,班主任姓名,班主任電話)學生(學生編號,學號,姓名,性別,班級編號)班主任(班主任編號,班主任姓名,班主任電話)班級(班級編號,班級名稱,班主任編號)學生(學生編號,學號,姓名,性別,班級編號)3.關(guān)系中異常的消除將剛才的討論用表格的形式來解釋,如下圖所示圖3.11的關(guān)系拆分為三個關(guān)系數(shù)據(jù)冗余最小沒有更新異常、刪除異常和插入異常3.1.6規(guī)范化設計的6步實施法通過前面的討論,可以總結(jié)出規(guī)范化設計的6步實施法,如表3.9所示(1)列出所有二維表從需求分析中收集將要存入數(shù)據(jù)庫的所有數(shù)據(jù),按照關(guān)系模型基本特征的要求列出所有二維表,不能有任何遺漏,也不要有重復。每張表不應只有列名,還應該包含測試數(shù)據(jù),以便加深對數(shù)據(jù)之間聯(lián)系的理解,更好地進行規(guī)范化設計每張表可能包含一個或多個實體集,從設計開始,就要關(guān)注實體之間的聯(lián)系,盡可能不要在一張表中包含多個實體集。在這一步,雖然允許在一張表中包含多個實體集,但要在后面的步驟中進行拆分完成后,可以滿足關(guān)系的基本特征(2)設置主鍵和外鍵參照關(guān)系模型的數(shù)據(jù)完整性約束有下述兩個基本要求主鍵約束:為每張表設置一個主鍵,通常是整型的,并且設置為自動增量外鍵約束:通常每張表至少與另一張表有聯(lián)系,從表的外鍵參照主表的主鍵;要么參照別的表,要么被別的表參照,也有可能兩者兼而有之,只在極少情況下會出現(xiàn)獨立的表根據(jù)主鍵約束的要求,為所有表添加一個無業(yè)務含義的主鍵根據(jù)外鍵約束的要求,檢查所有表,檢查它們之間是否存在一對一、一對多和多對多的聯(lián)系,如果有,則按照“3.1.4關(guān)系模型”ER模型向關(guān)系模型的轉(zhuǎn)換中講解的辦法設置外鍵,并標出所參照的主鍵。如果是多對多的聯(lián)系,還需要把聯(lián)系轉(zhuǎn)換為關(guān)系,即添加一張新的表,并在新表中添加兩個外鍵,分別參照原來的實體的主鍵對表進行拆分時,新拆分出來的表需要添加主鍵,原來表的相關(guān)屬性通常替換為外鍵,參照新表的主鍵。拆分表和建立表之間的聯(lián)系是同步進行的,拆分出來的兩張表之間必定存在主從聯(lián)系,此時讀者應該立即在從表中加上外鍵,以免遺忘或者混淆完成后,可以基本滿足關(guān)系模型對數(shù)據(jù)完整性約束的要求。在后續(xù)步驟中拆分表時,還要確保滿足這個要求(3)檢查屬性值的原子性檢查所有表,找出屬性值中包含多個值的屬性(某一行的屬性值中包含多個值),例如前述包含兩個電話號碼(見圖3.12)的屬性,然后根據(jù)業(yè)務需求采用下述方式中的一種進行處理拆分屬性:將一個屬性拆分為多個屬性,分別保存多個值。這種方式的缺點是只能保存有限個值拆分表:將屬性獨立出來成為一張表。原表和新表之間是一對多的聯(lián)系,新表中添加主鍵和一個外鍵,這個外鍵參照原表的主鍵完成后,可以達到1NF的要求(4)檢查屬性值是否重復檢查所有表,找出含有重復值的屬性(某一列的不同行包含相同的屬性值),具有重復值的屬性常常是屬于另外的實體。有重復值的屬性表示可能存在多個實體,按照“一個實體集一張表”的原則,對表進行拆分(4)檢查屬性值是否重復(續(xù))要注意下述兩種情況假性重復例如“成績”列會有許多相同的值,但不能認為是重復值,因為相同的成績在本質(zhì)上不是重復,只是碰巧出現(xiàn)了相同的值隱性重復沒有在測試數(shù)據(jù)中反映出來的重復,當數(shù)據(jù)量足夠大時,某些屬性的值可能會出現(xiàn)重復,這種情況也應該加以考慮完成后,可以將表中的多數(shù)實體獨立出來,但不能保證達到2NF或3NF的要求,因為還可能有一些實體沒有獨立出來(5)檢查表是否包含多個實體再次檢查每一張表,分析表中是否含有多個實體(即是否存在部分依賴或傳遞依賴),按照“一個實體集一張表”的原則,如果有多個實體就要將其獨立出來。這時,原表和新表間的聯(lián)系有可能是一對一聯(lián)系,也有可能是一對多或多對多的聯(lián)系。依次檢查每一個屬性,如果不屬于所在表的同一個實體,就應該將其獨立出來作為一個實體。具體處理方式如下一對一聯(lián)系將表拆分為兩個實體,從屬的一方添加外鍵(加上唯一性約束),參照另一方的主鍵。這種情況比較常見,因為前面的步驟對此沒有考慮,需要加以注意一對多聯(lián)系將表拆分為兩個實體,“多”的一方添加外鍵,參照“一”的一方的主鍵。這種情況應該在前一步驟中檢查出來,由于是隱性重復,所以可能會導致疏漏多對多聯(lián)系將聯(lián)系獨立出來作為一個實體(二維表),添加兩個外鍵,分別參照原來的兩個實體的主鍵。這種情況應該在前面的步驟中完成,通常這時不會出現(xiàn)(6)合并相同的實體前述步驟拆分出來的實體可能存在相同的實體,相同的實體一般具有相同的主鍵和相同的屬性,屬性可能全部相同,也可能部分相同,應該將相同的實體合并成一個實體完成后,就能夠達到3NF的要求,完成規(guī)范化的設計規(guī)范化設計總結(jié)前述6個步驟總結(jié)如表3.9所示,設計的總原則就是“一個實體集一張表”任務2需求分析任務1深入理解關(guān)系數(shù)據(jù)庫任務2需求分析3.2.1需求描述3.2.2信息收集3.2.3系統(tǒng)功能設計3.2.4業(yè)務處理流程任務3數(shù)據(jù)結(jié)構(gòu)設計任務4數(shù)據(jù)結(jié)構(gòu)的實施3.2.1需求描述項目概況項目名稱:小型圖書借閱系統(tǒng)數(shù)據(jù)庫名:library需求概述本項目討論一個小型圖書借閱系統(tǒng)的開發(fā)過程,適合50~100人的小型公司內(nèi)部使用,圖書管理人員是兼職的。目標用戶是圖書管理員和普通借閱者,基本需求如下圖書管理員:能夠管理圖書、借閱者,以及進行借書和還書操作。普通借閱者:能夠查詢館藏圖書的情況,以及本人已歸還和未歸還圖書的信息。3.2.2信息收集圖書信息一種圖書:圖書的信息有“書名”“作者”“出版社”“ISBN書號”“分類號”等一本圖書:圖書館可能購入多本同一種書,這時每一本都稱為副本,用“副本條碼”唯一標識圖書館里的每一本書。注意,讀者借閱的是一本書,而不是一種書。借閱者信息借閱者的信息有“賬號”“性別”和“手機”等,如果允許借閱者自行查看借書的信息,那么還需要一個“密碼”圖書管理員信息圖書管理員(館員和系統(tǒng)管理員)的信息有“賬號”“性別”“手機”和“密碼”等借書信息借書的信息有“借出時間”和“借出經(jīng)手人”等還書信息還書的信息有“歸還時間”和“歸還經(jīng)手人”等借書和還書信息中,只要“歸還時間”為空,就表示書還沒歸還。同理,只要記錄“歸還時間”(同時記錄“歸還經(jīng)手人”),就表示該書已經(jīng)歸還3.2.2信息收集(續(xù))3.2.3系統(tǒng)功能設計系統(tǒng)功能設計如下圖所示3.2.4業(yè)務處理流程借書流程借閱者根據(jù)圖書分類號在書架上找到圖書,持該書到登記處辦理借書手續(xù),圖書管理員通過RFID閱讀器讀取借書卡(校園卡)上的RFID信息,得到借閱者的信息,再通過掃描圖書上的條形碼,得到所借圖書的副本條碼,再從副本條碼得到圖書的書名,然后把借書卡RFID信息、副本條碼、借書經(jīng)手人的主鍵、借書日期4項信息存入數(shù)據(jù)庫的借還書記錄中。還書流程借閱者本人或他人持圖書到登記處辦理還書手續(xù),圖書管理員通過掃描圖書上的條形碼,得到所借圖書的副本條碼,然后從數(shù)據(jù)庫借還書記錄中未歸還圖書的部分找出該副本條碼,將歸還日期更新為當前日期和時間,歸還經(jīng)手人更新為經(jīng)手人的主鍵。還書的唯一依據(jù)是圖書的副本條碼,這時不需要借閱者的任何信息。如果張三歸還了李四所借的圖書,這時實際歸還的是李四所借的圖書(依據(jù)是副本條碼),而不是張三所借的圖書,雖然這兩本書可能是同一種圖書。任務3數(shù)據(jù)結(jié)構(gòu)設計任務1深入理解關(guān)系數(shù)據(jù)庫任務2需求分析任務3數(shù)據(jù)結(jié)構(gòu)設計3.3.1建模工具軟件簡介3.3.2數(shù)據(jù)結(jié)構(gòu)設計的一些考慮3.3.3規(guī)范化設計3.3.4數(shù)據(jù)結(jié)構(gòu)的設計任務4數(shù)據(jù)結(jié)構(gòu)的實施3.3.1建模工具軟件簡介需要借助一些工具軟件來進行數(shù)據(jù)結(jié)構(gòu)設計,例如PowerDesigner:是數(shù)據(jù)建模領(lǐng)域主流的建模工具,適用于大型項目的開發(fā)EnterpriseArchitect:也是業(yè)界領(lǐng)先的數(shù)據(jù)建模工具,適用于大中型項目的開發(fā)MySQLWorkbench:MySQL提供的,滿足中小型項目開發(fā)的需求作為一個例子,了解一下PowerDesigner的功能:創(chuàng)建概念數(shù)據(jù)模型、邏輯數(shù)據(jù)模型、物理數(shù)據(jù)模型支持上述三種模型之間的轉(zhuǎn)換支持正向工程和逆向工程正向工程和逆向工程所有建模工具軟件都支持正向工程和逆向工程正向工程從物理數(shù)據(jù)模型到數(shù)據(jù)庫的轉(zhuǎn)換,通常的數(shù)據(jù)庫設計采用正向工程進行開發(fā)逆向工程從數(shù)據(jù)庫到物理數(shù)據(jù)模型的轉(zhuǎn)換,有時需要對已有的數(shù)據(jù)庫進行分析,這時可以采用逆向工程的手段獲得數(shù)據(jù)模型,并對數(shù)據(jù)模型進行修改,再進行正向工程,從而實現(xiàn)對已有數(shù)據(jù)庫的修改3.3.2數(shù)據(jù)結(jié)構(gòu)設計的一些考慮對于大型項目依次進行概念設計、邏輯設計和物理設計通過正向工程生成數(shù)據(jù)庫對于小型項目將概念設計、邏輯設計和物理設計合并為一個步驟,一步到位直接生成數(shù)據(jù)庫3.3.3規(guī)范化設計(步驟1)1.列出所有二維表檢查圖3.18、圖3.19和圖3.20所示的所有二維表,全部滿足關(guān)系的6項基本特征3.3.3規(guī)范化設計(步驟2)2.設置主鍵和外鍵為圖3.18、圖3.19和圖3.20所示的3張二維表設置主鍵,外鍵在后續(xù)步驟中設置3.3.3規(guī)范化設計(步驟3)3.檢查屬性值的原子性所有3張表中沒有違反屬性值原子性的數(shù)據(jù)3.3.3規(guī)范化設計(步驟4)4.檢查屬性值是否重復圖書信息表拆分為出版社表、圖書表和圖書副本表,從而消除重復的數(shù)據(jù)用戶表不需要拆分,只需要添加一個主鍵,將類型改為內(nèi)部編碼,消除重復值借還信息表包含的重復數(shù)據(jù)是上述表中已經(jīng)存在的,將相應的列改為外鍵,參照圖書副本表(圖書副本表還會參照圖書表),以及參照用戶表,修改后的借還表就沒有重復數(shù)據(jù)3.3.3規(guī)范化設計(步驟5)5.檢查表是否包含多個實體檢查拆分后的5張表,每張表都不包含多個實體。3.3.3規(guī)范化設計(步驟6)6.合并相同的實體檢查拆分后的5張表,不存在相同的實體,因此這5張表就是規(guī)范化的設計。從這5張表(圖3.27)可以看到,所有表的屬性值都是原子性的(滿足1NF的要求),也沒有含有重復屬性值的列,所有表只包含一個實體集,滿足“一個實體集一張表”的要求,因此達到了3NF的要求。3.3.4數(shù)據(jù)結(jié)構(gòu)的設計數(shù)據(jù)結(jié)構(gòu)的設計的結(jié)果如下圖所示,以及教材中第76~78頁表3.10~表3.14所示出版社表圖書表圖書副本表用戶表借還表數(shù)據(jù)結(jié)構(gòu)——用戶表用戶的類型:0=借閱者,1=館員,2=系統(tǒng)管理員數(shù)據(jù)結(jié)構(gòu)——出版社表和圖書表出版社表和圖書表,其中圖書表參照出版社表數(shù)據(jù)結(jié)構(gòu)——圖書副本表圖書副本表副本的狀態(tài):0=新購、1=可用、2=損壞、3=丟失副本表參照圖書表,一種圖書可能有多個副本數(shù)據(jù)結(jié)構(gòu)——借還表借還表借還表參照圖書副本表,因此讀者借的是副本,而不是圖書借還表還參照用戶表,并且有3個外鍵都是參照用戶表,分別是借閱者、借出經(jīng)手人和歸還經(jīng)手人數(shù)據(jù)結(jié)構(gòu)設計注意事項在數(shù)據(jù)結(jié)構(gòu)設計過程中,有許多細節(jié)需要考慮。在實施時,需要注意以下幾個方面。每張表應該是獨立的,不應該包含重復的數(shù)據(jù),滿足規(guī)范化設計的要求。每張表都必須有主鍵,表之間應建立外鍵約束。設計好表的每一列,明確表有多少列、每列的含義和作用。定義每一列的名稱,名稱應該有具體的含義,并按命名規(guī)范進行命名。根據(jù)列所保存的數(shù)據(jù)的性質(zhì),指定每一列的數(shù)據(jù)類型。設置主鍵約束、外鍵約束和其他約束(唯一性約束、非空約束和默認約束等)。為某些列建立索引,以提高查詢效率(索引在項目6講解)。任務5數(shù)據(jù)結(jié)構(gòu)的實施任務1深入理解關(guān)系數(shù)據(jù)庫任務2需求分析任務3數(shù)據(jù)結(jié)構(gòu)設計任務4數(shù)據(jù)結(jié)構(gòu)的實施3.4.1【實訓3–1】數(shù)據(jù)結(jié)構(gòu)的創(chuàng)建3.4.2【實訓3–2】數(shù)據(jù)結(jié)構(gòu)的變更3.4.3數(shù)據(jù)結(jié)構(gòu)與數(shù)據(jù)約束3.4.1【實訓3–1】數(shù)據(jù)結(jié)構(gòu)的創(chuàng)建根據(jù)Jitor校驗器的要求,在dbForge上完成“【實訓3–1】數(shù)據(jù)結(jié)構(gòu)的創(chuàng)建”創(chuàng)建數(shù)據(jù)庫,語法格式如下其中方括號內(nèi)的部分是可選的,因此下述兩條語句都是正確的打開數(shù)據(jù)庫,創(chuàng)建數(shù)據(jù)庫后,要打開它,然后在數(shù)據(jù)庫內(nèi)進行操作打開剛才創(chuàng)建的library數(shù)據(jù)庫【實訓3-1】Createdatabase數(shù)據(jù)庫名稱[characterset字符集[collate字符集校對]];Createdatabaselibrary;Createdatabaselibrarycharactersetutf8;Use數(shù)據(jù)庫名稱;Uselibrary;3.4.1【實訓3–1】數(shù)據(jù)結(jié)構(gòu)的創(chuàng)建(續(xù))創(chuàng)建數(shù)據(jù)表創(chuàng)建表的語法格式如下Createtable表名(列名1數(shù)據(jù)類型1[列級約束1],--每個列定義結(jié)束時加逗號,作為分隔列名2數(shù)據(jù)類型2[列級約束2],…列名n數(shù)據(jù)類型n[列級約束n]--最后一個列定義結(jié)束時不能加逗號,);--最后是一個反圓括號,以分號結(jié)束整條SQL語句3.4.1【實訓3–1】數(shù)據(jù)結(jié)構(gòu)的創(chuàng)建(續(xù))創(chuàng)建數(shù)據(jù)表(續(xù))(1)創(chuàng)建用戶表,SQL語句如下這條語句創(chuàng)建用戶表(lib_user),這張表有8列,是完全根據(jù)表3.10來編寫的。上述語句中的幾種列級約束如下。主鍵約束:主鍵(id_lib_user)的約束是primarykey,主鍵還必須同時是非空的notnull,對于整型的主鍵,還可以加上auto_increment(自增量)。非空約束:例如“姓名”(col_name)列擁有非空約束,而“性別”(col_sex)列則沒有非空約束。唯一性約束:“卡號”(col_rfid)列和“賬號”(col_account)列擁有唯一性約束默認約束:“用戶類別”(col_type)列有一個默認約束,其默認值是0Createtablelib_user(id_lib_userint(11)notnullprimarykeyauto_incrementcomment'用戶ID',col_rfidvarchar(16)uniquenotnullcomment'卡號',col_namevarchar(50)notnullcomment'姓名',col_accountvarchar(20)uniquenotnullcomment'賬號',col_passwordvarchar(50)notnullcomment'密碼',col_typetinyint(4)default0comment'類型,0=借閱者,1=館員,2=系統(tǒng)管理員',col_sexchar(1)defaultnullcomment'性別,M=男,F(xiàn)=女',col_mobilevarchar(16)defaultnullcomment'手機')comment='用戶表';3.4.1【實訓3–1】數(shù)據(jù)結(jié)構(gòu)的創(chuàng)建(續(xù))創(chuàng)建數(shù)據(jù)表(續(xù))(2)創(chuàng)建出版社表創(chuàng)建出版社表的SQL語句如下。(3)創(chuàng)建圖書表創(chuàng)建圖書表的SQL語句如下。Createtablelib_publisher(id_lib_publisherint(11)notnullprimarykeyauto_incrementcomment'出版社ID',col_namevarchar(50)uniquenotnullcomment'出版社')comment='出版社表';Createtablelib_book(id_lib_bookint(11)notnullprimarykeyauto_incrementcomment'圖書ID',col_titlevarchar(200)notnullcomment'書名',col_authorvarchar(50)notnullcomment'作者',col_isbnvarchar(50)uniquedefaultnullcomment'ISBN書號',col_call_numbervarchar(50)defaultnullcomment'分類號',col_pricefloatnotnullcomment'圖書價格',col_yearint(11)notnullcomment'出版年份',id_lib_publisherint(11)notnullcomment'出版社ID')comment='圖書表';3.4.1【實訓3–1】數(shù)據(jù)結(jié)構(gòu)的創(chuàng)建(續(xù))創(chuàng)建數(shù)據(jù)表(續(xù))(4)創(chuàng)建圖書副本表創(chuàng)建圖書副本表的SQL語句請讀者自行編寫。(5)創(chuàng)建借還表創(chuàng)建借還表的SQL語句請讀者在下述代碼的基礎(chǔ)上補充,下述代碼列出了3個外鍵,這3個外鍵都參照了用戶表,外鍵名加上表示含義的后綴。創(chuàng)建圖書副本表的SQL語句請讀者自行編寫。Createtablelib_lending(--省略部分列定義,請讀者補充id_lib_user1readerint(11)notnullcomment'借閱者ID',id_lib_user2lentint(11)notnullcomment'借出經(jīng)手人ID',id_lib_user3returnedint(11)defaultnullcomment'歸還經(jīng)手人ID')comment='借還表';3.4.1【實訓3–1】數(shù)據(jù)結(jié)構(gòu)的創(chuàng)建(續(xù))建立外鍵約束創(chuàng)建外鍵約束有兩種辦法。在創(chuàng)建表的同時創(chuàng)建外鍵約束。在創(chuàng)建表之后,通過修改表的方式,為表添加外鍵約束。建議采用第二種辦法,因為這種辦法比較靈活。因此,在創(chuàng)建上述5張數(shù)據(jù)表之后,再為表添加外鍵約束。為表添加外鍵約束的語法格式如下。這條SQL語句的意思是為“從表”添加一個名為“外鍵約束名”的外鍵(foreignkey)約束(constraint),“從表”的“外鍵”參照(references)“主表”的“主鍵”。Altertable從表addconstraint外鍵約束名foreignkey(外鍵)references主表(主鍵);3.4.1【實訓3–1】數(shù)據(jù)結(jié)構(gòu)的創(chuàng)建(續(xù))建立外鍵約束(續(xù))(1)圖書表的外鍵約束為圖書表(lib_book)的外鍵(id_lib_publisher)添加對出版社表(lib_publisher)主鍵(id_lib_publisher)的參照,外鍵名為“fk_lib_book_lib_publisher”。(2)圖書副本表的外鍵約束為圖書副本表(lib_copy)的外鍵(id_lib_book)添加對圖書表(lib_book)主鍵(id_lib_book)的參照,外鍵名為“fk_lib_copy_lib_book”。Altertablelib_bookaddconstraintfk_lib_book_lib_publisherforeignkey(id_lib_publisher)referenceslib_publisher(id_lib_publisher);該SQL語句請讀者自行編寫。3.4.1【實訓3–1】數(shù)據(jù)結(jié)構(gòu)的創(chuàng)建(續(xù))建立外鍵約束(續(xù))(3)借還表的外鍵約束(參照圖書副本表)為借還表添加對圖書副本表的外鍵約束,外鍵名為“fk_lib_lending_lib_copy”。(4)借還表的外鍵約束(參照用戶表)借還表有3個參照用戶表的外鍵,這3個外鍵的含義分別是借閱者、借出經(jīng)手人和歸還經(jīng)手人,因此3個外鍵有3個不同的名稱,而3個外鍵約束也應該有不同的名稱。下面為借還表分別添加3個外鍵約束,首先添加借閱者外鍵的約束,外鍵名為“fk_lib_lending_lib_user1”,在外鍵名的最后加一個數(shù)字以示區(qū)別。Altertablelib_lendingaddconstraintfk_lib_lending_lib_copyforeignkey(id_lib_copy)referenceslib_copy(id_lib_copy);Altertablelib_lendingaddconstraintfk_lib_lending_lib_user1foreignkey(id_lib_user1reader)referenceslib_user(id_lib_user);借出經(jīng)手人的外鍵約束名為“fk_lib_lending_lib_user2”,歸還經(jīng)手人的外鍵約束名為“fk_lib_lending_lib_user3”,對應的SQL語句請讀者自行編寫3.4.2【實訓3–2】數(shù)據(jù)結(jié)構(gòu)的變更根據(jù)Jitor校驗器的要求,在dbForge上完成“【實訓3–2】數(shù)據(jù)結(jié)構(gòu)的變更”1、列出數(shù)據(jù)庫和表的信息(1)列出數(shù)據(jù)庫名用下述命令列出MySQL服務器中所有數(shù)據(jù)庫的列表。(2)列出數(shù)據(jù)表名用下述命令列出當前數(shù)據(jù)庫中所有表的列表。(3)列出表的數(shù)據(jù)結(jié)構(gòu)用下述命令列出當前數(shù)據(jù)庫中指定表(lib_book)的數(shù)據(jù)結(jié)構(gòu),如教材第84頁圖3.33所示。【實訓3-2】Showdatabases;Uselibrary;Showtables;Describelib_book;3.4.2【實訓3–2】數(shù)據(jù)結(jié)構(gòu)的變更(續(xù))2、變更表表的變更(修改)可能涉及許多方面,可能是變更表中某個列的列名或列的數(shù)據(jù)類型,也可能是添加一列或丟棄一列,甚至是增加一個約束或丟棄一個約束。例如前面就詳細講解了增加外鍵約束,增加外鍵約束是最常見的操作之一。(1)增加列例如為出版社表增加一個備注列(列名“col_remark”,數(shù)據(jù)類型varchar(500))的代碼如下。如果重復增加列,會出現(xiàn)“Duplicatecolumnname'col_remark'”的錯誤信息,意思是不能增加相同的列(2)丟棄列例如丟棄剛才增加的備注列(col_remark)的代碼如下。如果重復丟棄同一個列,會出現(xiàn)“Can'tDROP'col_remark';checkthatcolumn/keyexists”的錯誤,意思是不能丟棄不存在的列。Altertablelib_publisheraddcolumncol_remarkvarchar(500)nullcomment'備注';Altertablelib_publisherdropcolumncol_remark;3.4.2【實訓3–2】數(shù)據(jù)結(jié)構(gòu)的變更(續(xù))2、變更表(續(xù))(3)變更列可以同時變更列名以及列的定義(數(shù)據(jù)類型、非空約束等)。例如變更“出版社”的列名的代碼如下,從原來的列名“col_name”改為“col_publisher_name”,同時變更數(shù)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論