明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

數(shù)據(jù)庫(kù)設(shè)計(jì)技巧(3)

[摘要]作者: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)。