1. 程式人生 > 資料庫 >正規化與關係_資料庫4

正規化與關係_資料庫4

非原創

本文轉自

 

(隨機生成,隨機值根據時間+加密後生成編碼)-------woff結尾檔案(知道什麼編碼對應什麼圖片,存放金鑰)---->9

用卷積公式判斷兩個檔案重複率超過百分之多少就算兩個相同

 

 

 

示例表資料

假設有一個名為employee的員工表,它有九個屬性:id(員工編號)、name(員工名稱)、mobile(電話)、zip(郵編)、province(省份)、city(城市)、district(區縣)、deptNo(所屬部門編號)、deptName(所屬部門名稱)、表總資料如下:

idnamemobilezipprovincecitydistrictdeptNodeptName
101張三13910000001
13910000002
100001北京北京海淀區D1部門1
101張三13910000001
13910000002
100001北京北京海淀區D2部門2
102李四13910000003200001上海上海靜安區D3部門3
103王五13910000004510001廣東省廣州白雲區D4部門4
103王五13910000004510001廣東省廣州白雲區D5部門 5

由於此員工表是非規範化的,我們將面對如下的問題。

  • 修改異常:上表中張三有兩條記錄,因為他隸屬於兩個部門。如果我們要修改張三的地址,必修修改兩行記錄。假如一個部門得到了張三的新地址並進行了更新,而另一個部門沒有,那麼此時張三在表中會存在兩個不同的地址,導致了資料不一致
  • 新增異常:假如一個新員工假如公司,他正處於入職培訓階段,還沒有被正式分配到某個部門,如果deptNo
    欄位不允許為空,我們就無法向employee表中新增該員工的資料。
  • 刪除異常:假設公司撤銷了D3部門,那麼在刪除deptNo為D3的行時,會將李四的資訊也一併刪除。因為他隸屬於D3這一部門。

正規化主要是將每個表功能獨立化,簡潔,更好表達他們之間的關係

第一正規化(1NF)

表中的列只能含有原子性(不可再分)的值。

表中的張三有兩個手機號儲存在mobile列中,違反了 1NF 規則。為了使表滿足 1NF,資料應該修改如下:

idnamemobilezipprovincecitydistrictdeptNodeptName
101張三13910000001100001北京北京海淀區D1部門1
101張三13910000002100001北京北京海淀區D1部門1
101張三13910000001100001北京北京海淀區D2部門2
101張三13910000002100001北京北京海淀區D2部門2
102李四13910000003200001上海上海靜安區D3部門3
103王五13910000004510001廣東省廣州白雲區D4部門4
103王五13910000004510001廣東省廣州白雲區D5部門 5

第二正規化(2NF)

第二正規化要同時滿足下面兩個條件

  • 滿足第一正規化
  • 沒有部分依賴

例如,員工表的一個候選鍵是{id,mobile,deptNo},而deptName依賴於deptNo,同樣 name 依賴於 id,因此不是 2NF的。為了滿足第二正規化的條件,需要將這個表拆分成employee、dept、employee_dept、employee_mobile四個表。如下:

員工表 employee

idnamezipprovincecitydistrict
101張三100001北京北京海淀區
102李四200001上海上海靜安區
103王五510001廣東省廣州白雲區

部門表 dept

deptNodeptName
D1部門1
D2部門2
D3部門3
D4部門4
D5部門5

員工部門關係表 employee_dept

iddeptNo
101D1
101D2
102D3
103D4
104D5

員工電話表 employee_mobile

idmobile
10113910000001
10113910000002
10213910000003
10313910000004

第三正規化(3NF)

第三正規化要同時滿足下面兩個條件

  • 滿足第二正規化
  • 沒有傳遞依賴

例如,員工表的province、city、district依賴於zip,而zip依賴於id,換句話說,province、city、district傳遞依賴於id,違反了 3NF 規則。為了滿足第三正規化的條件,可以將這個表拆分成employee和zip兩個表,如下

employee

idnamezip
101張三100001
102李四200001
103王五510001

地區表area

zipprovincecitydistrict
100001北京北京海淀區
200001上海上海靜安區
51000廣東省廣州白雲區

在關係資料庫模型設計中,一般需要滿足第三正規化的要求。如果一個表具有良好的主外來鍵設計,就應該是滿足3NF的表。規範化帶來的好處是通過減少資料冗餘提高更新資料的效率,同時保證資料完整性。然而,我們在實際應用中也要防止過度規範化的問題。規範化程度越高,劃分的表就越多,在查詢資料時越有可能使用表連線操作。而如果連線的表過多,會影響查詢效能。關鍵的問題是要依據業務需求,仔細權衡資料查詢和資料更新關係,指定最合適的規範化程度。不要為了遵循嚴格的規範化規則而修改業務需求

資料庫一對一、一對多、多對多設計


資料庫實體間有三種對應關係:一對一、一對多、多對多

一對一關係示例:

一個學生對應一個學生檔案材料 每個人都有唯一的身份證號

一對多關係示例:

一個學生只屬於一個班,但這個班有多名學生

多對多關係示例:

一個學生可以選擇多門課,一門課也可以有多名學生

一個人可以有多個角色,一個角色可以有多個人

 

一、一對多關係處理

img

設計資料庫表:只需在 學生表 中多新增一個班級號的ID即可

二、多對多關係處理

img

img

 

關係

  • 建立成績表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:什麼都不做