范式設(shè)計可以消除數(shù)據(jù)庫的數(shù)據(jù)冗余及插入異常,但是過分的范式設(shè)計可能導致數(shù)據(jù)查詢時需要關(guān)聯(lián)多張表,導致數(shù)據(jù)庫查詢效率下降,因此在實際工作中,需要適當?shù)姆捶妒皆O(shè)計。
舉例說明,某在線圖書銷售網(wǎng)站,希望實現(xiàn)如下功能: 1)用戶登錄 2)用戶管理 3)商品展示 4)商品管理 5)供應商管理 6)在線銷售
符合三范式的數(shù)據(jù)庫設(shè)計
用戶信息表 : 用戶名(主鍵),密碼,姓名,手機號,注冊日期
圖書信息表 : 圖書名稱(主鍵),出版社名詞,圖書價格圖書描述,作者
分類信息表 : 分類名詞(主鍵),分類描述
圖書分類表 : (圖書名詞,圖書分類)(主鍵)
供應商信息表:出版社名詞(主鍵),地址,電話,聯(lián)系人,銀行帳號
訂單表:訂單編號(主鍵),用戶名,下單日期,物流單號
訂單圖書關(guān)聯(lián)表 : (訂單編號,圖書名稱)(主鍵), 商品數(shù)量
在如上的數(shù)據(jù)庫設(shè)計中,如果需要查詢每個用戶的消費總金額
select 用戶名, sum(c.圖書價格*b.商品數(shù)量)
from 訂單表 a join 訂單圖書關(guān)聯(lián)表 b on a.訂單編號=b.訂單編號
join 圖書信息表 c on b.圖書名稱=c.圖書名稱
group by 用戶名
以上查詢需要關(guān)聯(lián)3張表,因為在線銷售經(jīng)常會有促銷活動,商品價格時而會波動,在以上設(shè)計中,如果圖書價格發(fā)生變化,則查詢結(jié)果也會發(fā)生變化。
如果需要查詢下單用戶和訂單詳情
select a.訂單編號 a.用戶名 c.圖書名稱 b.商品數(shù)量 c.圖書價格
from 訂單表 a join 訂單圖書關(guān)聯(lián)表 b on a.訂單編號=b.訂單編號
join 圖書信息表 c on b.圖書名稱=c.圖書名稱
以上查詢也需要關(guān)聯(lián)3張表格。
反范式設(shè)計 ,在 訂單表 和 訂單圖書關(guān)聯(lián)表 中增加冗余數(shù)據(jù)
訂單表:訂單編號(主鍵),用戶名,下單日期,物流單號,訂單金額
訂單圖書關(guān)聯(lián)表 : (訂單編號,圖書名稱)(主鍵), 商品數(shù)量,圖書價格
在如上的數(shù)據(jù)庫設(shè)計中,如果需要查詢每個用戶的消費總金額
select 用戶名,sum(訂單金額) from 訂單表 group by (用戶名)
需要查詢下單用戶和訂單詳情
select a.訂單編號 a.用戶名 b.圖書名稱 b.商品數(shù)量 b.圖書價格
from 訂單表 a join 訂單圖書關(guān)聯(lián)表 b on a.訂單編號=b.訂單編號
反范式設(shè)計后,因為 訂單圖書關(guān)聯(lián)表 已經(jīng)保存了當時的商品價格,所以商品價格波動并不影響查詢結(jié)果,而且減小查詢需要關(guān)聯(lián)的表。
反范式設(shè)計需要更具具體業(yè)務(wù)實際決定,將經(jīng)常使用的業(yè)務(wù)表進行合理的反范式設(shè)計可以提高數(shù)據(jù)庫的查詢效率。
在實際的業(yè)務(wù)工作中,一般不使用外鍵,因為外鍵會在每次數(shù)據(jù)插入時進行合法性校驗,這樣回極大的拖累數(shù)據(jù)庫的插入效率。
新聞熱點
疑難解答
圖片精選