建立一個滿足第一正規化 (DBMS) 的示例表格
如果一個表存在資料冗餘且未正確規範化,則難以處理和更新。如果關係包含複合屬性或多值屬性,則違反第一正規化。
如果滿足以下條件,則表處於第一正規化:
- 只有單值屬性。
- 屬性域不變。
- 每個屬性或列都有唯一的名稱。
- 資料儲存的順序無關緊要。
示例
考慮下表:
| ID | 姓名 | 課程 |
|---|---|---|
| 1 | A | C1,C2 |
| 2 | E | C3 |
| 3 | B | C2,C3 |
上表是非規範化形式,課程屬性具有多值屬性,違反了第一正規化。
現在我們透過為每門課程建立一個新行來表示上表:
| ID | 姓名 | 課程 |
|---|---|---|
| 1 | A | C1 |
| 1 | A | C2 |
| 2 | E | C3 |
| 3 | B | C2 |
| 3 | B | C4 |
上表由於課程存在冗餘資料,因為對於每個課程編號,我們都必須重複所有學生的資訊。因此,課程屬性應與上表分離。
我們將上表 R 分解成兩個表,這是規範化的概念:
R1(鍵, 多值屬性), R2(R-多值屬性)
=>R1(Id, course), R2(Id , name).
分解第一正規化表的步驟
將重複組中出現的所有專案放在新表中。為生成的每個新表找到主鍵。在新表中複製從中提取重複組的表的原表主鍵,反之亦然。
R1
| ID | 課程 |
|---|---|
| 1 | C1 |
| 1 | C2 |
| 2 | C3 |
| 3 | C2 |
| 3 | C4 |
R2
| ID | 姓名 |
|---|---|
| 1 | A |
| 2 | E |
| 3 | B |
R1 和 R2 都滿足第一正規化。
R1 的鍵 = ID
R2 的鍵 = (學號, 課程)
上表現在滿足第一正規化,因為沒有多值屬性。但它不滿足第二正規化,因為 ID->name 是部分依賴關係 {因為姓名依賴於鍵的一部分}。
異常
該表還存在以下異常:
**插入異常** — 除非我們有學生需要學習該科目,否則我們無法將新的課程(例如“C6”)插入到表中。
**更新異常** — 如果我們將課程從 C2 更改為 C5,則必須在多個地方進行更改,否則表將不一致。
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP