PHP是一種廣泛應(yīng)用于Web開(kāi)發(fā)領(lǐng)域的編程語(yǔ)言,同時(shí)也是MySQL等數(shù)據(jù)庫(kù)管理系統(tǒng)的主要支持編程語(yǔ)言之一。數(shù)據(jù)庫(kù)的設(shè)計(jì)與規(guī)范一直是關(guān)注的重點(diǎn),要想保證數(shù)據(jù)的一致性、準(zhǔn)確性和完整性,需要使用數(shù)據(jù)庫(kù)設(shè)計(jì)中的三大范式,即第一范式、第二范式和第三范式。PHP也可以很好地支持這些范式,下面就來(lái)介紹一下PHP的三大范式。
第一范式一般是指數(shù)據(jù)表中的每個(gè)字段都是原子的,不可分割的。這個(gè)范式可以避免數(shù)據(jù)的重復(fù)、不一致和歧義。對(duì)于PHP來(lái)說(shuō),我們只需要保證每個(gè)表的列不再重復(fù)出現(xiàn)相同的數(shù)據(jù)即可。
以一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明,我們有一個(gè)名為“Users”的用戶表,里面有用戶編碼、用戶姓名、生日和性別等字段。若是最初的設(shè)計(jì)中,我們將用戶的編碼和姓名先后放在一起,如0110Alex,我們需要將其拆分成兩個(gè)字段,即用戶編碼和用戶姓名兩個(gè)字段,并以用戶編碼作為主鍵。
第二范式則是指要求在滿足第一范式的情況下,數(shù)據(jù)表中的所有非主鍵字段都與主鍵相關(guān)。也就是說(shuō),如果某個(gè)表的主鍵是由多列組成的,那么在每一個(gè)非主鍵字段都要與這個(gè)主鍵相關(guān),才滿足第二范式。
我們?nèi)匀灰杂脩舯頌槔僭O(shè)現(xiàn)在我們?cè)O(shè)計(jì)成了以下這樣的表結(jié)構(gòu):Users(userid, username, department, dept_info),其中,userid+username為主鍵,department為部門名稱,dept_info為部門說(shuō)明。通過(guò)這個(gè)設(shè)計(jì),我們發(fā)現(xiàn),部門信息是沒(méi)有被正確“分解”的。根據(jù)第二范式,我們需要將部門字段拆分至不同表,即重新設(shè)計(jì)成兩張表,一張用戶表,一張部門表,兩個(gè)表之間建立關(guān)聯(lián)。
第三范式則是指保證在滿足第二范式的情況下,數(shù)據(jù)表中不存在非主鍵字段對(duì)主鍵字段的傳遞函數(shù)依賴。換言之,如果非主鍵字段A依賴于非主鍵字段B,而B又依賴于主鍵字段C,那么A既依賴于主鍵C,相當(dāng)于函數(shù)依賴了主鍵;同上述過(guò)程,A就不能作為主鍵的一部分了。
仍然以部門表為例,我們?cè)O(shè)計(jì)的非三范式的表可能如下:
Departments(deptid,dept_name,dept_tel,manager)
其中,deptid是主鍵。但是,這個(gè)設(shè)計(jì)出了問(wèn)題。假設(shè)一個(gè)管理者是經(jīng)銷商,編號(hào)為1001,電話為133xxxxxxxx,則我們的dept_tel就不再與主鍵相關(guān)了。我們很難再建立需要以dept_tel為條件的查詢操作。此時(shí)我們需要將manager(即不滿足主鍵依賴)獨(dú)立出來(lái),建立一個(gè)新表,即將Departments重新設(shè)計(jì)成如下兩張表:
Departments(deptid,dept_name,dept_tel)
Managers(deptid,manager)
使用上述三范式能夠保證數(shù)據(jù)的一致性和完整性,同時(shí)也便于數(shù)據(jù)的維護(hù)和管理。對(duì)于PHP來(lái)說(shuō),通過(guò)如上方法可以很輕松地實(shí)現(xiàn)數(shù)據(jù)的三范式設(shè)計(jì)。
第一范式一般是指數(shù)據(jù)表中的每個(gè)字段都是原子的,不可分割的。這個(gè)范式可以避免數(shù)據(jù)的重復(fù)、不一致和歧義。對(duì)于PHP來(lái)說(shuō),我們只需要保證每個(gè)表的列不再重復(fù)出現(xiàn)相同的數(shù)據(jù)即可。
以一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明,我們有一個(gè)名為“Users”的用戶表,里面有用戶編碼、用戶姓名、生日和性別等字段。若是最初的設(shè)計(jì)中,我們將用戶的編碼和姓名先后放在一起,如0110Alex,我們需要將其拆分成兩個(gè)字段,即用戶編碼和用戶姓名兩個(gè)字段,并以用戶編碼作為主鍵。
第二范式則是指要求在滿足第一范式的情況下,數(shù)據(jù)表中的所有非主鍵字段都與主鍵相關(guān)。也就是說(shuō),如果某個(gè)表的主鍵是由多列組成的,那么在每一個(gè)非主鍵字段都要與這個(gè)主鍵相關(guān),才滿足第二范式。
我們?nèi)匀灰杂脩舯頌槔僭O(shè)現(xiàn)在我們?cè)O(shè)計(jì)成了以下這樣的表結(jié)構(gòu):Users(userid, username, department, dept_info),其中,userid+username為主鍵,department為部門名稱,dept_info為部門說(shuō)明。通過(guò)這個(gè)設(shè)計(jì),我們發(fā)現(xiàn),部門信息是沒(méi)有被正確“分解”的。根據(jù)第二范式,我們需要將部門字段拆分至不同表,即重新設(shè)計(jì)成兩張表,一張用戶表,一張部門表,兩個(gè)表之間建立關(guān)聯(lián)。
第三范式則是指保證在滿足第二范式的情況下,數(shù)據(jù)表中不存在非主鍵字段對(duì)主鍵字段的傳遞函數(shù)依賴。換言之,如果非主鍵字段A依賴于非主鍵字段B,而B又依賴于主鍵字段C,那么A既依賴于主鍵C,相當(dāng)于函數(shù)依賴了主鍵;同上述過(guò)程,A就不能作為主鍵的一部分了。
仍然以部門表為例,我們?cè)O(shè)計(jì)的非三范式的表可能如下:
Departments(deptid,dept_name,dept_tel,manager)
其中,deptid是主鍵。但是,這個(gè)設(shè)計(jì)出了問(wèn)題。假設(shè)一個(gè)管理者是經(jīng)銷商,編號(hào)為1001,電話為133xxxxxxxx,則我們的dept_tel就不再與主鍵相關(guān)了。我們很難再建立需要以dept_tel為條件的查詢操作。此時(shí)我們需要將manager(即不滿足主鍵依賴)獨(dú)立出來(lái),建立一個(gè)新表,即將Departments重新設(shè)計(jì)成如下兩張表:
Departments(deptid,dept_name,dept_tel)
Managers(deptid,manager)
使用上述三范式能夠保證數(shù)據(jù)的一致性和完整性,同時(shí)也便于數(shù)據(jù)的維護(hù)和管理。對(duì)于PHP來(lái)說(shuō),通過(guò)如上方法可以很輕松地實(shí)現(xiàn)數(shù)據(jù)的三范式設(shè)計(jì)。