2014-10-11 57 views
1

您認爲哪種方法是定義1:1關係(如配偶)的最佳方式?在數據庫中表示1:1關係的最佳方式是什麼

在我的實際數據庫中,我有一張人們的桌子,其中一些人將被分類爲與桌子上的其他人「共同」(因此該人將因此與原始人聯合)。 '聯合'將用於確定每個人的付款。

我能有這樣的事情

PERSON 
------ 
Person_ID (PK) 
Name 
Phone 
Joint_With_ID (FK) 

其中Joint_With_ID要麼是空或包含它們的聯合與記錄的PERSON_ID(和這個人的記錄中包含的第一人的PERSON_ID),但我我不喜歡故意的空值。

我也可以有兩個表

PERSON     PERSON_JOIN 
------     ----------- 
Person_ID (PK)   Joined_ID  (PK) 
Name      Person_ID 
Phone      Joined_With_Person_ID 

,並在PERSON_JOIN兩個記錄的每對夫婦是共同 即

Person_ID Joined_With_Person_ID 
    5    8 
    8    5 

兩種情況提高PERSON1的可能性被記錄爲聯合person2,但沒有與person1聯合的person2的記錄。

我甚至可以在每個加入的PERSON_JOIN中只有一條記錄,並且在嘗試查看某個人是聯合和誰時使用SQL來搜索這兩個字段。但那太可怕了!

那麼......最好的方法是什麼?

+0

*「並在PERSON_JOIN兩個記錄的每對夫婦是聯合」 *所以沒有區別在元組{5,8}和{8,5}之間的信息中?我問,因爲你在談論付款,在一些應用程序中,這兩個元組意味着兩件不同的事情。 – 2014-10-11 16:53:08

+0

是的,我更喜歡那種方法,但是你說的話是正確的,也讓我擔心 - 因此我的問題。應用程序需要知道某人是否與其他人一起決定是否支付聯合費用或個人費用。如果他們是聯合的,那麼加入雙方將支付聯合費用。但是,正如你所說,其中一個元組是冗餘的,只要用於查看一個人是否加入的sql可以考慮這兩個字段。我寧願以某種方式將其構建到架構中。 – user3209752 2014-10-11 17:45:36

+0

我沒有說其中一個元組是冗餘的。我說過,在一些應用中,這兩個元組意味着不同的東西。 – 2014-10-11 17:58:43

回答

0

在我實際的數據庫我的人,其中有些人會 被歸類爲表中的其他人(而 人因此將聯合與原來的人)「聯合」的表。 '聯合'將用於確定每個人的[原文]支付。

通常的方法在一個SQL數據庫做,這是對ID號強加一個秩序,保證了檢查約束的順序。這假定元組{5,8}與元組{8,5}的意思相同,並假定一個人不能與自己一起加入。在這裏小心點。

如果我有「8嫁給5,5嫁給8」,我會認爲這些意思是同一件事。但「8是5的依賴」並不意味着「5是8的依賴」。

create table person_join (
    person_id integer not null references person (person_id), 
    joined_with_person_id integer not null references person (person_id), 
    primary key (person_id), 
    check (person_id < joined_with_person_id) 
); 

如果您需要加入多人,更改主鍵約束

primary key (person_id, joined_with_person_id), 

你可能需要額外的指標,因爲你或多或少需要獨立查詢兩列。

create index on person_join (joined_with_person_id); 

如果你需要知道的人「5」是否有任何加入的人,你可以

select * 
from person_join 
where person_id = 5 
    or joined_with_person_id = 5; 
+0

這似乎是最好的折衷辦法,人員表中沒有空值,只有一個記錄需要在連接表中。用戶界面將阻止自我加入,因爲用戶只能在創建聯合記錄時從所有「其他」人員中選擇某個人。 – user3209752 2014-10-11 18:38:46

0

配偶關係通常不是1:1 - 並非每個人都有配偶。它更像'0或1'到'0或1',忽略了一夫多妻制和一妻多夫的社會。有些但不是全部的人都有配偶,而有配偶的人一次最多隻有一個配偶。 (記錄誰是誰的配偶是另一個單獨的bag'o'worms。)

因此,您的PERSON_JOIN模式設計是兩個更好的。

+0

是的,那是我的想法也是。在這種情況下,不是真正的配偶,這個人要麼沒有聯合的人。如果他們這樣做,那麼這個人也有一個聯合的人(另一個人)。我擔心的是,SQL負責確保每個插入插入兩條記錄,每個刪除刪除兩條記錄,每個更新至少更新2條記錄,但最多可以記錄4條記錄(如果personA不再與personB聯合但與personC聯合 - 並且最終人格C已經與人B聯合在一起(並且可能不再與人物聯合)。這就是一個脆弱的SQL! – user3209752 2014-10-11 17:35:06

+0

如果你一次這樣做,那麼它不需要停在4條記錄:如果你有A = B,C = D,E = F,G = H之前,你做任何改變,然後,A = C,B = E,D = G,你仍然有新的任務讓F和H擔心。爲簡化起見,您需要分兩步進行重新分配;對所有受影響的參與方取消分配步驟(給定A = B和C = D之前,A = C之後,然後取消分配A,B,C和D,然後分配A和C),這就限制了損害,你確定這種關係總是互惠的嗎?對於配偶而言,對社交網站上的朋友來說,事實並非如此。在你理解你的數據。 – 2014-10-11 17:47:00

+0

互惠,是的。商業規則說,如果兩個人(只有兩個)是「合作伙伴」並居住在同一個地址,那麼他們是共同的。這個應用程序的用戶將決定他們是否聯合並且將創建'加入'記錄,也許當第二個人被插入到人員表中時,也許以後,當'加入'被定義爲已經發生時。 (我正在編輯我的評論,以考慮你突出顯示的事件鏈,但是網站不允許這樣做,我必須考慮推動你提出的sql,因爲人桌中的每個人都可能會交換! ) – user3209752 2014-10-11 17:57:18

相關問題