資料庫泛型就是資料庫應該遵守的規則.資料庫泛型也稱為資料庫正規化.
目前關聯式資料庫有六種正規化:第一正規化(1nf)、第二正規化(2nf)、第三正規化(3nf)、巴斯-科德正規化(bcnf)、第四正規化(4nf)和第五正規化(5nf,又稱完美正規化)。滿足最低要求的正規化是第一正規化(1nf)。在第一正規化的基礎上進一步滿足更多規範要求的稱為第二正規化(2nf),其餘正規化以次類推。一般說來,資料庫只需滿足第三正規化(3nf)就行了。所以這裡就只記錄三正規化相關的知識。
三正規化:
1nf:表中字段不能重複,且字段不可在拆分;(原子性)
2nf:乙個表只能說明乙個事務,且非主鍵字段依賴主鍵;(唯一性)
3nf:非主鍵字段不能相互依賴;(每個字段必須與主鍵有直接關係,非主鍵字段不能相互依賴)
第一正規化(1nf)
即表的列的具有原子性,不可再分解,即列的資訊,不能分解, 只要資料庫是關係型資料庫(mysql/oracle/db2/informix/sysbase/sql server),就自動的滿足1nf。資料庫表的每一列都是不可分割的原子資料項,而不能是集合,陣列,記錄等非原子資料項。如果實體中的某個屬性有多個值時,必須拆分為不同的屬性 。通俗理解即乙個欄位只儲存一項資訊。
第二正規化(2nf)
第二正規化(2nf)是在第一正規化(1nf)的基礎上建立起來的,即滿足第二正規化(2nf)必須先滿足第一正規化(1nf)。第二正規化(2nf)要求資料庫表中的每個例項或行必須可以被惟一地區分。為實現區分通常需要我們設計乙個主鍵來實現(這裡的主鍵不包含業務邏輯)。
即滿足第一正規化前提,當存在多個主鍵的時候,才會發生不符合第二正規化的情況。比如有兩個主鍵,不能存在這樣的屬性,它只依賴於其中乙個主鍵,這就是不符合第二正規化。通俗理解是任意乙個欄位都只依賴表中的同乙個字段。(涉及到表的拆分)
第三正規化(3nf)
滿足第三正規化(3nf)必須先滿足第二正規化(2nf)。簡而言之,第三正規化(3nf)要求乙個資料庫表中不包含已在其它表中已包含的非主鍵字段。就是說,表的資訊,如果能夠被推導出來,就不應該單獨的設計乙個欄位來存放(能盡量外來鍵join就用外來鍵join)。很多時候,我們為了滿足第三正規化往往會把一張表分成多張表。
即滿足第二正規化前提,如果某一屬性依賴於其他非主鍵屬性,而其他非主鍵屬性又依賴於主鍵,那麼這個屬性就是間接依賴於主鍵,這被稱作傳遞依賴於主屬性。 通俗解釋就是一張表最多隻存兩層同型別資訊。
反三正規化
沒有冗餘的資料庫未必是最好的資料庫,有時為了提高執行效率,提高讀效能,就必須降低正規化標準,適當保留冗餘資料。具體做法是: 在概念資料模型設計時遵守第三正規化,降低正規化標準的工作放到物理資料模型設計時考慮。降低正規化就是增加字段,減少了查詢時的關聯,提高查詢效率,因為在資料庫的操作中查詢的比例要遠遠大於dml的比例。但是反正規化化一定要適度,並且在原本已滿足三正規化的基礎上再做調整的。
知乎上對正規化和反正規化的理解:
摘自 著作權歸作者所有。
資料庫設計應該也是分為三個境界的:
第乙個境界,剛入門資料庫設計,正規化的重要性還未深刻理解。這時候出現的反正規化設計,一般會出問題。
第二個境界,隨著遇到問題解決問題,漸漸了解到正規化的真正好處,從而能快速設計出低冗餘、高效率的資料庫。
第三個境界,再經過n年的鍛鍊,是一定會發覺正規化的侷限性的。此時再去打破正規化,設計更合理的反正規化部分。
正規化就像武俠裡面的招數,初學者妄想不按招數來,只能死的很難堪。畢竟招數都是高手總結歸納的精華。而隨著武功提高,招數熟練之後,必然是發現招數的侷限性,要麼忘掉招數,要麼自創招數。只要努力,加上多熬幾年,總能達到第二個境界,總會覺得正規化是經典。此時能不過分依賴正規化,快速突破正規化侷限性的人,自然是高手。
mysql的泛型 資料庫泛型(三正規化)
資料庫的設計正規化是資料庫設計所需要滿足的規範,滿足這些規範的資料庫是簡潔的 結構明晰的,同時,不會發生插入 insert 刪除 delete 和更新 update 操作異常。反之則是亂七八糟,不僅給資料庫的程式設計人員製造麻煩,而且面目可憎,可能儲存了大量不需要的冗餘資訊。正規化說明 1.1 第一...
泛型 泛型類 泛型方法 泛型擦除
1 是什麼?一種允許我們在不確定引數型別時候使用的型別。例如我不知道a方法應該會傳string還是int,我就用個泛型先佔坑。2 為什麼要用泛型?泛型可以在編譯期自動確定具體型別,檢查型別是否匹配,可以提高 的重用率,減少冗餘編碼。3 泛型與object的區別?像上面說的我不知道方法a的引數型別,其...
泛型 (2)泛型類 泛型方法 泛型介面
一 泛型類 定義person類 package cn.itcast.p2.bean public class person implements comparable public person string name,int age public int compareto person p ov...