在動態(tài)網(wǎng)站的設(shè)計中,數(shù)據(jù)庫設(shè)計的重要性不言而喻。如果設(shè)計不當(dāng),查詢起來就非常吃力,程序的性能也會受到影響。無論你使用的是mySQL或者Oracle數(shù)據(jù)庫,通過進(jìn)行正規(guī)化的表格設(shè)計,可以令你的PHP代碼更具可讀性,更容易擴(kuò)展,從而也會提升應(yīng)用的性能。
簡單說來,正規(guī)化就是在表格設(shè)計時,消除冗余性和不協(xié)調(diào)的從屬關(guān)系。在本文中,我將通過五個漸進(jìn)的過程來告訴你在設(shè)計中應(yīng)該了解的正規(guī)化技巧。從而建立一個可行而且效率高的數(shù)據(jù)庫。本文也會詳細(xì)分析一下可以利用的關(guān)系類型。
這里假定我們要建立一個用戶信息的表格,其中要存儲用戶的名字、公司、公司地址和一些個人的收藏夾或url。在開始時,你可能定義一個如下的表格結(jié)構(gòu):
零狀態(tài)形式
users
name company company_address url1 url2
Joe ABC 1 Work Lane abc.com xyz.com
Jill XYZ 1 Job Street abc.com xyz.com
由于沒有進(jìn)行任何的正規(guī)化處理,我們將這種形式的表稱為零狀態(tài)形式的表。留意其中的url1和url2字段---如果我們在應(yīng)用中需要第三個url呢?這樣你就要在表格中多加一列,很明顯,這不是一個好辦法。如果你要創(chuàng)建一個富有擴(kuò)展性的系統(tǒng),你就要考慮使用第一個正規(guī)化的形式,并且應(yīng)用到該表格中。
第一級正規(guī)化形式
1.消除每個表格中重復(fù)的組
2.為每套相關(guān)的數(shù)據(jù)建立一個獨(dú)立的表格
3.使用一個主鍵來標(biāo)識每套相關(guān)的數(shù)據(jù)
以上的表格明顯違反了上面第一條的規(guī)定,那么第三條的主鍵又是什么意思呢?很簡單,它只是在每個記錄中加入一個的、自動增加的整型值。通過這個值,就可以將兩個姓名一樣的記錄區(qū)分開來。通過應(yīng)用第一級正規(guī)化形式,我們得到了以下的表格:
users
userId name company company_address url
1 Joe ABC 1 Work Lane abc.com
1 Joe ABC 1 Work Lane xyz.com
2 Jill XYZ 1 Job Street abc.com
2 Jill XYZ 1 Job Street xyz.com
現(xiàn)在我們的表格可以說已經(jīng)處在第一級正規(guī)化的形式了,它已經(jīng)解決了url字段的限制問題,不過這樣的處理后又帶來了一個新的問題。每次在user表中插入一條記錄的時候,我們都必須重復(fù)所有的公司和用戶數(shù)據(jù)。這樣不僅令數(shù)據(jù)庫比以前大了,而且很容易出錯。因此還要經(jīng)過第二級正規(guī)化處理。
第二級正規(guī)化形式
1.為應(yīng)用在多條記錄的字段建立獨(dú)立的表格
2.通過一個foreign key來關(guān)聯(lián)這些表格的值
我們將url的值放在一個獨(dú)立的表格中,這樣我們就可以在以后加入更多的數(shù)據(jù),而無需擔(dān)心產(chǎn)生重復(fù)的值。我們還通過主鍵值來關(guān)聯(lián)這些字段:
users
userId name company company_address
1 Joe ABC 1 Work Lane
2 Jill XYZ 1 Job Street
urls
urlId relUserId url
1 1 abc.com
2 1 xyz.com
3 2 abc.com
4 2 xyz.com
簡單說來,正規(guī)化就是在表格設(shè)計時,消除冗余性和不協(xié)調(diào)的從屬關(guān)系。在本文中,我將通過五個漸進(jìn)的過程來告訴你在設(shè)計中應(yīng)該了解的正規(guī)化技巧。從而建立一個可行而且效率高的數(shù)據(jù)庫。本文也會詳細(xì)分析一下可以利用的關(guān)系類型。
這里假定我們要建立一個用戶信息的表格,其中要存儲用戶的名字、公司、公司地址和一些個人的收藏夾或url。在開始時,你可能定義一個如下的表格結(jié)構(gòu):
零狀態(tài)形式
users
name company company_address url1 url2
Joe ABC 1 Work Lane abc.com xyz.com
Jill XYZ 1 Job Street abc.com xyz.com
由于沒有進(jìn)行任何的正規(guī)化處理,我們將這種形式的表稱為零狀態(tài)形式的表。留意其中的url1和url2字段---如果我們在應(yīng)用中需要第三個url呢?這樣你就要在表格中多加一列,很明顯,這不是一個好辦法。如果你要創(chuàng)建一個富有擴(kuò)展性的系統(tǒng),你就要考慮使用第一個正規(guī)化的形式,并且應(yīng)用到該表格中。
第一級正規(guī)化形式
1.消除每個表格中重復(fù)的組
2.為每套相關(guān)的數(shù)據(jù)建立一個獨(dú)立的表格
3.使用一個主鍵來標(biāo)識每套相關(guān)的數(shù)據(jù)
以上的表格明顯違反了上面第一條的規(guī)定,那么第三條的主鍵又是什么意思呢?很簡單,它只是在每個記錄中加入一個的、自動增加的整型值。通過這個值,就可以將兩個姓名一樣的記錄區(qū)分開來。通過應(yīng)用第一級正規(guī)化形式,我們得到了以下的表格:
users
userId name company company_address url
1 Joe ABC 1 Work Lane abc.com
1 Joe ABC 1 Work Lane xyz.com
2 Jill XYZ 1 Job Street abc.com
2 Jill XYZ 1 Job Street xyz.com
現(xiàn)在我們的表格可以說已經(jīng)處在第一級正規(guī)化的形式了,它已經(jīng)解決了url字段的限制問題,不過這樣的處理后又帶來了一個新的問題。每次在user表中插入一條記錄的時候,我們都必須重復(fù)所有的公司和用戶數(shù)據(jù)。這樣不僅令數(shù)據(jù)庫比以前大了,而且很容易出錯。因此還要經(jīng)過第二級正規(guī)化處理。
第二級正規(guī)化形式
1.為應(yīng)用在多條記錄的字段建立獨(dú)立的表格
2.通過一個foreign key來關(guān)聯(lián)這些表格的值
我們將url的值放在一個獨(dú)立的表格中,這樣我們就可以在以后加入更多的數(shù)據(jù),而無需擔(dān)心產(chǎn)生重復(fù)的值。我們還通過主鍵值來關(guān)聯(lián)這些字段:
users
userId name company company_address
1 Joe ABC 1 Work Lane
2 Jill XYZ 1 Job Street
urls
urlId relUserId url
1 1 abc.com
2 1 xyz.com
3 2 abc.com
4 2 xyz.com