第一范式(1NF)
◇ 每一列必須僅包含一個值(也稱作列值的原子性或不可再分割性)。比如存儲用戶地址,一列不能同時存國家、省、市、街道等信息。
◇ 所有表都不能具有相關數據的重復列。比如商品圖片,不能圖片1用一列,圖片2用一列,圖片3用一列......,如果一個表有重復的相似列,就采用關系模型(一對一,一對多)把這些列轉化成單獨的表。
第一范式就是橫向分析表,確保橫向列值的唯一性並避免重復出現類似的數據。
第二范式(2NF)
◇ 某一列在多行中不能有重復的非主鍵值,重復的非主鍵值必定是另一張表的主鍵值。這裡比較有疑惑的就是時間字段,其實MySQL對日期支持的非常好,還有就是在同一秒內出現完全相同的操作概率是極低的。
◇ 表中每一個非主鍵都依賴於表的主鍵。
第二范式就是縱向分析表,確保縱向列值不含重復的非主鍵值。查看表之間的關系,如果出現多對多的關系時,就要拆表再新建關聯表,一個表的主鍵通常是另一個表的外鍵。
第三范式(3NF)
◇ 表中的單列是獨立的,也就是修改某一列的值不需要修改另一列的值,不能存在一列是另一列的子集,比如a->b->c,c是b中的屬性,那麼bc就不能同時出現在一張表中。但列與列之間又是相互依賴的。
數據庫設計允許有個人的愛好和诠釋,但最重要的要求是不要明顯地違反范式,任何違反范式的設計都會在將來出現一些問題。規范化就是在數據完整性與可擴展性,簡單與快速之間進行權衡,實踐和經驗將會讓我們掌握最佳的數據建模方式,並盡可能地遵守范式。