第一正規化
原子性。表的元組不可再拆分成更小的元組。
第二正規化
非主鍵必須完全依賴主鍵,而不是僅僅依賴主鍵的一部分。
舉個例子,美國銷售軍火的時候,對每一樣**,根據國家或地區的不同而給出不同的**。建個表看看:
create
table weapon_price
( wp_id unsigned int
notnull auto_increment, -- **編號
cs_id unsigned int
notnull , -- 消費者 id
wp_price unsigned int
notnull, -- ****, 根據**買主的不同而不同
cs_name varchar(40) not
null -- 消費者的稱呼,例如 台灣/菲律賓/南韓
);
weapon_price 用於描述**的**,**根據(**,消費者)的不同而不同。對於此表 (wp_id,cs_id) 是其主鍵。其中 wp_price 是完全依賴於 (wp_id,cs_id) 的,而 cs_name 則只依賴於 cs_id ,即只依賴於主鍵的一部分。
這種情況導致的問題是什麼呢?
增:造成冗餘。cs_name 重複出現,如果有許多**的買主都是台灣,那麼 cs_name 就會在這張表中出現很多次,造成浪費。
刪:無
改:假如」菲律賓」後來改名了,那麼資料庫管理者不得不把表中所有 相關的 cs_name 全都改一遍。
查:無第三正規化
滿足第二正規化並且每個元組都不傳遞依賴於主鍵列。
create
table province
( pr_id unsigned int
notnull auto_increment, -- 主鍵
pr_name varchar(20) not
null, -- 省份名, 完全依賴於主鍵, pr_id 定了, pr_name 就定了
primary
key(pr_id)
);create
table city
( ct_id unsigned int
notnull auto_increment, -- 主鍵
ct_name varchar(20) not
null, -- 完全依賴於主鍵,ct_id 定了,ct_name 就定了
pr_id unsigned int
notnull , -- 完全依賴於主鍵,ct_id 定了,就可以確定 pr_id
pr_name varchar(20) not
null, -- 完全依賴於主鍵,ct_id 定了,就可以確定 pr_name
primary
key(ct_id),
foreign
key(pr_id) references province(pr_id) on
delete
cascade
);
上述的這兩張表都滿足第二正規化,不過,注意到 city 表中的 pr_name 元組雖然完全依賴於 ct_id , 但是它是通過 pr_id 傳遞依賴於 ct_id 的。
傳遞依賴的壞處:
增:明顯 pr_name 出現冗餘。
刪:無
改:改動 province 表的 pr_name 元組,也要同時修改 city 表中的 pr_name 。一不小心就出問題。
查:無反三正規化
沒有冗餘的資料庫未必是最好的資料庫,有時為了提高執行效率,提高讀效能,就必須降低正規化標準,適當保留冗餘資料。具體做法是: 在概念資料模型設計時遵守第三正規化,降低正規化標準的工作放到物理資料模型設計時考慮。降低正規化就是增加字段,減少了查詢時的關聯,提高查詢效率,因為在資料庫的操作中查詢的比例要遠遠大於dml的比例。但是反正規化化一定要適度,並且在原本已滿足三正規化的基礎上再做調整的。
mysql正規化學習 Mysql三大正規化
據庫設計正規化 什麼是正規化 簡言之就是,資料庫設計對資料的儲存效能,還有開發人員對資料的操作都有莫大的關係。所以建立科學的,規範的的資料庫是需要滿足一些 規範的來優化資料資料儲存方式。在關係型資料庫中這些規範就可以稱為正規化。什麼是三大正規化 第一正規化 當關係模式r的所有屬性都不能在分解為更基本...
mysql三大正規化 MySQL學習筆記
1 資料庫結構設計 1 總 總體流程圖 2 分 提取屬性 業務分析評價的屬性 3 分 屬性 物件 邏輯設計 1 寬表設計模式 存在資料冗餘問題 寬表設計模式 2 資料庫三大正規化 解決資料冗餘問題 資料庫三大正規化 3 反正規化設計 空間換時間 主要針對關聯表進行反正規化化設計2 資料庫物理設計 1...
MYSQL三大正規化
第一正規化 確保每列的原子性.如果每列 或者每個屬性 都是不可再分的最小資料單元 也稱為最小的原子單元 則滿足第一正規化.例如 顧客表 姓名 編號 位址 其中 位址 列還可以細分為國家 省 市 區等。第二正規化 在第一正規化的基礎上更進一層,目標是確保表中的每列都和主鍵相關.如果乙個關係滿足第一正規...