明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

數(shù)據(jù)庫(kù)3范式與反范式

[摘要]在日常開(kāi)發(fā)過(guò)程中,我們需要對(duì)Mysql數(shù)據(jù)庫(kù)進(jìn)行操作,這就涉及到表的構(gòu)建,如何創(chuàng)建一個(gè)結(jié)構(gòu)良好的數(shù)據(jù)庫(kù)表,就需要遵循以下3個(gè)數(shù)據(jù)庫(kù)范式。1. 第一范式確保數(shù)據(jù)表中每列(字段)的原子性。如果數(shù)據(jù)表中每...
在日常開(kāi)發(fā)過(guò)程中,我們需要對(duì)Mysql數(shù)據(jù)庫(kù)進(jìn)行操作,這就涉及到表的構(gòu)建,如何創(chuàng)建一個(gè)結(jié)構(gòu)良好的數(shù)據(jù)庫(kù)表,就需要遵循以下3個(gè)數(shù)據(jù)庫(kù)范式。

1. 第一范式

確保數(shù)據(jù)表中每列(字段)的原子性。

如果數(shù)據(jù)表中每個(gè)字段都是不可再分的最小數(shù)據(jù)單元,則滿(mǎn)足第一范式。

例如:user用戶(hù)表,包含字段id,username,password

2. 第二范式

在第一范式的基礎(chǔ)上更進(jìn)一步,目標(biāo)是確保表中的每列都和主鍵相關(guān)。

如果一個(gè)關(guān)系滿(mǎn)足第一范式,并且除了主鍵之外的其他列,都依賴(lài)于該主鍵,則滿(mǎn)足第二范式。

例如:一個(gè)用戶(hù)只有一種角色,而一個(gè)角色對(duì)應(yīng)多個(gè)用戶(hù)。則可以按如下方式建立數(shù)據(jù)表關(guān)系,使其滿(mǎn)足第二范式。

user用戶(hù)表,字段id,username,password,role_id

role角色表,字段id,name

用戶(hù)表通過(guò)角色id(role_id)來(lái)關(guān)聯(lián)角色表

3. 第三范式

在第二范式的基礎(chǔ)上更進(jìn)一步,目標(biāo)是確保表中的列都和主鍵直接相關(guān),而不是間接相關(guān)。

例如:一個(gè)用戶(hù)可以對(duì)應(yīng)多個(gè)角色,一個(gè)角色也可以對(duì)應(yīng)多個(gè)用戶(hù)。則可以按如下方式建立數(shù)據(jù)表關(guān)系,使其滿(mǎn)足第三范式。

user用戶(hù)表,字段id,username,password

role角色表,字段id,name

user_role用戶(hù)-角色中間表,id,user_id,role_id

像這樣,通過(guò)第三張表(中間表)來(lái)建立用戶(hù)表和角色表之間的關(guān)系,同時(shí)又符合范式化的原則,就可以稱(chēng)為第三范式。

4. 反范式化

反范式化指的是通過(guò)增加冗余或重復(fù)的數(shù)據(jù)來(lái)提高數(shù)據(jù)庫(kù)的讀性能。

例如:在上例中的user_role用戶(hù)-角色中間表增加字段role_name。

反范式化可以減少關(guān)聯(lián)查詢(xún)時(shí),join表的次數(shù)。

以上就是我整理到的關(guān)于MYSQL數(shù)據(jù)庫(kù)的建表范式,希望今后會(huì)對(duì)大家有所幫助。

相關(guān)文章:
MySQL索引優(yōu)化之覆蓋索引

mysql字段類(lèi)型選擇方法

mysql鎖和索引之間的聯(lián)系

以上就是數(shù)據(jù)庫(kù)三范式和反范式的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!


學(xué)習(xí)教程快速掌握從入門(mén)到精通的SQL知識(shí)。