再提數(shù)據(jù)庫(kù)正規(guī)化之?dāng)?shù)據(jù)庫(kù)的五大范式

字號(hào):

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