4.1 簡介

通過將數據庫表轉換為常規表,您現在可以分析它們之間的關係。兩個相關表之間交互的元素數稱為基數。基數可幫助您控制將數據分區到表中的效率。

從理論上講,所有實體之間都可以保持相互關係,但在實踐中,實體之間存在三種類型的關係:

  • 一對一
  • 一對多
  • 多對多

4.2 一對一溝通

如果對於實體 B 的每個實例只有一個實體 A 的實例,則稱它們具有一對一的關係(通常表示為“1:1”)。在 ER 圖上,這種關係由兩端各有一個小條的線表示:

1:1 關係通常表示,除非您有充分的理由將它們分開,否則最好將兩個表的數據合併為一個。

但是,在某些情況下,使用具有 1:1 關係的表是合理的。如果您的表包含可選數據的字段,例如描述,並且在很多情況下它們是空的,那麼將所有描述移動到一個單獨的表是有意義的,這將使您擺脫頻繁的空白並提高數據庫的效率.

然後,為了正確映射數據,您必須在每個表中至少包含一個相同的列(最好為此選擇一個主鍵)。

4.3 一對多關係

當一個表中的記錄與另一個表中的多個實體相關聯時,就會出現這種類型的關係。例如,同一個客戶可以下多個訂單,或者一個圖書館訪問者可以在一次訪問中藉到多本書。一對多關係(或簡稱 1:M)在圖表中使用魚尾紋表示法表示,如下例所示:

要在規劃數據庫時應用 1:M 關係,只需將“一”表的主鍵作為屬性添加到“多”表。如果主鍵在另一個表中,則稱為“外鍵”。“一”表被認為是父表,而“多”表被認為是子表。

4.4 多對多關係

當一個表中的多個實體可以連接到另一個表中的多個實體時,它們被認為具有多對多(或 M:M)關係。例如,學生和班級之間存在這種關係,因為每個學生可以參加幾個不同的班級,因此每個班級可以有很多學生。

在ER圖上,這種關係顯示如下:

不幸的是,不可能在數據庫中直接實現這樣的關係。因此,它必須拆分為兩個一對多關係。

為此,您需要在兩個表之間創建一個新實體。如果在銷售和產品之間建立了 M:M 關係,那麼新的實體可以稱為“已售出的產品”,因為它將代表每次銷售的內容。

“goods sold”和“sales”表以及“goods”表將按類型 1:M 鏈接。在不同的模型中,這種中間實體的名稱不同——“連接表”、“關聯實體”或“節點表”。

每個鏈接表記錄連接相鄰表的兩個不同實體(並且還可能包含附加信息)。例如,學生和班級之間的鏈接表可能如下所示:

4.5 強制與否?

鏈接分析的另一種方法是確定哪個連接的實體是另一個實體存在的先決條件。可選鏈接側在樹幹上用圓圈標記。

例如,為了讓一個國家在聯合國有自己的代表,它必須存在於世界地圖上,但相反的說法是錯誤的:

兩個實體可以相互依賴(也就是說,一個實體不能沒有另一個實體存在)。

遞歸鏈接

有時一個表可以引用它自己。例如,員工表可能有一個“經理”屬性,可以將我們引向同一張表中的另一名員工。這就是遞歸關係。

額外連接

如果鏈接被表達多次,則認為它們是多餘的。通常,可以刪除其中一個而不會丟失重要信息。例如,如果實體“students”不僅直接連接到實體“teachers”,還通過“classes”間接連接到實體“teachers”,那麼刪除實體“students”和“teachers”之間的關係是有意義的。這個決定是合理的,因為只能通過班級將學生分配給教師。

4.6 數據的引用完整性

更改主鍵和外鍵時,應注意數據的引用完整性等方面。它的主要思想是保持數據庫中存儲相同數據的兩個表的一致性。

數據完整性表示表之間正確建立的關係以及它們之間的正確鏈接。在什麼情況下會破壞數據完整性:

  • 刪除異常。從主表中刪除一行時發生。在這種情況下,從屬表中的外鍵繼續引用主表中已刪除的行。
  • 插入異常。在將行插入從屬表時發生。在這種情況下,從屬表中的外鍵與主表中任何行的主鍵都不匹配。
  • 更新異常。出現這種異常情況,一張表的幾行可能包含屬於同一個對象的數據。如果更改一行中的數據,它們可能會與另一行中的數據發生衝突。

刪除異常

要解決刪除異常,應將外鍵設置為兩個約束之一:

如果從屬表中的一行必然需要主表中的一行,則外鍵設置為級聯刪除。也就是說,當從主表中刪除一行時,相關聯的行也會從從屬表中刪除。

如果從屬表中的一行不允許與主表中的行有任何關係(即,這種關係是可選的),則當從主表中刪除相關行時,外鍵將設置為 NULL。外鍵列必須可以為空。

插入異常

為解決添加到依賴數據表時的插入異常,代表外鍵的列必須可以為空。因此,如果要添加的對象與主表沒有關聯,則外鍵列將具有 NULL 值。

更新異常

為了解決更新異常問題,應用了規範化,這在前面已經討論過。