資源描述:
《表之間關(guān)系(帶圖)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、數(shù)據(jù)庫(kù)表之間的關(guān)系特別說明數(shù)據(jù)庫(kù)的正規(guī)化是關(guān)系型數(shù)據(jù)庫(kù)理論的基礎(chǔ)。隨著數(shù)據(jù)庫(kù)的正規(guī)化工作的完成,數(shù)據(jù)庫(kù)中的各個(gè)數(shù)據(jù)表中的數(shù)據(jù)關(guān)系也就建立起來了。在設(shè)計(jì)關(guān)系型數(shù)據(jù)庫(kù)時(shí),最主要的一部分工作是將數(shù)據(jù)元素如何分配到各個(gè)關(guān)系數(shù)據(jù)表中。一旦完成了對(duì)這些數(shù)據(jù)元素的分類,對(duì)于數(shù)據(jù)的操作將依賴于這些數(shù)據(jù)表之間的關(guān)系,通過這些數(shù)據(jù)表之間的關(guān)系,就可以將這些數(shù)據(jù)通過某種有意義的方式聯(lián)系在一起。例如,如果你不知道哪個(gè)用戶下了訂單,那么單獨(dú)的訂單信息是沒有任何用處的。但是,你沒有必要在同一個(gè)數(shù)據(jù)表中同時(shí)存儲(chǔ)顧客和訂單信息。你可以在兩個(gè)關(guān)系數(shù)據(jù)表中分別存儲(chǔ)顧客信息和訂單信息,然后
2、使用兩個(gè)數(shù)據(jù)表之間的關(guān)系,可以同時(shí)查看數(shù)據(jù)表中每個(gè)訂單以及其相關(guān)的客戶信息。如果正規(guī)化的數(shù)據(jù)表是關(guān)系型數(shù)據(jù)庫(kù)的基礎(chǔ)的話,那么這些數(shù)據(jù)表之間的關(guān)系則是建立這些基礎(chǔ)的基石。出發(fā)點(diǎn)下面的數(shù)據(jù)將要用在本文的例子中,用他們來說明如何定義數(shù)據(jù)庫(kù)表之間的關(guān)系。通過Boyce-CoddNormalForm(BCNF)對(duì)數(shù)據(jù)進(jìn)行正規(guī)化后,產(chǎn)生了七個(gè)關(guān)系表:Books:{Title*,ISBN,Price}Authors:{FirstName*,LastName*}ZIPCodes:{ZIPCode*}Categories:{Category*,Description}P
3、ublishers:{Publisher*}States:{State*}Cities:{City*}現(xiàn)在所需要做的工作就是說明如何在這些表之間建立關(guān)系。關(guān)系類型在家中,你與其他的成員一起存在著許多關(guān)系。例如,你和你的母親是有關(guān)系的,你只有一位母親,但是你母親可能會(huì)有好幾個(gè)孩子。你和你的兄弟姐妹是有關(guān)系的——你可能有很多兄弟和姐妹,同樣,他們也有很多兄弟和姐妹。如果你已經(jīng)結(jié)婚了,你和你的配偶都有一個(gè)配偶——這是相互的——但是一次只能有一個(gè)。在數(shù)據(jù)表這一級(jí),數(shù)據(jù)庫(kù)關(guān)系和上面所描述現(xiàn)象中的聯(lián)系非常相似。有三種不同類型的關(guān)系:一對(duì)一:在這種關(guān)系中,關(guān)系表的每
4、一邊都只能存在一個(gè)記錄。每個(gè)數(shù)據(jù)表中的關(guān)鍵字在對(duì)應(yīng)的關(guān)系表中只能存在一個(gè)記錄或者沒有對(duì)應(yīng)的記錄。這種關(guān)系和一對(duì)配偶之間的關(guān)系非常相似——要么你已經(jīng)結(jié)婚,你和你的配偶只能有一個(gè)配偶,要么你沒有結(jié)婚沒有配偶。大多數(shù)的一對(duì)一的關(guān)系都是某種商業(yè)規(guī)則約束的結(jié)果,而不是按照數(shù)據(jù)的自然屬性來得到的。如果沒有這些規(guī)則的約束,你通常可以把兩個(gè)數(shù)據(jù)表合并進(jìn)一個(gè)數(shù)據(jù)表,而且不會(huì)打破任何規(guī)范化的規(guī)則。一對(duì)多:主鍵數(shù)據(jù)表中只能含有一個(gè)記錄,而在其關(guān)系表中這條記錄可以與一個(gè)或者多個(gè)記錄相關(guān),也可以沒有記錄與之相關(guān)。這種關(guān)系類似于你和你的父母之間的關(guān)系。你只有一位母親,但是你母親可
5、以有幾個(gè)孩子。多對(duì)多:兩個(gè)數(shù)據(jù)表里的每條記錄都可以和另一個(gè)數(shù)據(jù)表里任意數(shù)量的記錄(或者沒有記錄)相關(guān)。例如,如果你有多個(gè)兄弟姐妹,這對(duì)你的兄弟姐妹也是一樣(有多個(gè)兄弟姐妹),多對(duì)多這種關(guān)系需要引入第三個(gè)數(shù)據(jù)表,這種數(shù)據(jù)表稱為聯(lián)系表或者連接表,因?yàn)殛P(guān)系型系統(tǒng)不能直接實(shí)現(xiàn)這種關(guān)系。建立關(guān)系在開始著手考慮建立關(guān)系表之間的關(guān)系之前,你可能需要對(duì)數(shù)據(jù)非常熟悉。只有在熟悉數(shù)據(jù)之后,關(guān)聯(lián)會(huì)比你剛開始的時(shí)候更明顯。你的數(shù)據(jù)庫(kù)系統(tǒng)依賴于在兩個(gè)數(shù)據(jù)表中找到的匹配值來建立關(guān)系。如果在數(shù)據(jù)庫(kù)系統(tǒng)中發(fā)現(xiàn)了一個(gè)匹配值,系統(tǒng)將從兩個(gè)數(shù)據(jù)表中提取數(shù)據(jù)并創(chuàng)建一個(gè)虛擬的記錄。例如,你可能
6、想要查看某個(gè)特定的作者所寫的全部書籍,在本文中,系統(tǒng)將從“Books”和“Authors”這兩個(gè)數(shù)據(jù)表中查找相關(guān)的匹配值。需要注意的是,在大多數(shù)情況下,查詢的結(jié)果是動(dòng)態(tài)的,這意味著對(duì)這條虛擬記錄所做的任何改動(dòng)都將可能作用到底層的數(shù)據(jù)表上,這一點(diǎn)是非常重要的。進(jìn)行匹配的值都是主鍵和外鍵的值。(關(guān)系模型不要求一個(gè)關(guān)系必須對(duì)應(yīng)的使用一個(gè)主鍵來確定。你可以使用數(shù)據(jù)表中的任何備選關(guān)鍵字來建立關(guān)系,但是使用主鍵是大家都已經(jīng)接受的標(biāo)準(zhǔn)。)主鍵(primarykey)唯一的識(shí)別表中的每個(gè)記錄。而外鍵(foreignkey)只是簡(jiǎn)單的將一個(gè)數(shù)據(jù)表中的主鍵存放在另外一個(gè)數(shù)
7、據(jù)表中。同樣地,對(duì)于你來說也不需要做太多的工作——只是簡(jiǎn)單地將主鍵加到關(guān)系表中,并將其定義為外鍵。唯一需要注意的是,外鍵字段的數(shù)據(jù)類型必須和主鍵的數(shù)據(jù)類型相同。但是有些系統(tǒng)可以允許這條規(guī)則有一個(gè)例外,它允許在數(shù)字和自動(dòng)編號(hào)(autonumbering)字段(例如在SQL服務(wù)器系統(tǒng)中訪問Identity和AutoNumber)之間建立關(guān)系。此外,外鍵的值可以是空(Null),盡管強(qiáng)烈建議在沒有特別原因的情況下,不要讓外鍵為空。你有可能永遠(yuǎn)都不會(huì)有機(jī)會(huì)來使用需要這項(xiàng)功能的數(shù)據(jù)庫(kù)?,F(xiàn)在回到我們的示例關(guān)系表,并開始輸入合適的外鍵。(請(qǐng)繼續(xù)在紙上打草稿——在你的
8、數(shù)據(jù)庫(kù)系統(tǒng)中創(chuàng)建真正的數(shù)據(jù)表還為時(shí)過早。要知道在紙上糾正錯(cuò)誤要容易得多。)要記住,你正在把主鍵