正規化與關係_資料庫4
非原創
本文轉自
(隨機生成,隨機值根據時間+加密後生成編碼)-------woff結尾檔案(知道什麼編碼對應什麼圖片,存放金鑰)---->9
用卷積公式判斷兩個檔案重複率超過百分之多少就算兩個相同
示例表資料
假設有一個名為employee
的員工表,它有九個屬性:id
(員工編號)、name
(員工名稱)、mobile
(電話)、zip
(郵編)、province
(省份)、city
(城市)、district
(區縣)、deptNo
(所屬部門編號)、deptName
(所屬部門名稱)、表總資料如下:
id | name | mobile | zip | province | city | district | deptNo | deptName |
---|---|---|---|---|---|---|---|---|
101 | 張三 | 13910000001 13910000002 | 100001 | 北京 | 北京 | 海淀區 | D1 | 部門1 |
101 | 張三 | 13910000001 13910000002 | 100001 | 北京 | 北京 | 海淀區 | D2 | 部門2 |
102 | 李四 | 13910000003 | 200001 | 上海 | 上海 | 靜安區 | D3 | 部門3 |
103 | 王五 | 13910000004 | 510001 | 廣東省 | 廣州 | 白雲區 | D4 | 部門4 |
103 | 王五 | 13910000004 | 510001 | 廣東省 | 廣州 | 白雲區 | D5 | 部門 5 |
由於此員工表是非規範化的,我們將面對如下的問題。
- 修改異常:上表中張三有兩條記錄,因為他隸屬於兩個部門。如果我們要修改張三的地址,必修修改兩行記錄。假如一個部門得到了張三的新地址並進行了更新,而另一個部門沒有,那麼此時張三在表中會存在兩個不同的地址,導致了資料不一致
- 新增異常:假如一個新員工假如公司,他正處於入職培訓階段,還沒有被正式分配到某個部門,如果
deptNo
欄位不允許為空,我們就無法向employee
表中新增該員工的資料。- 刪除異常:假設公司撤銷了D3部門,那麼在刪除
deptNo
為D3的行時,會將李四的資訊也一併刪除。因為他隸屬於D3這一部門。
正規化主要是將每個表功能獨立化,簡潔,更好表達他們之間的關係
第一正規化(1NF)
表中的列只能含有原子性(不可再分)的值。
表中的張三有兩個手機號儲存在mobile列中,違反了 1NF 規則。為了使表滿足 1NF,資料應該修改如下:
id | name | mobile | zip | province | city | district | deptNo | deptName |
---|---|---|---|---|---|---|---|---|
101 | 張三 | 13910000001 | 100001 | 北京 | 北京 | 海淀區 | D1 | 部門1 |
101 | 張三 | 13910000002 | 100001 | 北京 | 北京 | 海淀區 | D1 | 部門1 |
101 | 張三 | 13910000001 | 100001 | 北京 | 北京 | 海淀區 | D2 | 部門2 |
101 | 張三 | 13910000002 | 100001 | 北京 | 北京 | 海淀區 | D2 | 部門2 |
102 | 李四 | 13910000003 | 200001 | 上海 | 上海 | 靜安區 | D3 | 部門3 |
103 | 王五 | 13910000004 | 510001 | 廣東省 | 廣州 | 白雲區 | D4 | 部門4 |
103 | 王五 | 13910000004 | 510001 | 廣東省 | 廣州 | 白雲區 | D5 | 部門 5 |
第二正規化(2NF)
第二正規化要同時滿足下面兩個條件
- 滿足第一正規化
- 沒有部分依賴
例如,員工表的一個候選鍵是{id,mobile,deptNo},而deptName依賴於deptNo,同樣 name 依賴於 id,因此不是 2NF的。為了滿足第二正規化的條件,需要將這個表拆分成employee、dept、employee_dept、employee_mobile四個表。如下:
員工表 employee
id | name | zip | province | city | district |
---|---|---|---|---|---|
101 | 張三 | 100001 | 北京 | 北京 | 海淀區 |
102 | 李四 | 200001 | 上海 | 上海 | 靜安區 |
103 | 王五 | 510001 | 廣東省 | 廣州 | 白雲區 |
部門表 dept
deptNo | deptName |
---|---|
D1 | 部門1 |
D2 | 部門2 |
D3 | 部門3 |
D4 | 部門4 |
D5 | 部門5 |
員工部門關係表 employee_dept
id | deptNo |
---|---|
101 | D1 |
101 | D2 |
102 | D3 |
103 | D4 |
104 | D5 |
員工電話表 employee_mobile
id | mobile |
---|---|
101 | 13910000001 |
101 | 13910000002 |
102 | 13910000003 |
103 | 13910000004 |
第三正規化(3NF)
第三正規化要同時滿足下面兩個條件
- 滿足第二正規化
- 沒有傳遞依賴
例如,員工表的province、city、district依賴於zip,而zip依賴於id,換句話說,province、city、district傳遞依賴於id,違反了 3NF 規則。為了滿足第三正規化的條件,可以將這個表拆分成employee和zip兩個表,如下
employee
id | name | zip |
---|---|---|
101 | 張三 | 100001 |
102 | 李四 | 200001 |
103 | 王五 | 510001 |
地區表area
zip | province | city | district |
---|---|---|---|
100001 | 北京 | 北京 | 海淀區 |
200001 | 上海 | 上海 | 靜安區 |
51000 | 廣東省 | 廣州 | 白雲區 |
在關係資料庫模型設計中,一般需要滿足第三正規化的要求。如果一個表具有良好的主外來鍵設計,就應該是滿足3NF的表。規範化帶來的好處是通過減少資料冗餘提高更新資料的效率,同時保證資料完整性。然而,我們在實際應用中也要防止過度規範化的問題。規範化程度越高,劃分的表就越多,在查詢資料時越有可能使用表連線操作。而如果連線的表過多,會影響查詢效能。關鍵的問題是要依據業務需求,仔細權衡資料查詢和資料更新關係,指定最合適的規範化程度。不要為了遵循嚴格的規範化規則而修改業務需求
資料庫一對一、一對多、多對多設計
資料庫實體間有三種對應關係:一對一、一對多、多對多
一對一關係示例:
一個學生對應一個學生檔案材料 每個人都有唯一的身份證號
一對多關係示例:
一個學生只屬於一個班,但這個班有多名學生
多對多關係示例:
一個學生可以選擇多門課,一門課也可以有多名學生
一個人可以有多個角色,一個角色可以有多個人
一、一對多關係處理
設計資料庫表:只需在 學生表 中多新增一個班級號的ID即可
二、多對多關係處理
關係
-
建立成績表scores,結構如下
- id
- 學生
- 科目
- 成績
-
思考:學生列應該存什麼資訊呢?
-
答:學生列的資料不是在這裡新建的,而應該從學生表引用過來,關係也是一條資料;根據正規化要求應該儲存學生的編號,而不是學生的姓名等其它資訊
-
同理,科目表也是關係列,引用科目表中的資料
關係
- 建立表的語句如下
create table scores(
id int primary key auto_increment,
stuid int,
subid int,
score decimal(5,2)
);
外來鍵
- 思考:怎麼保證關係列資料的有效性呢?任何整數都可以嗎?
- 答:必須是學生表中id列存在的資料,可以通過外來鍵約束進行資料的有效性驗證
- 為stuid新增外來鍵約束
alter table scores add constraint stu_sco foreign key(stuid) references students(id);
- 此時插入或者修改資料時,如果stuid的值在students表中不存在則會報錯
- 在建立表時可以直接建立約束
create table scores(
id int primary key auto_increment,
stuid int,
subid int,
score decimal(5,2),
foreign key(stuid) references students(id),
foreign key(subid) references subjects(id)
);
- 在刪除students表的資料時,如果這個id值在scores中已經存在,則會拋異常
- 推薦使用邏輯刪除,還可以解決這個問題
- 可以建立表時指定級聯操作,也可以在建立表後再修改外來鍵的級聯操作
- 語法
alter table scores add constraint stu_sco foreign key(stuid) references students(id) on delete cascade;
-
級聯操作的型別包括:
- restrict(限制):預設值,拋異常
- cascade(級聯):如果主表的記錄刪掉,則從表中相關聯的記錄都將被刪除
- set null:將外來鍵設定為空
- no action:什麼都不做