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