MySQL數(shù)據(jù)庫(kù)基礎(chǔ)與實(shí)例教程第1章.ppt
,孔祥盛,MySQL數(shù)據(jù)庫(kù)基礎(chǔ)與實(shí)例教程之?dāng)?shù)據(jù)庫(kù)設(shè)計(jì)概述,1,2,3,本章拋開(kāi)MySQL講解關(guān)系數(shù)據(jù)庫(kù)設(shè)計(jì)的相關(guān)知識(shí),以“選課系統(tǒng)”為例,講解“選課系統(tǒng)”數(shù)據(jù)庫(kù)的設(shè)計(jì)流程。,4,內(nèi)容一覽,數(shù)據(jù)庫(kù)設(shè)計(jì)的相關(guān)知識(shí),數(shù)據(jù)庫(kù)概述,E-R圖,關(guān)系數(shù)據(jù)庫(kù)設(shè)計(jì),1,2,3,簡(jiǎn)單地說(shuō):數(shù)據(jù)庫(kù)(Database或DB)是存儲(chǔ)、管理數(shù)據(jù)的容器;嚴(yán)格地說(shuō):數(shù)據(jù)庫(kù)是“按照某種數(shù)據(jù)結(jié)構(gòu)對(duì)數(shù)據(jù)進(jìn)行組織、存儲(chǔ)和管理的容器”??偨Y(jié):數(shù)據(jù)永遠(yuǎn)是數(shù)據(jù)庫(kù)的核心。,關(guān)系數(shù)據(jù)庫(kù),關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng),結(jié)構(gòu)化查詢語(yǔ)言SQL,1.1數(shù)據(jù)庫(kù)概述,1.1.1關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng),通過(guò)“數(shù)據(jù)庫(kù)管理系統(tǒng)”,數(shù)據(jù)庫(kù)用戶可以輕松地實(shí)現(xiàn)數(shù)據(jù)庫(kù)容器中各種數(shù)據(jù)庫(kù)對(duì)象的訪問(wèn)(增、刪、改、查等操作),并可以輕松地完成數(shù)據(jù)庫(kù)的維護(hù)工作(備份、恢復(fù)、修復(fù)等操作),數(shù)據(jù)庫(kù)用戶無(wú)法直接通過(guò)操作系統(tǒng)獲取數(shù)據(jù)庫(kù)文件中的具體內(nèi)容;數(shù)據(jù)庫(kù)管理系統(tǒng)通過(guò)調(diào)用操作系統(tǒng)的進(jìn)程管理、內(nèi)存管理、設(shè)備管理以及文件管理等服務(wù),為數(shù)據(jù)庫(kù)用戶提供管理、控制數(shù)據(jù)庫(kù)容器中各種數(shù)據(jù)庫(kù)對(duì)象、數(shù)據(jù)庫(kù)文件的接口。,1.1.1關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng),添加標(biāo)題,添加標(biāo)題,層次模型,面向?qū)ο竽P?網(wǎng)狀模型,關(guān)系模型,數(shù)據(jù)庫(kù)管理系統(tǒng)常用的數(shù)學(xué)模型,添加標(biāo)題,基于“關(guān)系模型”的數(shù)據(jù)庫(kù)管理系統(tǒng)稱(chēng)為關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(簡(jiǎn)稱(chēng)為RDBMS)。隨著關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)的日臻完善,目前關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)已占據(jù)主導(dǎo)地位。,1.1.1關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng),2014年2月數(shù)據(jù)庫(kù)流行度排行榜,截至目前,MySQL已經(jīng)成功逆襲!,1.1.1關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng),2014年3月數(shù)據(jù)庫(kù)流行度排行榜,1.1.1關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng),2014年4月數(shù)據(jù)庫(kù)流行度排行榜,1.1.1關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng),開(kāi)源,MySQL源代碼免費(fèi)下載,簡(jiǎn)單,MySQL體積小,便于安裝,MySQL性能足夠與商業(yè)數(shù)據(jù)庫(kù)媲美,功能強(qiáng)大,MySQL提供的功能足夠與商業(yè)數(shù)據(jù)庫(kù)媲美,逆襲原因,性能優(yōu)越,1.1.1關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng),關(guān)系數(shù)據(jù)庫(kù)中所謂的“關(guān)系”,實(shí)質(zhì)上是一張二維表。請(qǐng)看下面的課程表。,字段名(列名),第1個(gè)字段(列),第1條記錄,第2條記錄,第3條記錄,第4條記錄,第5條記錄,第3個(gè)字段(列),第2個(gè)字段(列),第4個(gè)字段(列),1.1.2關(guān)系數(shù)據(jù)庫(kù),作為數(shù)據(jù)庫(kù)中最為重要的數(shù)據(jù)庫(kù)對(duì)象,數(shù)據(jù)庫(kù)表的設(shè)計(jì)過(guò)程并非一蹴而就,上述課程表根本無(wú)法滿足“選課系統(tǒng)”的功能需求。事實(shí)上,數(shù)據(jù)庫(kù)表的設(shè)計(jì)過(guò)程并非如此簡(jiǎn)單,本章的重點(diǎn)就是討論如何設(shè)計(jì)結(jié)構(gòu)良好的數(shù)據(jù)庫(kù)表。,1.1.2關(guān)系數(shù)據(jù)庫(kù),結(jié)構(gòu)化查詢語(yǔ)言(StructuredQueryLanguage或簡(jiǎn)稱(chēng)為SQL)是一種應(yīng)用最為廣泛的關(guān)系數(shù)據(jù)庫(kù)語(yǔ)言,該語(yǔ)言定義了操作關(guān)系數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)語(yǔ)法,幾乎所有的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)都支持SQL。,1.1.3結(jié)構(gòu)化查詢語(yǔ)言SQL,學(xué)習(xí)重點(diǎn),1,2,3,數(shù)據(jù)庫(kù)設(shè)計(jì)是一個(gè)“系統(tǒng)工程”,要求數(shù)據(jù)庫(kù)開(kāi)發(fā)人員:熟悉“商業(yè)領(lǐng)域”的商業(yè)知識(shí)。利用“管理學(xué)”的知識(shí)與其他開(kāi)發(fā)人員進(jìn)行有效溝通。掌握一些數(shù)據(jù)庫(kù)設(shè)計(jì)輔助工具。,數(shù)據(jù)庫(kù)設(shè)計(jì)輔助工具,商業(yè)知識(shí)和溝通技能,“選課系統(tǒng)”概述,4,5,定義問(wèn)題域,編碼規(guī)范,1.2數(shù)據(jù)庫(kù)設(shè)計(jì)的相關(guān)知識(shí),數(shù)據(jù)庫(kù)技術(shù)解決的是“商業(yè)領(lǐng)域”的“商業(yè)問(wèn)題”。數(shù)據(jù)庫(kù)開(kāi)發(fā)人員有必要成為該“商業(yè)領(lǐng)域”的專(zhuān)家,與其他開(kāi)發(fā)人員(包括最終用戶)一起工作,繼而使用數(shù)據(jù)庫(kù)技術(shù)解決該“商業(yè)領(lǐng)域”的“商業(yè)問(wèn)題”。,1.2.1商業(yè)知識(shí)和溝通技能,1.2.2數(shù)據(jù)庫(kù)設(shè)計(jì)輔助工具,面向?qū)ο蠓治龊驮O(shè)計(jì)技術(shù)結(jié)構(gòu)化分析和設(shè)計(jì)技術(shù)軟件測(cè)試技術(shù)關(guān)系數(shù)據(jù)庫(kù)設(shè)計(jì)技術(shù),ErwinPowerDesignerRationalRoseVisio,VC+6.0VisualstudioEclipseNetBeans,單元測(cè)試工具功能測(cè)試工具性能測(cè)試工具,程序流程圖DFD時(shí)序圖狀態(tài)圖,CASE工具IDE工具測(cè)試工具,數(shù)據(jù)模型,類(lèi)圖,E-R圖,限于篇幅,在不影響“選課系統(tǒng)”核心功能的基礎(chǔ)上,適當(dāng)?shù)貙?duì)該系統(tǒng)進(jìn)行“定制”、“擴(kuò)展”以及“瘦身”。,1.2.3“選課系統(tǒng)”概述,定義問(wèn)題域是數(shù)據(jù)庫(kù)設(shè)計(jì)過(guò)程中重要的活動(dòng),它的目標(biāo)是準(zhǔn)確定義要解決的商業(yè)問(wèn)題?!斑x課系統(tǒng)”亟需解決的“商業(yè)”問(wèn)題有哪些?,1.2.4定義問(wèn)題域,在編程的時(shí)候會(huì)考慮代碼的可讀性嗎?你覺(jué)得代碼可讀性是需要考慮的問(wèn)題嗎?1.代碼不僅要自己能讀懂,還要?jiǎng)e人也能看懂?2.盡量做到可讀,但時(shí)間緊任務(wù)重的時(shí)候就顧不上了?3.代碼只要自己能讀懂就可以了?4.代碼寫(xiě)完就完了,不用管以后是否能讀懂?5.不知道,沒(méi)有想過(guò)這個(gè)問(wèn)題?,1.2.5編碼規(guī)范,請(qǐng)記住:盡最大努力把方便留給別人和將來(lái)的自己。,建議大家遵循本書(shū)羅列的常用編程規(guī)范!,1,2,3,關(guān)系,實(shí)體和屬性,E-R圖的設(shè)計(jì)原則,E-R圖設(shè)計(jì)的質(zhì)量直接決定了關(guān)系數(shù)據(jù)庫(kù)設(shè)計(jì)的質(zhì)量。,1.3E-R圖,實(shí)體不是某一個(gè)具體事物,而是某一種類(lèi)別所有事物的統(tǒng)稱(chēng)。屬性通常用于表示實(shí)體的某種特征,也可以使用屬性表示實(shí)體間關(guān)系的特征,實(shí)體,屬性,屬性,1.3.1實(shí)體和屬性,E-R圖中的關(guān)系用于表示實(shí)體間存在的聯(lián)系,在E-R圖中,實(shí)體間的關(guān)系通常使用一條線段表示。E-R圖中實(shí)體間的關(guān)系是雙向的。,關(guān)系,關(guān)系,1.3.2關(guān)系,基數(shù)表示一個(gè)實(shí)體到另一個(gè)實(shí)體之間關(guān)聯(lián)的數(shù)目,基數(shù)是針對(duì)關(guān)系之間的某個(gè)方向提出的概念,基數(shù)可以是一個(gè)取值范圍,也可以是某個(gè)具體數(shù)值,基數(shù),可選,基數(shù),強(qiáng)制,1.3.2關(guān)系,元表示關(guān)系所關(guān)聯(lián)的實(shí)體個(gè)數(shù)。,二元關(guān)系,二元關(guān)系,一元關(guān)系,1.3.2關(guān)系,使用關(guān)聯(lián)(Association)表示實(shí)體間關(guān)系的屬性。,關(guān)聯(lián),關(guān)聯(lián),1.3.2關(guān)系,1,2,3,實(shí)體是一個(gè)單獨(dú)的個(gè)體,不能存在于另一個(gè)實(shí)體中,成為另一個(gè)實(shí)體的屬性。,屬性應(yīng)該存在于、且只存在于某一個(gè)地方(實(shí)體或者關(guān)聯(lián))。,同一個(gè)實(shí)體在同一個(gè)E-R圖內(nèi),僅出現(xiàn)一次。,數(shù)據(jù)庫(kù)開(kāi)發(fā)人員通常采用“一事一地”的原則從系統(tǒng)的功能描述中抽象出來(lái)E-R圖。,1.3.3E-R圖的設(shè)計(jì)原則,1為E-R圖中的每個(gè)實(shí)體建立一張表。2為每張表定義一個(gè)主鍵(如果需要,可以向表添加一個(gè)沒(méi)有實(shí)際意義的字段作為該表的主鍵)3增加外鍵表示一對(duì)多關(guān)系。4建立新表表示多對(duì)多關(guān)系。5為字段選擇合適的數(shù)據(jù)類(lèi)型。6定義約束條件(如果需要)。7評(píng)價(jià)關(guān)系的質(zhì)量,并進(jìn)行必要的改進(jìn)。,1.4關(guān)系數(shù)據(jù)庫(kù)設(shè)計(jì),student(student_no,student_name,student_contact)course(course_name,up_limit,description,status)teacher(teacher_no,teacher_name,teacher_contact)classes(class_name,department_name),1.4.1為每個(gè)實(shí)體建立一張數(shù)據(jù)庫(kù)表,關(guān)鍵字(key):用以唯一標(biāo)識(shí)表中的每行記錄。主鍵(PrimaryKey):在所有的關(guān)鍵字中選擇一個(gè)關(guān)鍵字,作為該表的主關(guān)鍵字,簡(jiǎn)稱(chēng)主鍵。,1.4.2為每張表定義一個(gè)主鍵,主鍵有以下兩個(gè)特征:(1)表的主鍵可以是一個(gè)字段,也可以是多個(gè)字段的組合(這種情況稱(chēng)為復(fù)合主鍵)。(2)表中主鍵的值具有唯一性且不能取空值(NULL);當(dāng)表中的主鍵由多個(gè)字段構(gòu)成時(shí),每個(gè)字段的值都不能取NULL。主鍵設(shè)計(jì)技巧,請(qǐng)參看本書(shū)內(nèi)容。,1.4.2為每張表定義一個(gè)主鍵,student(student_no,student_name,student_contact)course(course_no,course_name,up_limit,description,status)teacher(teacher_no,teacher_name,teacher_contact)classes(class_no,class_name,department_name),1.4.2為每張表定義一個(gè)主鍵,外鍵(ForeignKey):如果表A中的一個(gè)字段a對(duì)應(yīng)于表B的主鍵b,則字段a稱(chēng)為表A的外鍵,此時(shí)存儲(chǔ)在表A中字段a的值,要么是NULL,要么是來(lái)自于表B主鍵b的值。,1.4.3增加外鍵表示一對(duì)多關(guān)系,情形一:如果實(shí)體間的關(guān)系為一對(duì)多關(guān)系,則需要將“一”端實(shí)體的主鍵放到“多”端實(shí)體中,然后作為“多”端實(shí)體的外鍵,通過(guò)該外鍵即可表示實(shí)體間的一對(duì)多關(guān)系。,1.4.3增加外鍵表示一對(duì)多關(guān)系,讓學(xué)生記住所在班級(jí),遠(yuǎn)比班級(jí)“記住”所有學(xué)生容易的多。,1.4.3增加外鍵表示一對(duì)多關(guān)系,情形二:實(shí)體間的一對(duì)一關(guān)系,可以看成一種特殊的一對(duì)多關(guān)系:將“一”端實(shí)體的主鍵放到另“一”端的實(shí)體中,并作為另“一”端的實(shí)體的外鍵,然后將外鍵定義為唯一性約束(UniqueConstraint)。,1.4.3增加外鍵表示一對(duì)多關(guān)系,PK,1.4.3增加外鍵表示一對(duì)多關(guān)系,PK后的方案:student(student_no,student_name,student_contact,class_no)course(course_no,course_name,up_limit,description,status,teacher_no)teacher(teacher_no,teacher_name,teacher_contact)classes(class_no,class_name,department_name),1.4.3增加外鍵表示一對(duì)多關(guān)系,情形三:如果兩個(gè)實(shí)體間的關(guān)系為多對(duì)多關(guān)系,則需要添加新表表示該多對(duì)多關(guān)系,然后將該關(guān)系涉及到的實(shí)體的“主鍵”分別放入到新表中(作為新表的外鍵),并將關(guān)系自身的屬性放入到新表中作為新表的字段。,1.4.4建立新表表示多對(duì)多關(guān)系,teacher(teacher_no,teacher_name,teacher_contact)classes(class_no,class_name,department_name)course(course_no,course_name,up_limit,description,status,teacher_no)student(student_no,student_name,student_contact,class_no)choose(choose_no,student_no,course_no,score,choose_time),1.4.4建立新表表示多對(duì)多關(guān)系,1.4.4建立新表表示多對(duì)多關(guān)系,1.4.5為字段選擇合適的數(shù)據(jù)類(lèi)型,常用的約束條件有6種:主鍵(PrimaryKey)約束外鍵(ForeignKey)約束唯一性(Unique)約束默認(rèn)值(Default)約束非空(NotNULL)約束檢查(Check)約束。,1.4.6定義約束(Constraint)條件,設(shè)計(jì)數(shù)據(jù)庫(kù)時(shí),有兩個(gè)不爭(zhēng)的事實(shí)。數(shù)據(jù)庫(kù)中冗余的數(shù)據(jù)需要額外的維護(hù),因此質(zhì)量好的一套表應(yīng)該盡量“減少冗余數(shù)據(jù)”。數(shù)據(jù)庫(kù)中經(jīng)常發(fā)生變化的數(shù)據(jù)需要額外的維護(hù),因此質(zhì)量好的一套表應(yīng)該盡量“避免數(shù)據(jù)經(jīng)常發(fā)生變化”。,1.4.7評(píng)價(jià)數(shù)據(jù)庫(kù)表設(shè)計(jì)的質(zhì)量,冗余的數(shù)據(jù)需要額外的維護(hù),并且容易導(dǎo)致“數(shù)據(jù)不一致”、“插入異?!币约啊皠h除異常”等問(wèn)題的發(fā)生。,1.4.8使用規(guī)范化減少數(shù)據(jù)冗余,場(chǎng)景一:插入異常。場(chǎng)景二:修改復(fù)雜。場(chǎng)景三:刪除異常。,1.4.8使用規(guī)范化減少數(shù)據(jù)冗余,規(guī)范化是通過(guò)最小化數(shù)據(jù)冗余來(lái)提升數(shù)據(jù)庫(kù)設(shè)計(jì)質(zhì)量的過(guò)程,規(guī)范化是基于函數(shù)依賴以及一系列范式定義的,最為常用的是第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。,1.4.8使用規(guī)范化減少數(shù)據(jù)冗余,函數(shù)依賴:一張表內(nèi)兩個(gè)字段值之間的一一對(duì)應(yīng)關(guān)系稱(chēng)為函數(shù)依賴。第一范式:如果一張表內(nèi)同類(lèi)字段不重復(fù)出現(xiàn),該表就滿足第一范式的要求。,1.4.8使用規(guī)范化減少數(shù)據(jù)冗余,第一范式,1.4.8使用規(guī)范化減少數(shù)據(jù)冗余,第二范式:一張表在滿足第一范式的基礎(chǔ)上,如果每個(gè)“非關(guān)鍵字”字段“僅僅”函數(shù)依賴于主鍵,那么該表滿足第二范式的要求。,1.4.8使用規(guī)范化減少數(shù)據(jù)冗余,第二范式,1.4.8使用規(guī)范化減少數(shù)據(jù)冗余,第三范式:如果一張表滿足第二范式的要求,并且不存在“非關(guān)鍵字”字段函數(shù)依賴于任何其他“非關(guān)鍵字”字段,那么該表滿足第三范式的要求。,1.4.8使用規(guī)范化減少數(shù)據(jù)冗余,第三范式,1.4.8使用規(guī)范化減少數(shù)據(jù)冗余,統(tǒng)計(jì)學(xué)生的個(gè)人資料時(shí),如果讀者是一名數(shù)據(jù)庫(kù)開(kāi)發(fā)人員,應(yīng)該讓學(xué)生上報(bào)年齡信息,還是讓學(xué)生上報(bào)出生日期?如何確保每一門(mén)課程選報(bào)學(xué)生的人數(shù),不超過(guò)人數(shù)上限?,1.4.9避免數(shù)據(jù)經(jīng)常發(fā)生變化,方案一:course(course_no,course_no,course_name,up_limit,description,status,teacher_no,available)方案二:數(shù)據(jù)庫(kù)表無(wú)需進(jìn)行任何更改。,1.4.9避免數(shù)據(jù)經(jīng)常發(fā)生變化,任務(wù)1:描述“選課系統(tǒng)”的問(wèn)題域。任務(wù)2:將本書(shū)圖1-7中“團(tuán)購(gòu)網(wǎng)站、顧客以及房源之間的三元關(guān)系表示方法”E-R圖轉(zhuǎn)化為關(guān)系(模式)。任務(wù)3:使用筆紙或者word繪圖工具,繪制“選課系統(tǒng)”的E-R圖。任務(wù)4:將“選課系統(tǒng)”的E-R圖轉(zhuǎn)化為關(guān)系(模式)。,任務(wù)布置,Thanks,