數(shù)據(jù)庫(kù)3范式與反范式
發(fā)表時(shí)間:2023-07-20 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]在日常開(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í)。