2011-01-20 76 views
11

這可能是一個基本(愚蠢)問題,但是當在數據庫中具有一對一關係時,另一個表具有外鍵ID(在這個例子中)。在一對多關係中,表格包含許多外鍵。數據庫中的一對一和一對多關係之間的差異

但是數據庫並不知道這是一對一還是一對多的關係對吧?我在ER-Diagram中創建的關係只是表明在製作實際表時它應該是外鍵的位置?

儘管我已經閱讀了很多關於這方面的教程,但我並沒有完全理解關係的概念。

在此先感謝。

回答

13

從某種意義上說,我們所談論的所有關係都不是已知的到數據庫中,它們是我們發明的構造以更好地理解如何設計表。

在一對一和一對多之間的表結構方面的巨大差異在於,在一對一中有可能(但不是必須)具有雙向關係,這意味着表A可以在表B中有一個外鍵,而表B可以在表A中的關聯記錄中有一個外鍵。這對於一對多關係是不可能的。

一對一關係將一個表中的一條記錄與另一個表中的單條記錄相關聯。一對多關係將一個表中的一條記錄與另一個表中的許多記錄關聯起來。

3

我很難理解實際問題是什麼。

你的分析大部分是正確的,因爲如果你有2個表,並且table2有一個到表1的外鍵,它可以是一對一或多對一的。

您的句子「在一對多關係中,表中包含許多外鍵」。

'很多'一方的表仍然包含一列是外鍵,它只是多行可以具有相同的外鍵值(多行指向一個父鍵)。

另請注意,您可以將外鍵放在父表上,而不是其他方式。這樣,如果你想這樣做,你可以防止一對多。還請注意,這樣,多個家長可以共享一個孩子,這可能是也可能不是你想要的。

2

1:1與1:m的數據庫級別等效項在外鍵列上具有唯一索引。請注意,這隻適用於1:1,而不是1:0..1,因爲在評估唯一性時會考慮null。這種限制有解決方法,但這是基本的。

+0

確切地說,這是一個獨特的*約束條件*。索引是偶然的,因爲索引只是性能優化功能。在遵循SQL標準的DBMS(除SQL Server及其衍生詞之外的大多數DBMS)中,空值在唯一性約束中被忽略*唯一要求僅適用於在約束列中沒有空值的行。 – sqlvogel 2011-01-20 20:13:21

5

要啓用一對一關係,您需要爲外鍵添加唯一約束。每張表不可能有兩個外鍵,因爲它不可能創建記錄。

+0

這不是很好的設計,但如果它是真正的1:1(而不是1:0 ... 1),並且您創建了外鍵列可爲空的表格之一,那將是可能的。 – 2011-01-20 20:07:15

1

嗯,你是對的,這種關係對你很重要,但對db本身不重要。當你有兩張表,一張帶有你的基本信息,另一張帶有你的詳細信息......對於兩張表你都是你,所以它是一對一的關係,你不能將你的數據映射到其他人。

現在,添加第三個表格「城市」,並將其中一個信息點添加到您居住的城市 - 這是一對多(一個城市可以使用,應該用於很多人)的示例。

一對多/一對一隻顯示您的表如何交互。一直以來,您都希望在表格中「保存」行/列,而不是複製它們,您將使用與另一個表格的一對多關係。或多對多:)

0

讓我們假設你有一個具有兩個屬性A和B的表。如果A是候選鍵而B不是,那麼A和B之間的關係是1到多。如果A和B都是候選鍵,則關係爲1:1

0

所給出的表A和B,如果

  1. A和B具有嚴格的1對1的關係
  2. 對於每一個B實例總會有一個A實例

最好的辦法是讓B的主鍵也是引用A的外鍵。這也稱爲「Table per Type Inheritance」和「is a」關係。還有其他方法可以強制使用唯一的外鍵,但使用主鍵可以在架構和ER圖中清除關係。

當然總會有其他情況,如果您的設計不符合上述兩個標準,您將不得不使用另一種方法。

1

同樣的例子,一個產品只有一個產品代碼,所以它是一個一對一的關係(產品< - > ABC123),但客戶可以購買多個產品,所以它的一對一很多關係(人< - >>>產品)。

相關問題