數(shù)據(jù)庫(kù)設(shè)計(jì)技巧(3)
發(fā)表時(shí)間:2023-08-17 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]作者:allsky 在定義第四個(gè)正規(guī)化的形式前,我想首先提一下三種基本的數(shù)據(jù)關(guān)系:一對(duì)一,一對(duì)多和多對(duì)多。我們回頭看一下經(jīng)過(guò)第一個(gè)正規(guī)化的users表。要是我們將url的字段放在一個(gè)獨(dú)立的...
作者:allsky
在定義第四個(gè)正規(guī)化的形式前,我想首先提一下三種基本的數(shù)據(jù)關(guān)系:一對(duì)一,一對(duì)多和多對(duì)多。我們回頭看一下經(jīng)
過(guò)第一個(gè)正規(guī)化的users表。要是我們將url的字段放在一個(gè)獨(dú)立的表中,每次在users表中插入一個(gè)記錄,我們就會(huì)在urls
表中插入一行。我們將得到一個(gè)一對(duì)一的關(guān)系:用戶表中的每一行,都將在urls表中找到相應(yīng)的一行。對(duì)于我們的應(yīng)用來(lái)
說(shuō),這既不實(shí)用也不標(biāo)準(zhǔn)。
然后看看第二個(gè)正規(guī)化的例子。對(duì)于每個(gè)用戶記錄,我們的表格允許有多個(gè)urls的記錄與之關(guān)聯(lián)。這是一個(gè)一對(duì)多的
關(guān)系,這是一個(gè)很常見(jiàn)的關(guān)系。
對(duì)于多對(duì)多的關(guān)系來(lái)說(shuō),就有點(diǎn)復(fù)雜了。在我們的第三個(gè)正規(guī)化形式的例子中,我們的一個(gè)用戶與很多的url有關(guān),而
我們想將該結(jié)構(gòu)變?yōu)樵试S多個(gè)用戶與多個(gè)的urls有關(guān),這樣我們就可以得到一個(gè)多對(duì)多的結(jié)構(gòu)。在討論前,我們先看看表
格結(jié)構(gòu)會(huì)有些什么變化
users
userId name relCompId
1 Joe 1
2 Jill 2
companies
compId company company_address
1 ABC 1 Work Lane
2 XYZ 1 Job Street
urls
urlId url
1 abc.com
2 xyz.com
url_relations
relationId relatedUrlId relatedUserId
1 1 1
2 1 2
3 2 1
4 2 2
為了進(jìn)一步減低數(shù)據(jù)的冗余,我們運(yùn)用第四級(jí)正規(guī)化形式。我們創(chuàng)建了一個(gè)頗奇怪的url_relations表,里面的字段均
為主鍵或者foreign key。通過(guò)這個(gè)表,我們就可以消除urls表中的重復(fù)項(xiàng)目。以下是第四個(gè)正規(guī)化形式的具體要求:
第四個(gè)正規(guī)化形式
1.在一個(gè)多對(duì)多的關(guān)系中,獨(dú)立的實(shí)體不能存放在同一個(gè)表格中
由于它僅應(yīng)用于多對(duì)多的關(guān)系,因此大多數(shù)的開(kāi)發(fā)者可以忽略這條規(guī)定。不過(guò)在某些情況下,它是非常實(shí)用的,這個(gè)
例子就是這樣,我們通過(guò)將相同的實(shí)體分離出來(lái),并且將關(guān)系移到它們自己的表格中,從而改進(jìn)了urls表格。
為了令你更容易明白,我們舉個(gè)具體的例子,以下將用一個(gè)SQL語(yǔ)句選擇出所有屬于joe的urls:
SELECT name, url FROM users, urls, url_relationsswheresurl_relations.relatedUserId = 1 AND
users.userId = 1 AND urls.urlId = url_relations.relatedUrlId
如果我們想要遍歷每個(gè)人的個(gè)人信息和url信息,我們可以這樣做:
SELECT name, url FROM users, urls, url_relationsswheresusers.userId = url_relations.relatedUserId AND
urls.urlId = url_relations.relatedUrlId
第五級(jí)正規(guī)化形式
還有一級(jí)正規(guī)化的形式,它并不常見(jiàn),有點(diǎn)深?yuàn)W,并且在大部分的情況下都是不必要的。它的原則是:
1.原來(lái)的表格必須可以通過(guò)由它分離出去的表格重新構(gòu)建
使用這個(gè)規(guī)定的好處是,你可以確保不會(huì)在分離的表格中引入多余的列,所有你創(chuàng)建的表格結(jié)構(gòu)都與它們的實(shí)際需要
一樣大。應(yīng)用這條規(guī)定是一個(gè)好習(xí)慣,不過(guò)除非你要處理一個(gè)非常大型的數(shù)據(jù),否則你將不需要用到它。
希望這篇文章對(duì)你有用,并且可以幫助你在所有的項(xiàng)目中應(yīng)用這些正規(guī)化的規(guī)定。你可能想知道這些方法是從哪來(lái)
的,我可以告訴你,前面三個(gè)正規(guī)化的規(guī)定是1972年,Dr. E.F. Codd在他的論文“進(jìn)一步正規(guī)化數(shù)據(jù)庫(kù)的關(guān)系模型中”提
出的,其余的規(guī)定是經(jīng)過(guò)后來(lái)的集合理論和關(guān)系數(shù)學(xué)家理論化的。評(píng)論:正所謂物級(jí)必反,將表格分得過(guò)細(xì)有時(shí)并不好,
因?yàn)檫@樣需要將各表進(jìn)行各種的關(guān)聯(lián),這會(huì)令查詢時(shí)變得復(fù)雜,而且效率也可能降低,這些正規(guī)化的規(guī)定可以參考,在實(shí)
際應(yīng)用時(shí),要根據(jù)項(xiàng)目的大小,必要時(shí)可以進(jìn)行一些測(cè)試,以設(shè)計(jì)出更合理的表格結(jié)構(gòu)。