數(shù)據(jù)庫
數(shù)據(jù)庫設(shè)計(jì)
三范式
數(shù)據(jù)庫表設(shè)計(jì)時(shí),我們往往需要遵守?cái)?shù)據(jù)庫設(shè)計(jì)的三范式,即使有時(shí)候個(gè)別情況不會(huì)遵守到第三范式,但是第一和第二都是為了數(shù)據(jù)庫的結(jié)構(gòu)和對表的讀取而要去嚴(yán)格遵守的。
第一范式:字段的原子性
就是數(shù)據(jù)庫表中的所有字段值都是不可分解的原子值
需要根據(jù)實(shí)際需求來頂,比如數(shù)據(jù)庫系統(tǒng)中用到“address”--”地址“屬性,原本我們可以直接根據(jù)地址建一個(gè)字段,但是地址里面會(huì)是省份、城市、鄉(xiāng)鎮(zhèn)、村,所以我們需要對地址這個(gè)字段進(jìn)行拆分,保證每一個(gè)字段的原子性。
單從宏觀來講,關(guān)系型數(shù)據(jù)庫,默認(rèn)滿足第一范式。
在一對多的設(shè)計(jì)中使用逗號(hào)分隔多個(gè)外鍵,雖然方便,但是不利于維護(hù)和索引,阿里巴巴開發(fā)手冊上是在項(xiàng)目應(yīng)用中強(qiáng)制規(guī)定不得使用外鍵的級(jí)聯(lián),一切外鍵概念必須在應(yīng)用層中解決。像外鍵與級(jí)聯(lián)更新適用于單機(jī)低并發(fā),不適合分布式、高并發(fā)集群;級(jí)聯(lián)更新是強(qiáng)阻塞,存在數(shù)據(jù)庫更新風(fēng)暴的風(fēng)險(xiǎn);外鍵影響數(shù)據(jù)庫的插入速度。
第二范式:消除對主鍵的部份依賴
就是 在表中加上一個(gè)與業(yè)務(wù)邏輯無關(guān)的字段為主鍵
主鍵:可以唯一表示記錄的字段或者字段集合
依賴:A字段可以確定B字段,則B字段依賴A字段
比如知道下一節(jié)課是數(shù)學(xué),就能確定任課老師,于是 周幾和**下一節(jié)課 **就能構(gòu)成復(fù)合主鍵,能夠確定去那個(gè)教室上課,任課老師是誰等。但我們經(jīng)常增加一個(gè)id 作為主鍵,而消除對主鍵的依賴
對主鍵的部份依賴:某個(gè)字段依賴復(fù)合主鍵中的一部分
解決方案:新增一個(gè)獨(dú)立字段作為主鍵
第三范式:消除對主鍵的傳遞依賴
傳遞依賴:B字段依賴于A, C字段又依賴于B。
任課老師是誰取決于是什么課,是什么課又取決于主鍵id。因此需要將此表拆分為兩張表 日程表和課程表 (獨(dú)立數(shù)據(jù)獨(dú)立建表) :
| id | weekday | course_address | course_id |
|---|---|---|---|
| 1001 | 周一 | 11號(hào)教學(xué)樓 | 14252 |
| course_id | course_name | course_name |
|---|---|---|
| 14252 | math | 楊老師 |
這樣就減少了數(shù)據(jù)的冗余(即使周一至周日每天都有 math 課,也只是course_id:14252 出現(xiàn)了7次)
后續(xù)
現(xiàn)在對此的理解還沒有理解透,有新的理解了再來更i新. . . . . .