規範化你的數據庫:第一範式

這兩個簡單的規則將有助於規範化數據庫

第一範式(1NF)為有組織的數據庫設置基本規則:

在考慮數據庫的實際設計時,這些規則意味著什麼? 其實很簡單。

1.消除重複

第一條規則規定我們不得在表格的同一行內復制數據。 在數據庫社區中,這個概念被稱為表的原子性。 據說這個規則的表格被認為是原子的。 讓我們用一個經典的例子來探索這個原理:一個人力資源數據庫中的一張表,存儲經理 - 從屬關係。 就我們的例子而言,我們會強制規定每個經理可能有一個或多個下屬,而每個下屬可能只有一個經理。

直觀地說,創建一個列表或電子表格來跟踪這些信息時,我們可能會創建一個包含以下字段的表格:

但是,回想1NF強加的第一條規則:消除同一個表中的重複列。 顯然,Subordinate1-Subordinate4列是重複的。 花點時間思考這種情況引發的問題。 如果經理只有一個下屬,Subordinate2-Subordinate4列只是浪費了存儲空間(一種寶貴的數據庫商品)。 此外,設想一個經理已經有4個下屬的情況 - 如果她接管另一個員工會發生什麼情況? 整個表格結構將需要修改。

在這一點上,數據庫新手通常會遇到第二個明智的想法:我們不希望有多個列,我們希望允許靈活的數據存儲。 讓我們嘗試這樣的事情:

而下屬字段將包含“Mary,Bill,Joe”形式的多個條目。

這個解決方案比較接近,但也不符合標準。 下屬專欄仍然是重複的,並且是非原子的。 當我們需要添加或刪除下屬時會發生什麼? 我們需要讀取和寫入表格的全部內容。 在這種情況下這不是什麼大問題,但如果一位經理有一百名員工呢? 而且,它在將來的查詢中從數據庫選擇數據的過程變得複雜。

這是一張滿足1NF第一條規則的表格:

在這種情況下,每個下屬都有一個條目,但管理者可能有多個條目。

2.確定主鍵

現在,第二條規則是什麼:使用唯一列或一組列( 主鍵 )標識每一行? 你可以看看上面的表格,並建議使用從屬列作為主鍵。 事實上,由於我們的業務規則指定每個下屬可能只有一個經理,所以下級列是主鍵的良好候選人。 然而,我們選擇存儲在我們的表中的數據使得這不是理想的解決方案。 如果我們僱用另一名名叫吉姆的員工會怎樣? 我們如何將他的經理 - 從屬關係存儲在數據庫中?

最好使用真正唯一的標識符(如員工ID)作為主鍵 。 我們的決賽桌看起來像這樣:

現在,我們的桌子是第一種正常形式! 如果您想繼續學習規範化,請閱讀本系列中的其他文章: