一芒粹、函數(shù)依賴
記 A->B 表示 A 函數(shù)決定 B,也可以說 B 函數(shù)依賴于 A废菱。
如果 {A1技矮,A2抖誉,... ,An} 是關(guān)系的一個或多個屬性的集合衰倦,該集合函數(shù)決定了關(guān)系的其它所有屬性并且是最小的袒炉,那么該集合就稱為鍵碼。
對于 A->B樊零,如果能找到 A 的真子集 A'我磁,使得 A'-> B,那么 A->B 就是部分函數(shù)依賴驻襟,否則就是完全函數(shù)依賴夺艰。
對于 A->B,B->C沉衣,則 A->C 是一個傳遞函數(shù)依賴郁副。
二、范式
高級別范式依賴于低級別范式
- 第一范式(1NF):屬性不可分
- 第二范式(2NF):每個非主屬性完全依賴于鍵碼豌习。
- 第三范式(3NF):非主屬性不傳遞依賴于鍵碼
三存谎、特點
- 在范式化的數(shù)據(jù)庫中,每個事實數(shù)據(jù)會出現(xiàn)并且只出現(xiàn)一次肥隆。
- 在反范式化的數(shù)據(jù)庫中既荚,信息是冗余的,可能會存儲在多個地方栋艳。
范式的優(yōu)點
當(dāng)為性能問題尋求幫助時恰聘,常會被建議對schema進行范式化設(shè)計,尤其是寫密集的場景吸占。
- 范式化的更新操作通常比反范式快晴叨。
- 當(dāng)數(shù)據(jù)較好地范式化時,就只有很少或者沒有重復(fù)數(shù)據(jù)旬昭,所以只需要修改更少的數(shù)據(jù)篙螟。
- 范式化的表通常更小,可以更好地放在內(nèi)存里问拘,所以執(zhí)行操作會更快遍略。
- 很少有多余的數(shù)據(jù)意味著檢索列表數(shù)據(jù)時更少需要DISTINCT或者GROUP BY語句。
范式的缺點
- 通常需要關(guān)聯(lián)骤坐。稍微復(fù)雜一些的查詢語句在符合范式的schema上都可能需要至少一次關(guān)聯(lián)绪杏,也許更多。
- 代價昂貴
- 可能使一些索引策略無效纽绍。如蕾久,范式化可能將列存放在不同的表中,而這些列如果在一個表中本可以屬于同一個索引拌夏。
反范式的優(yōu)點
- 所有數(shù)據(jù)都在一張表中僧著,可以很好地避免關(guān)聯(lián)履因。大部分查詢最差情況是全表掃描。當(dāng)數(shù)據(jù)比內(nèi)存大時盹愚,這可能比關(guān)聯(lián)要快得多栅迄,因為這樣避免了隨機IO。全表掃描基本上是順序IO皆怕,跟引擎的實現(xiàn)有關(guān)毅舆。
- 能使用更有效的索引策略。
反范式的缺點
- 冗余數(shù)據(jù)
- 修改異常:修改了一個記錄中的信息愈腾,但是另一個記錄中相同的信息卻沒有被修改憋活。
- 刪除異常:刪除一個信息,那么也會丟失其它信息虱黄。
- 插入異常:缺少屬性悦即,無法加入