SQL
范式越高套才,冗余越低鲤桥。
第一范式(1NF):確保每一列的原子性
如果每一列都是不可再分的最小數(shù)據(jù)單元扔枫,則滿足第一范式响蕴。
id | 地址 |
---|---|
1 | 中國廣東 |
2 | 中國云南 |
上面的表地址字段其實可以繼續(xù)分:
id | 國家 | 省份 |
---|---|---|
1 | 中國 | 廣東 |
2 | 中國 | 云南 |
但是具體地址到底要不要拆分 還要看具體情形,比如看看將來會不會按國家或者省市進行分類匯總或者排序筒繁,如果需要叉橱,最好就拆儒飒,如果不需要而僅僅起字符串的作用产雹,可以不拆诫惭,操作起來更方便。
第二范式:非鍵字段必須依賴于鍵字段
如果一個關(guān)系滿足1NF蔓挖,并且除了主鍵以外的其它列夕土,都依賴與該主鍵,則滿足二范式(2NF)瘟判,第二范式要求每個表只描述一件事怨绣。
例如:
字段 | 例子 |
---|---|
訂單編號 | 001 |
產(chǎn)品編號 | a011 |
訂購日期 | 2017-4-8 |
價格 | ¥30 |
而實際上角溃,產(chǎn)品編號與訂單編號并沒有明確的關(guān)系,訂購日期與訂單編號有關(guān)系篮撑,因為一旦訂單編號確定下來了开镣,訂購日期也確定了,價格與訂單編號也沒有直接關(guān)系咽扇,而與產(chǎn)品有關(guān),所以上面的表實際上可以拆分:
訂單表:
訂單編號
001
日期
2017-4-8
產(chǎn)品表:
產(chǎn)品編號 | a011 |
---|---|
價格 | ¥30 |
第三范式:在1NF基礎(chǔ)上陕壹,除了主鍵以外的其它列都不傳遞依賴于主鍵列质欲,或者說: 任何非主屬性不依賴于其它非主屬性
(在2NF基礎(chǔ)上消除傳遞依賴)
例如:
字段 | 例子 |
---|---|
訂單編號 | 001 |
訂購日期 | 2017-4-8 |
顧客編號 | a01 |
顧客姓名 | howard |
上面的滿足第一和第二范式,但是不滿足第三范式糠馆,原因如下:
通過顧客編號可以確定顧客姓名嘶伟,通過顧客姓名可以確定顧客編號,即在這個訂單表里又碌,這兩個字段存在傳遞依賴九昧,只需要一個就夠了。
又如:
主鍵 | 學(xué)號 | 姓名 | 成績 |
---|---|---|---|
1 | 111 | howard | 90 |
2 | 222 | tom | 90 |
上面的表毕匀,學(xué)號和姓名存在傳遞依賴铸鹰,因為(學(xué)號,姓名)->成績皂岔,學(xué)號->成績蹋笼,姓名->成績。所以學(xué)號和姓名有一個冗余了躁垛,只需要保留一個剖毯。
文章轉(zhuǎn)自https://blog.csdn.net/zymx14/article/details/69789326