我有兩個表格:「Person」和「Details」。人應該與Details具有一對一的關係。我有兩個選擇:SQL數據庫中的一對一關係
- 在詳細信息表中寫入DetailsId並將其設置爲Details.Id(PK);
- 將Person.Id的Details.PersonId同時作爲PK和FK;
在這兩種情況下,關係都是一對一的關係。你能解釋哪一個更好,在什麼情況下?
編輯:
我使用實體框架,並希望得到詳細信息如下:Person.Detail,不Person.Details.First()
我有兩個表格:「Person」和「Details」。人應該與Details具有一對一的關係。我有兩個選擇:SQL數據庫中的一對一關係
在這兩種情況下,關係都是一對一的關係。你能解釋哪一個更好,在什麼情況下?
編輯:
我使用實體框架,並希望得到詳細信息如下:Person.Detail,不Person.Details.First()
讓兩個表「人」和「詳細信息」 。 在「Details」表格中,取一個字段「person_id」作爲你的FK,它將引用「Person」表的id字段(PK)。 這是更好的解決方案。 因爲「Details」表比「Person」表需要更新等更多操作。因此,使「人」表作爲主人&「詳細信息」作爲奴隸。
請參閱編輯請 – karaxuna
對於真正的1:1關係,您的默認解決方案應該是將表合併到一起,除非有specific reasons針對它。
但我懷疑你實際上是在談論1:0..1,在這種情況下(2)將模擬你需要的東西。
我不明白(1) - 自引用FK的目的是什麼?你是否確實是指FK in Person引用Details?
是否有專門的「人」的子類?在這種情況下,您可能希望有兩個以上的表,每個子類都有不同的子類表。在SO中查看標籤「[Class Table Inheritance]」。您還應該查看標籤「[Shared-Primary-Key]」。它比爲子類表提供單獨的FK和PK更好。
您還需要考慮選擇單個表格解決方案的好處和成本。
忘記第三種情況:在Details表中寫PersonId並將其設爲FK給Person.Id(PK);) – danihp
@danihp這將是一對多的關係。一個人可能有許多詳細信息在您的案例中 – karaxuna
...並將UNIQUE constrait設置爲PersonId字段。 – danihp