你真的會玩SQL嗎?系列目錄
每次上新功能時都需要添加新表,這時就要涉及到表結構的設計,那就要提到三范式,對於三范式教科書上說得很繞口,那簡單點的呢?
三范式
第一范式:屬性不可分,不允許存在隱藏字段,屬性保持“原子性”
第二范式:要有主鍵。為實現區分通常需要為表加上一個列,以存儲各個實例的唯一標識。
第三范式:要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字信息。
正規化范式(BCDF):所有表中的決定因素必須是一個候選鍵,如果只有一個候選鍵,那么就和第三范式是一樣的。
第四范式(4NF):消除多值依賴。
第五范式(5NF):消除循環依賴。
我們設計表結構往往都尊從簡單的三范式,從其他元素中消除數據冗余問題, 從特定的表中最小化冗余意味着擺脫不必要的數據。
先看看目的,消除數據冗余的影響如下:
❑物理空間需要存儲的數據減少。
❑數據變得更有組織。
❑范式化允許修改少量的數據(即單記錄)。換言之,一個表的具體字段記錄更新時,會影響其他引用他的表。
但是,設計表遵從范式越高則存在“過度設計“的問題,會增加多表間的查詢開銷,我們只能適度的設計,適度的反范式。如上圖中3范式,若就想把樓棟一起查詢出來,那從設計上可以分開,另用一個視圖將樓棟名稱一起查詢出來即可。
數據完整性
數據庫中的數據是從外界輸入的,而數據的輸入由於種種原因,會發生輸入無效或錯誤信息。保證輸入的數據符合規定,成為了數據庫系統,尤其是多用戶的關系數據庫系統首要關注的問題。數據完整性因此而提出。
數據完整性保證了在數據庫中存儲數據的一致性和正確性。
- 實體完整性:保證每一行都能被由稱為主鍵的屬性來標識
- 域完整性:保證在效范圍內的值才能存儲到相應列中
- 引用完整性:確保外鍵的值必須與相關的主鍵相匹配,禁止在從表中插入包含主表中不存在的關鍵字的數據行;
- 用戶定義完整性:由用戶指定的一組規則
實現數據完整性的主要方式是約束
- 主鍵約束 primary key 確保字段值不重復不為NULL
- 唯一約束 unique 確保字段值不重復
- 外鍵約束 foreign key 確保字段值必須來自於指定表
- 檢查約束 check 確保字段值的取值范圍
- 缺省約束 default 給相應字段提供默認值
- 注:約束即可在創表時創建,也可在已存在的表上添加
練習
若想更深入了解可看一下園友的文章
你真的了解 “范式”嗎?