三個範式:數據庫
第一範式(1NF):數據表中的每一列(每一個字段)必須是不可拆分的最小單元,也就是確保每一列的原子性設計
這裏說的不可拆分一般是放在業務背景下而言的,是否可拆分視業務需求而定。如一張student表的adress表存省市縣時,若是業務須要針對更細粒度地址如市、縣作些CRUD操做則須要adress字段拆成province、city等字段。ci
第二範式(2NF):知足1NF後,要求表中的全部列,都必須依賴於主鍵,而不能有任何一列與主鍵沒有關係,也就是說一個表只描述一件事情it
如包含school_name、school_address字段的student表中,school_address是依賴於school而非student的,故應將school信息抽離到單獨的表中。總結
第三範式(3NF):必須先知足第二範式(2NF),要求:表中的每一列只與主鍵直接相關而不是間接相關,(表中的每一列只能依賴於主鍵)數據
上述school信息抽離到單獨表後,student表中只需有school_id(外鍵)來關聯school便可,而不須要其餘school相關屬性,由於其餘school屬性直接依賴於school_id而非student_id查詢
區別:margin
第 一範式和第二範式在於有沒有分出兩張表,第二範式是說一張表中包含了多種不一樣的實體屬性,那麼要必須分紅多張表, 第三範式是要求已經分紅了多張表,那麼一張表中只能有另外一張表中的id(主鍵),而不能有其餘的任何信息(其餘的信息一概用主鍵在另外一表查詢)vi
總結:範式
第一範式:每一個表中都有1列,而且該列是不可拆分的最小單元
第二範式:1張表只描述一件事情
第三範式:用外鍵作表的關聯
數據庫範式只是理論上建議這樣設計,實際中結合業務須要可視狀況稍有違背,而不是死腦筋一味地按該範式來。