2012-10-31 26 views
0

我有兩個表格:「Person」和「Details」。人應該與Details具有一對一的關係。我有兩個選擇:SQL數據庫中的一對一關係

  1. 在詳細信息表中寫入DetailsId並將其設置爲Details.Id(PK);
  2. 將Person.Id的Details.PersonId同時作爲PK和FK;

在這兩種情況下,關係都是一對一的關係。你能解釋哪一個更好,在什麼情況下?

編輯:

我使用實體框架,並希望得到詳細信息如下:Person.Detail,不Person.Details.First()

+1

忘記第三種情況:在Details表中寫PersonId並將其設爲FK給Person.Id(PK);) – danihp

+0

@danihp這將是一對多的關係。一個人可能有許多詳細信息在您的案例中 – karaxuna

+0

...並將UNIQUE constrait設置爲PersonId字段。 – danihp

回答

3

讓兩個表「人」和「詳細信息」 。 在「Details」表格中,取一個字段「person_id」作爲你的FK,它將引用「Person」表的id字段(PK)。 這是更好的解決方案。 因爲「Details」表比「Person」表需要更新等更多操作。因此,使「人」表作爲主人&「詳細信息」作爲奴隸。

+0

請參閱編輯請 – karaxuna

2

對於真正的1:1關係,您的默認解決方案應該是將表合併到一起,除非有specific reasons針對它。

但我懷疑你實際上是在談論1:0..1,在這種情況下(2)將模擬你需要的東西。

我不明白(1) - 自引用FK的目的是什麼?你是否確實是指FK in Person引用Details?

2

是否有專門的「人」的子類?在這種情況下,您可能希望有兩個以上的表,每個子類都有不同的子類表。在SO中查看標籤「[Class Table Inheritance]」。您還應該查看標籤「[Shared-Primary-Key]」。它比爲子類表提供單獨的FK和PK更好。

您還需要考慮選擇單個表格解決方案的好處和成本。