設(shè)計步驟
好的數(shù)據(jù)庫設(shè)計,是程序
1、需求分析
a、分析需求(了解、查閱,交流)
b、標(biāo)識實體(表名)
c、整理元素(字段)
2、ER圖
a、表關(guān)系
3、設(shè)計規(guī)范
a、設(shè)計規(guī)范(三大范式)
其一:每個獨立字段不能再細(xì)化,原子化
其二:其他字段完全依賴主鍵,不相干的字段不可錄入進(jìn)來
其三:字段之間的關(guān)系中,2個以上字段,是否可以單獨提取出來做新表
4、具體化,根據(jù)E-R圖,將字段之間邏輯緊密關(guān)聯(lián)
5、建數(shù)據(jù)庫和表
實戰(zhàn)
分析需求(了解、查閱,交流):
企業(yè)/個人注冊、進(jìn)入主體頁面,他們可以發(fā)布信息(發(fā)布表)、發(fā)布的信息放到了任務(wù)大廳,
如果有人愿意承接,就接收,變成承接方,發(fā)布方確認(rèn)是否同意,
如果同意,,發(fā)布方發(fā)來合同,承接方簽訂合同。
發(fā)布方確認(rèn)合同,承接方上傳成品,發(fā)布方看是否滿意,并上傳確認(rèn)函
發(fā)布方打款,承接方上傳打款發(fā)票,并提現(xiàn)

圖片.png
三大范式
關(guān)系數(shù)據(jù)庫中的關(guān)系必須滿足一定的要求。滿足不同程度要求的為不同范式。數(shù)據(jù)庫的設(shè)計范式是數(shù)據(jù)庫設(shè)計所需要滿足的規(guī)范。只有理解數(shù)據(jù)庫的設(shè)計范式,才能設(shè)計出高效率、優(yōu)雅的數(shù)據(jù)庫,否則可能會設(shè)計出錯誤的數(shù)據(jù)庫.
目前,主要有六種范式:第一范式、第二范式、第三范式、BC范式、第四范式和第五范式。滿足最低要求的叫第一范式,簡稱1NF。在第一范式基礎(chǔ)上進(jìn)一步滿足一些要求的為第二范式,簡稱2NF。其余依此類推。
范式可以避免數(shù)據(jù)冗余,減少數(shù)據(jù)庫的空間,減輕維護(hù)數(shù)據(jù)完整性的麻煩,但是操作困難,因為需要聯(lián)系多個表才能得到所需要數(shù)據(jù),而且范式越高性能就會越差。要權(quán)衡是否使用更高范式是比較麻煩的,一般在項目中,用得最多的也就是第三范式,我認(rèn)為使用到第三范式也就足夠了,性能好而且方便管理數(shù)據(jù)。
函數(shù)依賴,如果一個表中某一個字段Y的值是由另外一個字段或一組字段X的值來確定的,就稱為Y函數(shù)依賴于X。
第一范式(1NF)
定義:如果關(guān)系模式R的每個關(guān)系r的屬性都是不可分的數(shù)據(jù)項,那么就稱R是第一范式的模式。
簡單的說,每一個屬性都是原子項,不可分割。
1NF是關(guān)系模式應(yīng)具備的最起碼的條件,如果數(shù)據(jù)庫設(shè)計不能滿足第一范式,就不稱為關(guān)系型數(shù)據(jù)庫。關(guān)系數(shù)據(jù)庫設(shè)計研究的關(guān)系規(guī)范化是在1NF之上進(jìn)行的。
例如(學(xué)生信息表):
學(xué)生編號 姓名 性別 聯(lián)系方式
20080901 張三 男 email:zs@126.com,phone:88886666
20080902 李四 女 email:ls@126.com,phone:66668888
以上的表就不符合,第一范式:聯(lián)系方式字段可以再分,所以變更為正確的是:
學(xué)生編號 姓名 性別 電子郵件 電話
20080901 張三 男 zs@126.com 88886666
20080902 李四 女 ls@126.com 66668888
第二范式(2NF)
定義:如果關(guān)系模式R是1NF,且每個非主屬性完全函數(shù)依賴于候選鍵,那么就稱R是第二范式。
簡單的說,第二范式要滿足以下的條件:首先要滿足第一范式,其次每個非主屬性要完全函數(shù)依賴與候選鍵,或者是主鍵。也就是說,每個非主屬性是由整個主鍵函數(shù)決定的,而不能由主鍵的一部分來決定。
例如(學(xué)生選課表):
學(xué)生 課程 教師 教師職稱 教材 教室 上課時間
李四 Spring 張老師 java講師 《Spring深入淺出》 301 08:00
張三 Struts 楊老師 java講師 《Struts in Action》 302 13:30
這里通過(學(xué)生,課程)可以確定教師、教師職稱,教材,教室和上課時間,所以可以把(學(xué)生,課程)作為主鍵。但是,教材并不完全依賴于(學(xué)生,課程),只拿出課程就可以確定教材,因為一個課程,一定指定了某個教材。這就叫不完全依賴,或者部分依賴。出現(xiàn)這種情況,就不滿足第二范式。
修改后,選課表:
學(xué)生 課程 教師 教師職稱 教室 上課時間
李四 Spring 張老師 java講師 301 08:00
張三 Struts 楊老師 java講師 302 13:30
課程表:
課程 教材
Spring 《Spring深入淺出》
Struts 《Struts in Action》
所以,第二范式可以說是消除部分依賴。第二范式可以減少插入異常,刪除異常和修改異常。
第三范式(3NF)
定義:如果關(guān)系模式R是2NF,且關(guān)系模式R(U,F(xiàn))中的所有非主屬性對任何候選關(guān)鍵字都不存在傳遞依賴,則稱關(guān)系R是屬于第三范式。
簡單的說,第三范式要滿足以下的條件:首先要滿足第二范式,其次非主屬性之間不存在函數(shù)依賴。由于滿足了第二范式,表示每個非主屬性都函數(shù)依賴于主鍵。如果非主屬性之間存在了函數(shù)依賴,就會存在傳遞依賴,這樣就不滿足第三范式。
上例中修改后的選課表中,一個教師能確定一個教師職稱。這樣,教師依賴于(學(xué)生,課程),而教師職稱又依賴于教師,這叫傳遞依賴。第三范式就是要消除傳遞依賴。
修改后,選課表:
學(xué)生 課程 教師 教室 上課時間
李四 Spring 張老師 301 08:00
張三 Struts 楊老師 302 13:30
教師表:
教師 教師職稱
張老師 java講師
楊老師 java講師
這樣,新教師的職稱在沒被選課的時候也有地方存了,沒人選這個教師的課的時候教師的職稱也不至于被刪除,修改教師職稱時只修改教師表就可以了。
簡單的說,
第一范式就是原子性,字段不可再分割;
第二范式就是完全依賴,沒有部分依賴;
第三范式就是沒有傳遞依賴。