




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
項(xiàng)目3設(shè)計(jì)數(shù)據(jù)庫
——圖書借閱數(shù)據(jù)庫任務(wù)1深入理解關(guān)系數(shù)據(jù)庫任務(wù)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ù)庫設(shè)計(jì) 3.1.6規(guī)范化設(shè)計(jì)的6步實(shí)施法任務(wù)2需求分析任務(wù)3數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)任務(wù)4數(shù)據(jù)結(jié)構(gòu)的實(shí)施3.1.1數(shù)據(jù)庫開發(fā)過程1.需求分析階段項(xiàng)目啟動(dòng)時(shí):要做一個(gè)什么樣的項(xiàng)目,有什么功能,列出所有需求項(xiàng)目驗(yàn)收時(shí):滿足需求,項(xiàng)目成功通過,否則項(xiàng)目失敗2.概念設(shè)計(jì)階段在最抽象的層面上對(duì)項(xiàng)目進(jìn)行設(shè)計(jì),一般采用ER模型(見“3.1.3ER模型”)進(jìn)行設(shè)計(jì)3.邏輯設(shè)計(jì)階段在概念設(shè)計(jì)的基礎(chǔ)上進(jìn)行詳細(xì)設(shè)計(jì),就是采用關(guān)系模型(見“3.1.4關(guān)系模型”),進(jìn)行設(shè)計(jì)4.物理設(shè)計(jì)階段在具體的數(shù)據(jù)庫(即MySQL)的層面上,對(duì)邏輯設(shè)計(jì)進(jìn)行補(bǔ)充、落實(shí)5.應(yīng)用開發(fā)階段實(shí)際編寫代碼,進(jìn)行項(xiàng)目開發(fā)。這個(gè)階段結(jié)束、項(xiàng)目可以驗(yàn)收,標(biāo)志著項(xiàng)目的完成6.運(yùn)行維護(hù)階段開發(fā)完成后,還要進(jìn)行維護(hù),保證項(xiàng)目能夠正常運(yùn)行。可能持續(xù)十幾年至幾十年1.需求分析階段1.需求分析階段這是數(shù)據(jù)庫開發(fā)的起點(diǎn),主要任務(wù)是調(diào)査、收集與分析用戶在數(shù)據(jù)處理中的數(shù)據(jù)需求、功能需求、完整性和安全性需求。經(jīng)過反復(fù)修改和用戶確認(rèn),最終形成需求分析報(bào)告,即軟件需求規(guī)格說明書這是項(xiàng)目設(shè)計(jì)和開發(fā)的最重要的依據(jù),也是項(xiàng)目驗(yàn)收的核心依據(jù)如果需求分析不完整,甚至出現(xiàn)了錯(cuò)誤,就會(huì)使開發(fā)出的項(xiàng)目達(dá)不到用戶的實(shí)際要求,導(dǎo)致項(xiàng)目開發(fā)失敗。如果在開發(fā)進(jìn)行的過程中,需求有補(bǔ)充或變更,將會(huì)使開發(fā)的工作量成倍增長(zhǎng),導(dǎo)致項(xiàng)目開發(fā)延期或失敗因此,需求分析是決定項(xiàng)目成敗的重要環(huán)節(jié)2.概念設(shè)計(jì)階段2.概念設(shè)計(jì)階段以需求分析的結(jié)果為依據(jù),將客觀事物及其聯(lián)系抽象為實(shí)體與屬性、實(shí)體與實(shí)體間的聯(lián)系,從而建立概念數(shù)據(jù)模型具體的內(nèi)容是實(shí)體、屬性以及實(shí)體間的聯(lián)系概念設(shè)計(jì)是指在不考慮任何物理因素(如軟件和硬件平臺(tái)、編程語言、數(shù)據(jù)庫管理系統(tǒng)等)的情況下,進(jìn)行數(shù)據(jù)建模的過程3.邏輯設(shè)計(jì)階段3.邏輯設(shè)計(jì)階段將上一階段得到的概念模型轉(zhuǎn)換成關(guān)系模型,成為程序員能夠理解和實(shí)施的模型,這樣的模型就是邏輯數(shù)據(jù)模型具體的內(nèi)容包括數(shù)據(jù)表的結(jié)構(gòu)、數(shù)據(jù)完整性約束(主鍵約束、外鍵約束等)邏輯設(shè)計(jì)是在不考慮具體數(shù)據(jù)庫管理系統(tǒng)選型的情況下,根據(jù)關(guān)系模型的要求進(jìn)行數(shù)據(jù)建模的過程。通常是在概念模型的基礎(chǔ)上構(gòu)建邏輯模型4.物理設(shè)計(jì)階段4.物理設(shè)計(jì)階段根據(jù)選定的數(shù)據(jù)庫管理系統(tǒng)的特點(diǎn)和處理的需要,對(duì)邏輯設(shè)計(jì)階段得到的關(guān)系模型進(jìn)行物理設(shè)計(jì),使其能夠在具體的數(shù)據(jù)庫管理系統(tǒng)上實(shí)施在數(shù)據(jù)表的結(jié)構(gòu)、數(shù)據(jù)完整性約束(主鍵約束、外鍵約束)的基礎(chǔ)上,增加列的數(shù)據(jù)類型、唯一性約束和非空約束等約束、視圖和索引等,使其最終成為在計(jì)算機(jī)上能夠運(yùn)行的模型物理設(shè)計(jì)是在選定的數(shù)據(jù)庫管理系統(tǒng)(如MySQL)的情況下,進(jìn)行數(shù)據(jù)建模的過程。通常是在邏輯模型的基礎(chǔ)上構(gòu)建物理模型5.應(yīng)用開發(fā)階段5.應(yīng)用開發(fā)階段根據(jù)需求分析的結(jié)果,特別是功能需求,使用數(shù)據(jù)庫管理系統(tǒng)提供的數(shù)據(jù)操縱和數(shù)據(jù)查詢功能,對(duì)數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行修改(插入、更新和刪除)以及檢索(查詢語句)操作在數(shù)據(jù)庫應(yīng)用系統(tǒng)開發(fā)過程中,通常是將數(shù)據(jù)庫管理系統(tǒng)提供的SQL語句嵌入在程序設(shè)計(jì)語言中,例如Java或PHP語言,為用戶提供良好的界面,對(duì)數(shù)據(jù)庫進(jìn)行增、刪、改,以及查詢操作。在項(xiàng)目1中,通過瀏覽器查看數(shù)據(jù)庫中的數(shù)據(jù),就是在Java語言中嵌入SQL語句實(shí)現(xiàn)的6.運(yùn)行維護(hù)階段6.運(yùn)行維護(hù)階段數(shù)據(jù)庫應(yīng)用系統(tǒng)開發(fā)調(diào)試完成后,還要在服務(wù)器上安裝部署,才能投入正式運(yùn)行。這時(shí),用戶可通過網(wǎng)絡(luò)訪問和使用服務(wù)器上的數(shù)據(jù)庫應(yīng)用系統(tǒng)在運(yùn)行過程中還需要維護(hù),維護(hù)的內(nèi)容包括保證數(shù)據(jù)庫的安全,數(shù)據(jù)庫的備份與恢復(fù),以及對(duì)數(shù)據(jù)庫的性能監(jiān)視、分析和改進(jìn),并不斷地進(jìn)行評(píng)估、調(diào)整與優(yōu)化數(shù)據(jù)庫項(xiàng)目的運(yùn)行維護(hù)是一個(gè)長(zhǎng)期的過程,只要用戶還在使用,就會(huì)需要維護(hù)教材全書結(jié)構(gòu)與數(shù)據(jù)庫開發(fā)過程3.1.2數(shù)據(jù)模型數(shù)據(jù)模型是對(duì)現(xiàn)實(shí)世界數(shù)據(jù)關(guān)系的抽象,用來描述數(shù)據(jù)、組織數(shù)據(jù)和對(duì)數(shù)據(jù)進(jìn)行操作1.?dāng)?shù)據(jù)模型三要素?cái)?shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)操作、數(shù)據(jù)完整性約束2.?dāng)?shù)據(jù)模型三層次概念數(shù)據(jù)模型(信息世界)、邏輯數(shù)據(jù)模型(機(jī)器世界)、物理數(shù)據(jù)模型(物理世界)3.四種典型的數(shù)據(jù)模型層次模型、網(wǎng)狀模型、關(guān)系模型、面向?qū)ο竽P?.?dāng)?shù)據(jù)模型三要素?cái)?shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)是對(duì)各種實(shí)體和實(shí)體間聯(lián)系的表達(dá)和實(shí)現(xiàn),實(shí)體是現(xiàn)實(shí)世界中客觀存在的事物在項(xiàng)目2里講解過聯(lián)系人數(shù)據(jù)庫的數(shù)據(jù)結(jié)構(gòu),每張表對(duì)應(yīng)現(xiàn)實(shí)世界中的一個(gè)實(shí)體,即類型表、人員表和電話表分別對(duì)應(yīng)聯(lián)系人類型、聯(lián)系人和聯(lián)系方式3個(gè)實(shí)體數(shù)據(jù)操作數(shù)據(jù)操作是對(duì)數(shù)據(jù)庫中各種實(shí)體進(jìn)行修改(插入、更新、刪除)和檢索(查詢)等操作,數(shù)據(jù)模型必須定義這些操作的確切含義、操作符號(hào)、操作規(guī)則和實(shí)現(xiàn)操作的語言項(xiàng)目1和項(xiàng)目2簡(jiǎn)單講解了數(shù)據(jù)的插入和數(shù)據(jù)的查詢,但還沒有講解數(shù)據(jù)的更新和刪除數(shù)據(jù)完整性約束數(shù)據(jù)完整性約束是對(duì)數(shù)據(jù)庫中各種實(shí)體及其聯(lián)系的約束性規(guī)定,用以保證數(shù)據(jù)庫中數(shù)據(jù)的正確性、一致性和可靠性。數(shù)據(jù)完整性約束可以有效避免數(shù)據(jù)庫中存在不符合語義規(guī)定的數(shù)據(jù),防止因錯(cuò)誤的數(shù)據(jù)而造成無效操作或錯(cuò)誤操作在項(xiàng)目2講解過的主鍵和外鍵,就是最重要的兩種數(shù)據(jù)約束,還有一些數(shù)據(jù)完整性約束將在后面再講解2.?dāng)?shù)據(jù)模型三層次概念數(shù)據(jù)模型(信息世界)概念數(shù)據(jù)模型(ConceptualDataModel)對(duì)應(yīng)概念設(shè)計(jì)階段,是對(duì)現(xiàn)實(shí)世界的認(rèn)識(shí)和抽象描述,從用戶的角度對(duì)實(shí)體及其聯(lián)系建立概念化的模型,從而對(duì)信息世界進(jìn)行建模。常用的概念模型有ER模型,將在“3.1.3ER模型”講解通俗地說,概念模型是以使用者能夠理解的方式來描述問題邏輯數(shù)據(jù)模型(機(jī)器世界)邏輯數(shù)據(jù)模型(LogicalDataModel)對(duì)應(yīng)邏輯設(shè)計(jì)階段,是從計(jì)算機(jī)的角度,將概念模型轉(zhuǎn)換為數(shù)據(jù)庫管理系統(tǒng)支持的某一種數(shù)據(jù)模型(如關(guān)系數(shù)據(jù)模型,將在“3.1.4關(guān)系模型”講解),用于對(duì)機(jī)器世界的建模通俗地說,邏輯模型是以程序員能夠理解的方式來描述問題物理數(shù)據(jù)模型(物理世界)物理數(shù)據(jù)模型(PhysicalDataModel)對(duì)應(yīng)物理設(shè)計(jì)階段,是邏輯模型在具體的計(jì)算機(jī)系統(tǒng)(包括硬件、軟件和操作系統(tǒng),以及DBMS,如MySQL等)上的實(shí)現(xiàn),例如項(xiàng)目2中設(shè)計(jì)好的數(shù)據(jù)結(jié)構(gòu)(見“2.1.2數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)”小節(jié)中的表2.11、表2.12和表2.13)通俗地說,物理模型是以計(jì)算機(jī)能夠理解的方式來描述問題下一節(jié)講解ER模型,本章講解關(guān)系模型,全書講解MySQL3.幾種典型的數(shù)據(jù)模型層次模型(HierarchicalModel)最早出現(xiàn)的一種數(shù)據(jù)模型,它的數(shù)據(jù)結(jié)構(gòu)是用樹形結(jié)構(gòu)來表示各類實(shí)體以及實(shí)體之間的聯(lián)系,它的結(jié)構(gòu)過于簡(jiǎn)單,無法完整地描述現(xiàn)實(shí)世界。層次模型流行于20世紀(jì)60~70年代,已淘汰網(wǎng)狀模型(NetworkModel)是對(duì)層次模型的擴(kuò)展,它的數(shù)據(jù)結(jié)構(gòu)是網(wǎng)狀的,從而導(dǎo)致結(jié)構(gòu)復(fù)雜,難以擴(kuò)充和維護(hù)。網(wǎng)狀模型流行于20世紀(jì)60~80年代,已淘汰關(guān)系模型(RelationalModel)用二維表結(jié)構(gòu)來表示各類實(shí)體以及實(shí)體之間的聯(lián)系。關(guān)系模型誕生于20世紀(jì)70年代,直到如今都是主流的數(shù)據(jù)庫技術(shù)在項(xiàng)目1和項(xiàng)目2中采用的都是二維表,也就是關(guān)系模型。本書講解的就是關(guān)系模型,以及基于關(guān)系模型的關(guān)系數(shù)據(jù)庫面向?qū)ο竽P兔嫦驅(qū)ο竽P停∣bjectOrientedModel)是一種采用面向?qū)ο蠹夹g(shù)來進(jìn)行數(shù)據(jù)建模的技術(shù)。面向?qū)ο竽P驼Q生于20世紀(jì)70年代,是一種有發(fā)展?jié)摿Φ臄?shù)據(jù)模型,例如本書第3頁表1.1中提到的排名第4的PostgreSQL就是一種同時(shí)具有關(guān)系模型和面向?qū)ο竽P吞卣鞯臄?shù)據(jù)庫管理系統(tǒng)3.1.3ER模型ER模型是概念設(shè)計(jì)階段建立的模型,主要關(guān)注以下內(nèi)容1.常用術(shù)語實(shí)體(Entity)、實(shí)體集(EntitySet)、屬性(Attribute)、屬性值(Attributevalue)、域(Domain)、鍵(Key)2.實(shí)體聯(lián)系圖用矩形表示實(shí)體用圓形表示屬性用菱形表示實(shí)體間的聯(lián)系3.實(shí)體間的聯(lián)系,有三種一對(duì)一聯(lián)系一對(duì)多聯(lián)系多對(duì)多聯(lián)系1.常用術(shù)語實(shí)體(Entity)客觀存在并可相互區(qū)別的事物稱為實(shí)體。實(shí)體可以是具體的人、事、物或抽象的概念,如一位學(xué)生、一本書、一門課程、一份成績(jī)或聯(lián)系人類型等實(shí)體集(EntitySet)同一類型實(shí)體的集合稱為實(shí)體集,如一個(gè)班級(jí)的全體學(xué)生就是一個(gè)實(shí)體集。常常簡(jiǎn)稱為實(shí)體屬性(Attribute)對(duì)實(shí)體特性的描述稱為屬性,如描述學(xué)生實(shí)體的屬性有學(xué)號(hào)、姓名、出生日期、性別等屬性值(Attributevalue)屬性值是某個(gè)實(shí)體的屬性的取值,如“SW390105”“方博涵”“2004-11-15”“女”是方博涵這個(gè)學(xué)生實(shí)體的屬性值域(Domain)屬性值的取值范圍稱為域,如學(xué)號(hào)域?yàn)?個(gè)字母加6個(gè)數(shù)字的字符串、性別域?yàn)椤澳小焙汀芭辨I(Key)能夠唯一標(biāo)識(shí)實(shí)體集中一個(gè)實(shí)體的屬性或?qū)傩约?,稱為實(shí)體的鍵。鍵是一個(gè)重要的概念,在項(xiàng)目1講解了主鍵,在項(xiàng)目2又講解了外鍵,在“3.1.4關(guān)系模型”的第3部分“候選鍵、主鍵和外鍵”還要做深入的講解。2.實(shí)體聯(lián)系圖矩形表示實(shí)體圓形表示屬性,并用無箭頭直線標(biāo)出實(shí)體與屬性的關(guān)系菱形表示實(shí)體間的聯(lián)系,并用無箭頭直線標(biāo)出實(shí)體間的聯(lián)系,還可以加上聯(lián)系的類型2.實(shí)體聯(lián)系圖(續(xù))例如下圖是項(xiàng)目2的聯(lián)系人數(shù)據(jù)庫對(duì)應(yīng)的ERD其中有3個(gè)實(shí)體類型、人員和電話每個(gè)實(shí)體都有屬性,如人員有名為“姓名”的屬性實(shí)體之間有聯(lián)系,例如類型和人員之間有名為“屬于”的聯(lián)系還要標(biāo)記聯(lián)系的類型,例如類型和人員是一對(duì)多(1:n)的聯(lián)系3.實(shí)體間的聯(lián)系一對(duì)一聯(lián)系例如一個(gè)班級(jí)只有一個(gè)班主任,一個(gè)班主任只管理一個(gè)班級(jí)一對(duì)多聯(lián)系例如一個(gè)班級(jí)有多個(gè)學(xué)生,一個(gè)學(xué)生只屬于一個(gè)班級(jí),見圖3.2多對(duì)多聯(lián)系例如一個(gè)學(xué)生可以選多門課程,一門課程可以有多個(gè)學(xué)生選修,見圖3.23.1.4關(guān)系模型關(guān)系模型是邏輯設(shè)計(jì)階段建立的模型,是關(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)系是一個(gè)二維表,表中的行稱為元組,表中的列稱為數(shù)據(jù)項(xiàng)例如項(xiàng)目1的氣象記錄就是一個(gè)關(guān)系,如圖3.5所示微課:3-1關(guān)系模型1.關(guān)系的定義(續(xù))關(guān)系是一個(gè)二維表,必須滿足關(guān)系的6項(xiàng)基本特征(見表3.2)1.關(guān)系的定義(續(xù))在關(guān)系的6項(xiàng)基本特征中,前5項(xiàng)比較好理解第6項(xiàng),列的原子性(也稱為屬性的原子性)需要解釋一下例如圖3.3中,溫度列不是原子性的,因?yàn)樗环譃閮蓚€(gè)子屬性,最高溫度和最低溫度而在圖3.4中,取消了溫度列,這里,所有列都是原子性的,包括最高溫度和最低溫度如果把圖3.3的表看作三維表,把圖3.4的表看作二維表,則“二維表”這個(gè)詞就很好地表示了列的原子性這個(gè)特征1.關(guān)系的定義(續(xù))在概念模型、關(guān)系模型和物理模型中,一些概念是相同的,但是具有不同的名稱表3.3列出這些術(shù)語,表中在同一行的術(shù)語是同義詞雖然它們是同義詞,但是不同的術(shù)語仍然隱含了一些特定的含義,因此本書會(huì)根據(jù)場(chǎng)合的不同,使用不同的術(shù)語2.關(guān)系的表示關(guān)系由關(guān)系名和數(shù)據(jù)項(xiàng)組成,在關(guān)系代數(shù)中,可以用下述方式表示一個(gè)關(guān)系關(guān)系名(數(shù)據(jù)項(xiàng)1,數(shù)據(jù)項(xiàng)2,…,數(shù)據(jù)項(xiàng)n)例如,氣象記錄的關(guān)系可以表示如下氣象記錄(序號(hào),日期和時(shí)間,觀測(cè)點(diǎn),溫度,風(fēng)速)3.候選鍵、主鍵和外鍵候選鍵(AlternateKey或CandidateKey)能夠唯一標(biāo)識(shí)一個(gè)元組(實(shí)體)的屬性或?qū)傩约Q為候選鍵。在表示學(xué)生信息的二維表中,“學(xué)號(hào)”和“身份證號(hào)”都可以作為唯一標(biāo)識(shí)學(xué)生的屬性,因此這兩個(gè)屬性都是候選鍵候選鍵也可能是由多個(gè)屬性組成的屬性集,如一個(gè)“成績(jī)”實(shí)體,擁有“姓名”“課程名”和“成績(jī)”3個(gè)屬性,這時(shí)候選鍵是“姓名”和“課程名”的屬性集,因?yàn)椤靶彰被颉罢n程名”都不能獨(dú)自唯一標(biāo)識(shí)一個(gè)“成績(jī)”,只有“姓名”和“課程名”的組合才能唯一標(biāo)識(shí)一個(gè)“成績(jī)”3.候選鍵、主鍵和外鍵(續(xù))主鍵(PrimaryKey)在候選鍵中指定其中一個(gè)作為主要候選鍵,簡(jiǎn)稱為主鍵。例如,在學(xué)生表中,可以指定學(xué)號(hào)為主鍵,也可以指定身份證號(hào)為主鍵,但只能取其中之一在實(shí)際開發(fā)中,應(yīng)該添加一個(gè)無業(yè)務(wù)含義的屬性作為主鍵,其值由程序自動(dòng)生成,這樣的主鍵可以稱為唯一標(biāo)識(shí)(Identity,id),在項(xiàng)目1和項(xiàng)目2的兩個(gè)案例中都是這樣做的3.候選鍵、主鍵和外鍵(續(xù))外鍵(ForeignKey)關(guān)系中的某個(gè)屬性或?qū)傩约m然不是該關(guān)系的主鍵,但卻是另外一個(gè)關(guān)系的主鍵,則稱其為外鍵。換句話說,外鍵是在本關(guān)系中標(biāo)識(shí)另外一個(gè)關(guān)系中的實(shí)體的屬性或?qū)傩约陧?xiàng)目2的聯(lián)系人數(shù)據(jù)庫中,就對(duì)人員表和電話表分別設(shè)計(jì)了外鍵。主鍵唯一標(biāo)識(shí)本表的一個(gè)實(shí)體(行)。外鍵標(biāo)識(shí)了其他表中的特定的實(shí)體(行),這時(shí),外鍵參照(引用)了主表的實(shí)體(行)4.關(guān)系模型的三要素1、關(guān)系模型的數(shù)據(jù)結(jié)構(gòu)是二維數(shù)據(jù)表(即關(guān)系)。關(guān)系模型的數(shù)據(jù)結(jié)構(gòu)非常簡(jiǎn)單,實(shí)體以及實(shí)體之間的聯(lián)系都是用關(guān)系來表示。因此,可以用簡(jiǎn)單的模型來表示非常復(fù)雜的現(xiàn)實(shí)世界在關(guān)系的定義中,已經(jīng)對(duì)關(guān)系的數(shù)據(jù)結(jié)構(gòu)作了詳細(xì)的討論。這里不再贅述4.關(guān)系模型的三要素(續(xù))2、關(guān)系模型的數(shù)據(jù)操作關(guān)系模型的數(shù)據(jù)操作叫作關(guān)系操作,關(guān)系操作是對(duì)關(guān)系模型中的元組進(jìn)行修改(插入、刪除、更新)和檢索(查詢)等的操作。在關(guān)系模型中,理論上是采用關(guān)系代數(shù)語言實(shí)現(xiàn)關(guān)系操作,實(shí)際編程中是采用SQL語言進(jìn)行關(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)系是元組的集合,對(duì)關(guān)系的運(yùn)算就是對(duì)集合的運(yùn)算,運(yùn)算的結(jié)果是集合,這個(gè)集合也是關(guān)系。因此,關(guān)系操作的運(yùn)算結(jié)果也是關(guān)系。關(guān)系模型以堅(jiān)實(shí)的數(shù)學(xué)理論(關(guān)系代數(shù)、集合論和數(shù)理邏輯)為基礎(chǔ),可以對(duì)數(shù)據(jù)進(jìn)行嚴(yán)格的定義、規(guī)范化和運(yùn)算,這是關(guān)系數(shù)據(jù)庫成為主流技術(shù)的根本原因。4.關(guān)系模型的三要素(續(xù))3、關(guān)系模型的數(shù)據(jù)完整性約束(三種)實(shí)體完整性約束(主鍵約束)指任何一個(gè)關(guān)系必須有且只有一個(gè)主鍵,主鍵的值不能重復(fù),也不能為空。簡(jiǎn)單來說,就是不允許存在一個(gè)缺少唯一標(biāo)識(shí)的實(shí)體。參照完整性約束(外鍵約束)指外鍵的值可以為空或不能為空,但其值必須是所參照的表的主鍵的值。簡(jiǎn)單來說,就是不允許參照一個(gè)不存在的實(shí)體。用戶定義完整性約束:反映了具體應(yīng)用中的業(yè)務(wù)需求,主要是下述三種約束非空約束:例如,學(xué)生的姓名不能為空唯一性約束:例如學(xué)生的身份證號(hào)不允許重復(fù)默認(rèn)約束:例如學(xué)生的婚姻狀態(tài)默認(rèn)為“未婚”5.ER模型向關(guān)系模型的轉(zhuǎn)換實(shí)體的轉(zhuǎn)換實(shí)體可以直接轉(zhuǎn)換為關(guān)系,轉(zhuǎn)換的規(guī)則如下。實(shí)體名轉(zhuǎn)換為關(guān)系名。實(shí)體的屬性轉(zhuǎn)換為關(guān)系的屬性。實(shí)體的鍵轉(zhuǎn)換為關(guān)系的鍵。聯(lián)系的轉(zhuǎn)換聯(lián)系的轉(zhuǎn)換需要根據(jù)聯(lián)系的類型,采用不同的規(guī)則進(jìn)行轉(zhuǎn)換一對(duì)多聯(lián)系:轉(zhuǎn)換為主鍵和外鍵的參照一對(duì)一聯(lián)系:轉(zhuǎn)換為主鍵和外鍵(添加唯一性約束)的參照多對(duì)多聯(lián)系:轉(zhuǎn)換為兩個(gè)一對(duì)多聯(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ù)庫設(shè)計(jì)1.關(guān)系中的異常2.范式理論3.關(guān)系中異常的消除4.規(guī)范化設(shè)計(jì)的6步實(shí)施法1.關(guān)系中的異常一個(gè)好的關(guān)系模型應(yīng)該具備以下兩個(gè)條件:①盡可能少的數(shù)據(jù)冗余;②沒有插入異常、刪除異常和更新異常微課:3-3關(guān)系數(shù)據(jù)庫的設(shè)計(jì)數(shù)據(jù)冗余班主任“李進(jìn)中”的名字和電話在數(shù)據(jù)中多次出現(xiàn),這種現(xiàn)象稱為數(shù)據(jù)冗余。冗余的數(shù)據(jù)會(huì)浪費(fèi)大量的存儲(chǔ)空間,并且也會(huì)降低數(shù)據(jù)庫的運(yùn)行效率。更新異常當(dāng)班主任“李進(jìn)中”更換了電話號(hào)碼,這時(shí)必須更新“軟件31431”班所有學(xué)生的班主任電話。如果由于某種原因只更新了一部分,這時(shí)就會(huì)出現(xiàn)更新異常刪除異常如果刪除了學(xué)生“趙六”,由于趙六是班上的最后一名學(xué)生,這時(shí)班級(jí)“軟件31432”和班主任“汪一萍”的信息就會(huì)隨之消失。這是由于刪除學(xué)生而導(dǎo)致意外刪除了班級(jí)和教師,這時(shí)就會(huì)出現(xiàn)刪除異常插入異常如果學(xué)校新來了一位教師“張明亮”,由于他還沒有擔(dān)任班主任,當(dāng)插入這位教師的信息后,會(huì)引起班級(jí)為空,以及主鍵“學(xué)號(hào)”為空的情況。這時(shí)就出現(xiàn)了插入異常2.范式理論函數(shù)依賴第一范式(1NF)第二范式(2NF)第三范式(3NF)函數(shù)依賴第一范式(1NF)如果一個(gè)關(guān)系滿足關(guān)系模型的基本特征(見“3.1.4關(guān)系模型”中關(guān)系的定義),并且屬性的值只包含域中的一個(gè)單一的值,則稱該關(guān)系屬于第一范式(1NF)。就是說,屬性值必須滿足原子性的要求。對(duì)于圖3.12所示的關(guān)系,“李四”的“電話號(hào)碼”保存了兩個(gè)值,違反了屬性值原子性的要求,因此達(dá)不到1NF的要求。注:第一范式的要求是屬性值必須滿足原子性的要求,而在關(guān)系的基本特征中有一條是屬性必須滿足原子性的要求。注意,前者是屬性值,后者是屬性。第一范式(1NF)——解決方案一第一范式(1NF)——解決方案二第二范式(2NF)如果一個(gè)關(guān)系已經(jīng)屬于1NF,另外再滿足一個(gè)條件,每個(gè)非主屬性(不構(gòu)成候選鍵的屬性)都必須完全依賴于候選鍵,不能部分依賴于候選鍵,則稱該關(guān)系屬于第二范式(2NF)就是說,不能存在某個(gè)非主屬性只依賴于候選鍵的一部分的情況。第二范式(2NF)——解決方案第三范式(3NF)如果一個(gè)關(guān)系已經(jīng)屬于2NF,另外再滿足一個(gè)條件,每個(gè)非主屬性(不構(gòu)成候選鍵的屬性)都必須直接依賴于候選鍵,不能傳遞依賴于候選鍵,則稱該關(guān)系屬于第三范式(3NF)就是說,不能存在非主屬性A依賴于非主屬性B,非主屬性B再依賴于候選鍵的情況。第三范式(3NF)——解決方案范式理論總結(jié)范式理論是關(guān)系數(shù)據(jù)庫理論的核心規(guī)范化設(shè)計(jì)需要滿足下述3個(gè)要求。滿足關(guān)系模型的6項(xiàng)基本特征:見“3.1.4關(guān)系模型”關(guān)系的定義的表3.2。滿足關(guān)系模型的數(shù)據(jù)完整性約束:主要是主鍵約束和外鍵約束。滿足范式理論的要求:主要是滿足1NF、2NF和3NF的要求,總結(jié)如表3.7所示。3.關(guān)系中異常的消除下面對(duì)前面“關(guān)系中的異?!碧岢龅睦舆M(jìn)行分析,圖3.10所示對(duì)應(yīng)的關(guān)系如下。在這個(gè)關(guān)系中,“學(xué)號(hào)”是主鍵,“班主任”和“班主任電話”通過“班級(jí)名稱”傳遞依賴于“學(xué)號(hào)”,根據(jù)規(guī)范化設(shè)計(jì)的要求,可以拆分為如下兩個(gè)關(guān)系。兩個(gè)關(guān)系各添加一個(gè)主鍵,學(xué)生關(guān)系添加一個(gè)外鍵,參照班級(jí)關(guān)系的主鍵。這時(shí)在班級(jí)關(guān)系中,“班主任電話”通過“班主任姓名”,傳遞依賴于“班級(jí)編號(hào)”,因此還要進(jìn)一步拆分,結(jié)果如下。學(xué)生(班級(jí)名稱,班主任,班主任電話,學(xué)號(hào),姓名,性別)班級(jí)(班級(jí)編號(hào),班級(jí)名稱,班主任姓名,班主任電話)學(xué)生(學(xué)生編號(hào),學(xué)號(hào),姓名,性別,班級(jí)編號(hào))班主任(班主任編號(hào),班主任姓名,班主任電話)班級(jí)(班級(jí)編號(hào),班級(jí)名稱,班主任編號(hào))學(xué)生(學(xué)生編號(hào),學(xué)號(hào),姓名,性別,班級(jí)編號(hào))3.關(guān)系中異常的消除將剛才的討論用表格的形式來解釋,如下圖所示圖3.11的關(guān)系拆分為三個(gè)關(guān)系數(shù)據(jù)冗余最小沒有更新異常、刪除異常和插入異常3.1.6規(guī)范化設(shè)計(jì)的6步實(shí)施法通過前面的討論,可以總結(jié)出規(guī)范化設(shè)計(jì)的6步實(shí)施法,如表3.9所示(1)列出所有二維表從需求分析中收集將要存入數(shù)據(jù)庫的所有數(shù)據(jù),按照關(guān)系模型基本特征的要求列出所有二維表,不能有任何遺漏,也不要有重復(fù)。每張表不應(yīng)只有列名,還應(yīng)該包含測(cè)試數(shù)據(jù),以便加深對(duì)數(shù)據(jù)之間聯(lián)系的理解,更好地進(jìn)行規(guī)范化設(shè)計(jì)每張表可能包含一個(gè)或多個(gè)實(shí)體集,從設(shè)計(jì)開始,就要關(guān)注實(shí)體之間的聯(lián)系,盡可能不要在一張表中包含多個(gè)實(shí)體集。在這一步,雖然允許在一張表中包含多個(gè)實(shí)體集,但要在后面的步驟中進(jìn)行拆分完成后,可以滿足關(guān)系的基本特征(2)設(shè)置主鍵和外鍵參照關(guān)系模型的數(shù)據(jù)完整性約束有下述兩個(gè)基本要求主鍵約束:為每張表設(shè)置一個(gè)主鍵,通常是整型的,并且設(shè)置為自動(dòng)增量外鍵約束:通常每張表至少與另一張表有聯(lián)系,從表的外鍵參照主表的主鍵;要么參照別的表,要么被別的表參照,也有可能兩者兼而有之,只在極少情況下會(huì)出現(xiàn)獨(dú)立的表根據(jù)主鍵約束的要求,為所有表添加一個(gè)無業(yè)務(wù)含義的主鍵根據(jù)外鍵約束的要求,檢查所有表,檢查它們之間是否存在一對(duì)一、一對(duì)多和多對(duì)多的聯(lián)系,如果有,則按照“3.1.4關(guān)系模型”ER模型向關(guān)系模型的轉(zhuǎn)換中講解的辦法設(shè)置外鍵,并標(biāo)出所參照的主鍵。如果是多對(duì)多的聯(lián)系,還需要把聯(lián)系轉(zhuǎn)換為關(guān)系,即添加一張新的表,并在新表中添加兩個(gè)外鍵,分別參照原來的實(shí)體的主鍵對(duì)表進(jìn)行拆分時(shí),新拆分出來的表需要添加主鍵,原來表的相關(guān)屬性通常替換為外鍵,參照新表的主鍵。拆分表和建立表之間的聯(lián)系是同步進(jìn)行的,拆分出來的兩張表之間必定存在主從聯(lián)系,此時(shí)讀者應(yīng)該立即在從表中加上外鍵,以免遺忘或者混淆完成后,可以基本滿足關(guān)系模型對(duì)數(shù)據(jù)完整性約束的要求。在后續(xù)步驟中拆分表時(shí),還要確保滿足這個(gè)要求(3)檢查屬性值的原子性檢查所有表,找出屬性值中包含多個(gè)值的屬性(某一行的屬性值中包含多個(gè)值),例如前述包含兩個(gè)電話號(hào)碼(見圖3.12)的屬性,然后根據(jù)業(yè)務(wù)需求采用下述方式中的一種進(jìn)行處理拆分屬性:將一個(gè)屬性拆分為多個(gè)屬性,分別保存多個(gè)值。這種方式的缺點(diǎn)是只能保存有限個(gè)值拆分表:將屬性獨(dú)立出來成為一張表。原表和新表之間是一對(duì)多的聯(lián)系,新表中添加主鍵和一個(gè)外鍵,這個(gè)外鍵參照原表的主鍵完成后,可以達(dá)到1NF的要求(4)檢查屬性值是否重復(fù)檢查所有表,找出含有重復(fù)值的屬性(某一列的不同行包含相同的屬性值),具有重復(fù)值的屬性常常是屬于另外的實(shí)體。有重復(fù)值的屬性表示可能存在多個(gè)實(shí)體,按照“一個(gè)實(shí)體集一張表”的原則,對(duì)表進(jìn)行拆分(4)檢查屬性值是否重復(fù)(續(xù))要注意下述兩種情況假性重復(fù)例如“成績(jī)”列會(huì)有許多相同的值,但不能認(rèn)為是重復(fù)值,因?yàn)橄嗤某煽?jī)?cè)诒举|(zhì)上不是重復(fù),只是碰巧出現(xiàn)了相同的值隱性重復(fù)沒有在測(cè)試數(shù)據(jù)中反映出來的重復(fù),當(dāng)數(shù)據(jù)量足夠大時(shí),某些屬性的值可能會(huì)出現(xiàn)重復(fù),這種情況也應(yīng)該加以考慮完成后,可以將表中的多數(shù)實(shí)體獨(dú)立出來,但不能保證達(dá)到2NF或3NF的要求,因?yàn)檫€可能有一些實(shí)體沒有獨(dú)立出來(5)檢查表是否包含多個(gè)實(shí)體再次檢查每一張表,分析表中是否含有多個(gè)實(shí)體(即是否存在部分依賴或傳遞依賴),按照“一個(gè)實(shí)體集一張表”的原則,如果有多個(gè)實(shí)體就要將其獨(dú)立出來。這時(shí),原表和新表間的聯(lián)系有可能是一對(duì)一聯(lián)系,也有可能是一對(duì)多或多對(duì)多的聯(lián)系。依次檢查每一個(gè)屬性,如果不屬于所在表的同一個(gè)實(shí)體,就應(yīng)該將其獨(dú)立出來作為一個(gè)實(shí)體。具體處理方式如下一對(duì)一聯(lián)系將表拆分為兩個(gè)實(shí)體,從屬的一方添加外鍵(加上唯一性約束),參照另一方的主鍵。這種情況比較常見,因?yàn)榍懊娴牟襟E對(duì)此沒有考慮,需要加以注意一對(duì)多聯(lián)系將表拆分為兩個(gè)實(shí)體,“多”的一方添加外鍵,參照“一”的一方的主鍵。這種情況應(yīng)該在前一步驟中檢查出來,由于是隱性重復(fù),所以可能會(huì)導(dǎo)致疏漏多對(duì)多聯(lián)系將聯(lián)系獨(dú)立出來作為一個(gè)實(shí)體(二維表),添加兩個(gè)外鍵,分別參照原來的兩個(gè)實(shí)體的主鍵。這種情況應(yīng)該在前面的步驟中完成,通常這時(shí)不會(huì)出現(xiàn)(6)合并相同的實(shí)體前述步驟拆分出來的實(shí)體可能存在相同的實(shí)體,相同的實(shí)體一般具有相同的主鍵和相同的屬性,屬性可能全部相同,也可能部分相同,應(yīng)該將相同的實(shí)體合并成一個(gè)實(shí)體完成后,就能夠達(dá)到3NF的要求,完成規(guī)范化的設(shè)計(jì)規(guī)范化設(shè)計(jì)總結(jié)前述6個(gè)步驟總結(jié)如表3.9所示,設(shè)計(jì)的總原則就是“一個(gè)實(shí)體集一張表”任務(wù)2需求分析任務(wù)1深入理解關(guān)系數(shù)據(jù)庫任務(wù)2需求分析3.2.1需求描述3.2.2信息收集3.2.3系統(tǒng)功能設(shè)計(jì)3.2.4業(yè)務(wù)處理流程任務(wù)3數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)任務(wù)4數(shù)據(jù)結(jié)構(gòu)的實(shí)施3.2.1需求描述項(xiàng)目概況項(xiàng)目名稱:小型圖書借閱系統(tǒng)數(shù)據(jù)庫名:library需求概述本項(xiàng)目討論一個(gè)小型圖書借閱系統(tǒng)的開發(fā)過程,適合50~100人的小型公司內(nèi)部使用,圖書管理人員是兼職的。目標(biāo)用戶是圖書管理員和普通借閱者,基本需求如下圖書管理員:能夠管理圖書、借閱者,以及進(jìn)行借書和還書操作。普通借閱者:能夠查詢館藏圖書的情況,以及本人已歸還和未歸還圖書的信息。3.2.2信息收集圖書信息一種圖書:圖書的信息有“書名”“作者”“出版社”“ISBN書號(hào)”“分類號(hào)”等一本圖書:圖書館可能購入多本同一種書,這時(shí)每一本都稱為副本,用“副本條碼”唯一標(biāo)識(shí)圖書館里的每一本書。注意,讀者借閱的是一本書,而不是一種書。借閱者信息借閱者的信息有“賬號(hào)”“性別”和“手機(jī)”等,如果允許借閱者自行查看借書的信息,那么還需要一個(gè)“密碼”圖書管理員信息圖書管理員(館員和系統(tǒng)管理員)的信息有“賬號(hào)”“性別”“手機(jī)”和“密碼”等借書信息借書的信息有“借出時(shí)間”和“借出經(jīng)手人”等還書信息還書的信息有“歸還時(shí)間”和“歸還經(jīng)手人”等借書和還書信息中,只要“歸還時(shí)間”為空,就表示書還沒歸還。同理,只要記錄“歸還時(shí)間”(同時(shí)記錄“歸還經(jīng)手人”),就表示該書已經(jīng)歸還3.2.2信息收集(續(xù))3.2.3系統(tǒng)功能設(shè)計(jì)系統(tǒng)功能設(shè)計(jì)如下圖所示3.2.4業(yè)務(wù)處理流程借書流程借閱者根據(jù)圖書分類號(hào)在書架上找到圖書,持該書到登記處辦理借書手續(xù),圖書管理員通過RFID閱讀器讀取借書卡(校園卡)上的RFID信息,得到借閱者的信息,再通過掃描圖書上的條形碼,得到所借圖書的副本條碼,再從副本條碼得到圖書的書名,然后把借書卡RFID信息、副本條碼、借書經(jīng)手人的主鍵、借書日期4項(xiàng)信息存入數(shù)據(jù)庫的借還書記錄中。還書流程借閱者本人或他人持圖書到登記處辦理還書手續(xù),圖書管理員通過掃描圖書上的條形碼,得到所借圖書的副本條碼,然后從數(shù)據(jù)庫借還書記錄中未歸還圖書的部分找出該副本條碼,將歸還日期更新為當(dāng)前日期和時(shí)間,歸還經(jīng)手人更新為經(jīng)手人的主鍵。還書的唯一依據(jù)是圖書的副本條碼,這時(shí)不需要借閱者的任何信息。如果張三歸還了李四所借的圖書,這時(shí)實(shí)際歸還的是李四所借的圖書(依據(jù)是副本條碼),而不是張三所借的圖書,雖然這兩本書可能是同一種圖書。任務(wù)3數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)任務(wù)1深入理解關(guān)系數(shù)據(jù)庫任務(wù)2需求分析任務(wù)3數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)3.3.1建模工具軟件簡(jiǎn)介3.3.2數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)的一些考慮3.3.3規(guī)范化設(shè)計(jì)3.3.4數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)任務(wù)4數(shù)據(jù)結(jié)構(gòu)的實(shí)施3.3.1建模工具軟件簡(jiǎn)介需要借助一些工具軟件來進(jìn)行數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì),例如PowerDesigner:是數(shù)據(jù)建模領(lǐng)域主流的建模工具,適用于大型項(xiàng)目的開發(fā)EnterpriseArchitect:也是業(yè)界領(lǐng)先的數(shù)據(jù)建模工具,適用于大中型項(xiàng)目的開發(fā)MySQLWorkbench:MySQL提供的,滿足中小型項(xiàng)目開發(fā)的需求作為一個(gè)例子,了解一下PowerDesigner的功能:創(chuàng)建概念數(shù)據(jù)模型、邏輯數(shù)據(jù)模型、物理數(shù)據(jù)模型支持上述三種模型之間的轉(zhuǎn)換支持正向工程和逆向工程正向工程和逆向工程所有建模工具軟件都支持正向工程和逆向工程正向工程從物理數(shù)據(jù)模型到數(shù)據(jù)庫的轉(zhuǎn)換,通常的數(shù)據(jù)庫設(shè)計(jì)采用正向工程進(jìn)行開發(fā)逆向工程從數(shù)據(jù)庫到物理數(shù)據(jù)模型的轉(zhuǎn)換,有時(shí)需要對(duì)已有的數(shù)據(jù)庫進(jìn)行分析,這時(shí)可以采用逆向工程的手段獲得數(shù)據(jù)模型,并對(duì)數(shù)據(jù)模型進(jìn)行修改,再進(jìn)行正向工程,從而實(shí)現(xiàn)對(duì)已有數(shù)據(jù)庫的修改3.3.2數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)的一些考慮對(duì)于大型項(xiàng)目依次進(jìn)行概念設(shè)計(jì)、邏輯設(shè)計(jì)和物理設(shè)計(jì)通過正向工程生成數(shù)據(jù)庫對(duì)于小型項(xiàng)目將概念設(shè)計(jì)、邏輯設(shè)計(jì)和物理設(shè)計(jì)合并為一個(gè)步驟,一步到位直接生成數(shù)據(jù)庫3.3.3規(guī)范化設(shè)計(jì)(步驟1)1.列出所有二維表檢查圖3.18、圖3.19和圖3.20所示的所有二維表,全部滿足關(guān)系的6項(xiàng)基本特征3.3.3規(guī)范化設(shè)計(jì)(步驟2)2.設(shè)置主鍵和外鍵為圖3.18、圖3.19和圖3.20所示的3張二維表設(shè)置主鍵,外鍵在后續(xù)步驟中設(shè)置3.3.3規(guī)范化設(shè)計(jì)(步驟3)3.檢查屬性值的原子性所有3張表中沒有違反屬性值原子性的數(shù)據(jù)3.3.3規(guī)范化設(shè)計(jì)(步驟4)4.檢查屬性值是否重復(fù)圖書信息表拆分為出版社表、圖書表和圖書副本表,從而消除重復(fù)的數(shù)據(jù)用戶表不需要拆分,只需要添加一個(gè)主鍵,將類型改為內(nèi)部編碼,消除重復(fù)值借還信息表包含的重復(fù)數(shù)據(jù)是上述表中已經(jīng)存在的,將相應(yīng)的列改為外鍵,參照?qǐng)D書副本表(圖書副本表還會(huì)參照?qǐng)D書表),以及參照用戶表,修改后的借還表就沒有重復(fù)數(shù)據(jù)3.3.3規(guī)范化設(shè)計(jì)(步驟5)5.檢查表是否包含多個(gè)實(shí)體檢查拆分后的5張表,每張表都不包含多個(gè)實(shí)體。3.3.3規(guī)范化設(shè)計(jì)(步驟6)6.合并相同的實(shí)體檢查拆分后的5張表,不存在相同的實(shí)體,因此這5張表就是規(guī)范化的設(shè)計(jì)。從這5張表(圖3.27)可以看到,所有表的屬性值都是原子性的(滿足1NF的要求),也沒有含有重復(fù)屬性值的列,所有表只包含一個(gè)實(shí)體集,滿足“一個(gè)實(shí)體集一張表”的要求,因此達(dá)到了3NF的要求。3.3.4數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)的結(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=丟失副本表參照?qǐng)D書表,一種圖書可能有多個(gè)副本數(shù)據(jù)結(jié)構(gòu)——借還表借還表借還表參照?qǐng)D書副本表,因此讀者借的是副本,而不是圖書借還表還參照用戶表,并且有3個(gè)外鍵都是參照用戶表,分別是借閱者、借出經(jīng)手人和歸還經(jīng)手人數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)注意事項(xiàng)在數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)過程中,有許多細(xì)節(jié)需要考慮。在實(shí)施時(shí),需要注意以下幾個(gè)方面。每張表應(yīng)該是獨(dú)立的,不應(yīng)該包含重復(fù)的數(shù)據(jù),滿足規(guī)范化設(shè)計(jì)的要求。每張表都必須有主鍵,表之間應(yīng)建立外鍵約束。設(shè)計(jì)好表的每一列,明確表有多少列、每列的含義和作用。定義每一列的名稱,名稱應(yīng)該有具體的含義,并按命名規(guī)范進(jìn)行命名。根據(jù)列所保存的數(shù)據(jù)的性質(zhì),指定每一列的數(shù)據(jù)類型。設(shè)置主鍵約束、外鍵約束和其他約束(唯一性約束、非空約束和默認(rèn)約束等)。為某些列建立索引,以提高查詢效率(索引在項(xiàng)目6講解)。任務(wù)5數(shù)據(jù)結(jié)構(gòu)的實(shí)施任務(wù)1深入理解關(guān)系數(shù)據(jù)庫任務(wù)2需求分析任務(wù)3數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)任務(wù)4數(shù)據(jù)結(jié)構(gòu)的實(shí)施3.4.1【實(shí)訓(xùn)3–1】數(shù)據(jù)結(jié)構(gòu)的創(chuàng)建3.4.2【實(shí)訓(xùn)3–2】數(shù)據(jù)結(jié)構(gòu)的變更3.4.3數(shù)據(jù)結(jié)構(gòu)與數(shù)據(jù)約束3.4.1【實(shí)訓(xùn)3–1】數(shù)據(jù)結(jié)構(gòu)的創(chuàng)建根據(jù)Jitor校驗(yàn)器的要求,在dbForge上完成“【實(shí)訓(xùn)3–1】數(shù)據(jù)結(jié)構(gòu)的創(chuàng)建”創(chuàng)建數(shù)據(jù)庫,語法格式如下其中方括號(hào)內(nèi)的部分是可選的,因此下述兩條語句都是正確的打開數(shù)據(jù)庫,創(chuàng)建數(shù)據(jù)庫后,要打開它,然后在數(shù)據(jù)庫內(nèi)進(jìn)行操作打開剛才創(chuàng)建的library數(shù)據(jù)庫【實(shí)訓(xùn)3-1】Createdatabase數(shù)據(jù)庫名稱[characterset字符集[collate字符集校對(duì)]];Createdatabaselibrary;Createdatabaselibrarycharactersetutf8;Use數(shù)據(jù)庫名稱;Uselibrary;3.4.1【實(shí)訓(xùn)3–1】數(shù)據(jù)結(jié)構(gòu)的創(chuàng)建(續(xù))創(chuàng)建數(shù)據(jù)表創(chuàng)建表的語法格式如下Createtable表名(列名1數(shù)據(jù)類型1[列級(jí)約束1],--每個(gè)列定義結(jié)束時(shí)加逗號(hào),作為分隔列名2數(shù)據(jù)類型2[列級(jí)約束2],…列名n數(shù)據(jù)類型n[列級(jí)約束n]--最后一個(gè)列定義結(jié)束時(shí)不能加逗號(hào),);--最后是一個(gè)反圓括號(hào),以分號(hào)結(jié)束整條SQL語句3.4.1【實(shí)訓(xùn)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來編寫的。上述語句中的幾種列級(jí)約束如下。主鍵約束:主鍵(id_lib_user)的約束是primarykey,主鍵還必須同時(shí)是非空的notnull,對(duì)于整型的主鍵,還可以加上auto_increment(自增量)。非空約束:例如“姓名”(col_name)列擁有非空約束,而“性別”(col_sex)列則沒有非空約束。唯一性約束:“卡號(hào)”(col_rfid)列和“賬號(hào)”(col_account)列擁有唯一性約束默認(rèn)約束:“用戶類別”(col_type)列有一個(gè)默認(rèn)約束,其默認(rèn)值是0Createtablelib_user(id_lib_userint(11)notnullprimarykeyauto_incrementcomment'用戶ID',col_rfidvarchar(16)uniquenotnullcomment'卡號(hào)',col_namevarchar(50)notnullcomment'姓名',col_accountvarchar(20)uniquenotnullcomment'賬號(hào)',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'手機(jī)')comment='用戶表';3.4.1【實(shí)訓(xùn)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書號(hào)',col_call_numbervarchar(50)defaultnullcomment'分類號(hào)',col_pricefloatnotnullcomment'圖書價(jià)格',col_yearint(11)notnullcomment'出版年份',id_lib_publisherint(11)notnullcomment'出版社ID')comment='圖書表';3.4.1【實(shí)訓(xùn)3–1】數(shù)據(jù)結(jié)構(gòu)的創(chuàng)建(續(xù))創(chuàng)建數(shù)據(jù)表(續(xù))(4)創(chuàng)建圖書副本表創(chuàng)建圖書副本表的SQL語句請(qǐng)讀者自行編寫。(5)創(chuàng)建借還表創(chuàng)建借還表的SQL語句請(qǐng)讀者在下述代碼的基礎(chǔ)上補(bǔ)充,下述代碼列出了3個(gè)外鍵,這3個(gè)外鍵都參照了用戶表,外鍵名加上表示含義的后綴。創(chuàng)建圖書副本表的SQL語句請(qǐng)讀者自行編寫。Createtablelib_lending(--省略部分列定義,請(qǐng)讀者補(bǔ)充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【實(shí)訓(xùn)3–1】數(shù)據(jù)結(jié)構(gòu)的創(chuàng)建(續(xù))建立外鍵約束創(chuàng)建外鍵約束有兩種辦法。在創(chuàng)建表的同時(shí)創(chuàng)建外鍵約束。在創(chuàng)建表之后,通過修改表的方式,為表添加外鍵約束。建議采用第二種辦法,因?yàn)檫@種辦法比較靈活。因此,在創(chuàng)建上述5張數(shù)據(jù)表之后,再為表添加外鍵約束。為表添加外鍵約束的語法格式如下。這條SQL語句的意思是為“從表”添加一個(gè)名為“外鍵約束名”的外鍵(foreignkey)約束(constraint),“從表”的“外鍵”參照(references)“主表”的“主鍵”。Altertable從表addconstraint外鍵約束名foreignkey(外鍵)references主表(主鍵);3.4.1【實(shí)訓(xùn)3–1】數(shù)據(jù)結(jié)構(gòu)的創(chuàng)建(續(xù))建立外鍵約束(續(xù))(1)圖書表的外鍵約束為圖書表(lib_book)的外鍵(id_lib_publisher)添加對(duì)出版社表(lib_publisher)主鍵(id_lib_publisher)的參照,外鍵名為“fk_lib_book_lib_publisher”。(2)圖書副本表的外鍵約束為圖書副本表(lib_copy)的外鍵(id_lib_book)添加對(duì)圖書表(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語句請(qǐng)讀者自行編寫。3.4.1【實(shí)訓(xùn)3–1】數(shù)據(jù)結(jié)構(gòu)的創(chuàng)建(續(xù))建立外鍵約束(續(xù))(3)借還表的外鍵約束(參照?qǐng)D書副本表)為借還表添加對(duì)圖書副本表的外鍵約束,外鍵名為“fk_lib_lending_lib_copy”。(4)借還表的外鍵約束(參照用戶表)借還表有3個(gè)參照用戶表的外鍵,這3個(gè)外鍵的含義分別是借閱者、借出經(jīng)手人和歸還經(jīng)手人,因此3個(gè)外鍵有3個(gè)不同的名稱,而3個(gè)外鍵約束也應(yīng)該有不同的名稱。下面為借還表分別添加3個(gè)外鍵約束,首先添加借閱者外鍵的約束,外鍵名為“fk_lib_lending_lib_user1”,在外鍵名的最后加一個(gè)數(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”,對(duì)應(yīng)的SQL語句請(qǐng)讀者自行編寫3.4.2【實(shí)訓(xùn)3–2】數(shù)據(jù)結(jié)構(gòu)的變更根據(jù)Jitor校驗(yàn)器的要求,在dbForge上完成“【實(shí)訓(xùn)3–2】數(shù)據(jù)結(jié)構(gòu)的變更”1、列出數(shù)據(jù)庫和表的信息(1)列出數(shù)據(jù)庫名用下述命令列出MySQL服務(wù)器中所有數(shù)據(jù)庫的列表。(2)列出數(shù)據(jù)表名用下述命令列出當(dāng)前數(shù)據(jù)庫中所有表的列表。(3)列出表的數(shù)據(jù)結(jié)構(gòu)用下述命令列出當(dāng)前數(shù)據(jù)庫中指定表(lib_book)的數(shù)據(jù)結(jié)構(gòu),如教材第84頁圖3.33所示?!緦?shí)訓(xùn)3-2】Showdatabases;Uselibrary;Showtables;Describelib_book;3.4.2【實(shí)訓(xùn)3–2】數(shù)據(jù)結(jié)構(gòu)的變更(續(xù))2、變更表表的變更(修改)可能涉及許多方面,可能是變更表中某個(gè)列的列名或列的數(shù)據(jù)類型,也可能是添加一列或丟棄一列,甚至是增加一個(gè)約束或丟棄一個(gè)約束。例如前面就詳細(xì)講解了增加外鍵約束,增加外鍵約束是最常見的操作之一。(1)增加列例如為出版社表增加一個(gè)備注列(列名“col_remark”,數(shù)據(jù)類型varchar(500))的代碼如下。如果重復(fù)增加列,會(huì)出現(xiàn)“Duplicatecolumnname'col_remark'”的錯(cuò)誤信息,意思是不能增加相同的列(2)丟棄列例如丟棄剛才增加的備注列(col_remark)的代碼如下。如果重復(fù)丟棄同一個(gè)列,會(huì)出現(xiàn)“Can'tDROP'col_remark';checkthatcolumn/keyexists”的錯(cuò)誤,意思是不能丟棄不存在的列。Altertablelib_publisheraddcolumncol_remarkvarchar(500)nullcomment'備注';Altertablelib_publisherdropcolumncol_remark;3.4.2【實(shí)訓(xùn)3–2】數(shù)據(jù)結(jié)構(gòu)的變更(續(xù))2、變更表(續(xù))(3)變更列可以同時(shí)變更列名以及列的定義(數(shù)據(jù)類型、非空約束等)。例如變更“出版社”的列名的代碼如下,從原來的列名“col_name”改為“col_publisher_name”,同時(shí)變更數(shù)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 公路養(yǎng)護(hù)合同范本
- 人力資源外包合同范例
- 代理旗艦店合同范本
- 農(nóng)戶種植水稻合同范本
- 2024年中國移動(dòng)招聘考試真題
- 個(gè)人債權(quán)抵押合同范本
- 2024年西安工業(yè)大學(xué)專任教師招聘考試真題
- 企業(yè)簽訂勞務(wù)合同范本
- 供熱站拆除合同范本
- 兼職技術(shù)總工合同范本
- 如何讓孩子積極參與家務(wù)勞動(dòng)
- 2023年污水處理行業(yè)洞察報(bào)告及未來五至十年預(yù)測(cè)分析報(bào)告(修訂版)
- 小學(xué)生素質(zhì)發(fā)展報(bào)告單
- 人衛(wèi)版急診與災(zāi)難醫(yī)學(xué)之呼吸困難教學(xué)課件
- 廚房油煙凈化設(shè)備日常保養(yǎng)與維護(hù)
- 拓?fù)鋽?shù)據(jù)分析理論
- (完整版)200210號(hào)文-工程勘察設(shè)計(jì)收費(fèi)標(biāo)準(zhǔn)(2002年修訂本)
- 部編版語文二年級(jí)上冊(cè)第1單元核心素養(yǎng)教案
- (完整版)污水管道施工方案
- 國際法與國際爭(zhēng)端解決 課件全套 人大 第1-18章 導(dǎo)論、國際法淵源-國際人權(quán)法
- 發(fā)展?jié)h語初級(jí)口語I-第18課課件
評(píng)論
0/150
提交評(píng)論