表關系(一對一,一對多,多對多)
可以在數據庫圖表中的表之間創建關系,以顯示一個表中的列與另一個表中的列是如何相鏈接的。
在一個關系型數據庫中,利用關系可以避免多余的數據。例如,如果設計一個可以跟蹤圖書信息的數據庫,您需要創建一個名為 titles
的表,它用來存儲有關每本書的信息,例如書名、出版日期和出版社。您也可能保存有關出版社的信息,諸如出版社的電話、地址和郵政編碼。如果您打算在 titles
表中保存所有這些信息,那麽對於某出版社出版的每本書都會重復該出版社的電話號碼。
更好的方法是將有關出版社的信息在單獨的表,publishers
,中只保存一次。然後可以在 titles
表中放置一個引用出版社表中某項的指針。
為了確保您的數據同步,可以實施 titles
publishers
之間的參照完整性。參照完整性關系可以幫助確保一個表中的信息與另一個表中的信息相匹配。例如,titles
表中的每個書名必須與 publishers
表中的一個特定出版社相關。如果在數據庫中沒有一個出版社的信息,那麽該出版社的書名也不能添加到這個數據庫中。
為了更好地理解表關系,請參閱:
- 定義表關系
- 實施參照完整性
定義表關系
關系的確立需要通過匹配鍵列中的數據(通常是兩表中同名的列)。在大多數情況下,該關系會將一個表中的主鍵(它為每行提供了唯一標識)與另一個表的外部鍵中的某項相匹配。例如,通過創建 titles
表中的 title_id
(主鍵)與 sales
title_id
列(外部鍵)之間的關系,則銷售額就與售出的特定書名相關聯了。
表之間有三種關系。所創建關系的類型取決於相關列是如何定義的。
- 一對多關系
- 多對多關系
- 一對一關系
一對多關系
一對多關系是最普通的一種關系。在這種關系中,A 表中的一行可以匹配 B 表中的多行,但是 B 表中的一行只能匹配 A 表中的一行。例如,publishers
和 titles
表之間具有一對多關系:每個出版社出版很多書,但是每本書名只能出自一個出版社。
只有當一個相關列是一個主鍵或具有唯一約束時,才能創建一對多關系。
多對多關系
在多對多關系中,A 表中的一行可以匹配 B 表中的多行,反之亦然。要創建這種關系,需要定義第三個表,稱為結合表,它的主鍵由 A 表和 B 表的外部鍵組成。例如,authors
titles
表具有多對多關系,這是由於這些表都與 titleauthors
表具有一對多關系。titleauthors
表的主鍵是 au_id
列(authors
表的主鍵)和 title_id
列(titles
表的主鍵)的組合。
一對一關系
在一對一關系中,A 表中的一行最多只能匹配於 B 表中的一行,反之亦然。如果相關列都是主鍵或都具有唯一約束,則可以創建一對一關系。
這種關系並不常見,因為一般來說,按照這種方式相關的信息都在一個表中。可以利用一對一關系來:
- 分割具有多列的表。
- 由於安全原因而隔離表的一部分。
- 保存臨時的數據,並且可以毫不費力地通過刪除該表而刪除這些數據。
- 保存只適用於主表的子集的信息。
實施參照完整性
參照完整性是一個規則系統,能確保相關表行之間關系的有效性,並且確保不會在無意之中刪除或更改相關數據。
當實施參照完整性時,必須遵守以下規則:
- 如果在相關表的主鍵中沒有某個值,則不能在相關表的外部鍵列中輸入該值。但是,可以在外部鍵列中輸入一個 null 值。例如,不能將一項工作分配給一位沒有包含在
employee
表中的雇員,但是可以在employee
表的job_id
列中輸入一個 null 值,表明一位雇員沒有分配工作。 - 如果某行在相關表中存在相匹配的行,則不能從一個主鍵表中刪除該行。例如,如果在
employee
表中表明某些雇員分配了某項工作,則不能在jobs
表中刪除該工作所對應的行。 - 如果主鍵表的行具有相關行,則不能更改主鍵表中的某個鍵的值。例如,如果一位雇員分配了
jobs
表中的某項工作,則不能從employee
表中刪除該雇員。
當符合下列所有條件時,才可以設置參照完整性:
- 主表中的匹配列是一個主鍵或者具有唯一約束。
- 相關列具有相同的數據類型和大小。
- 兩個表屬於相同的數據庫。
表關系(一對一,一對多,多對多)