2015-03-19 38 views
3

讓我們考慮我們有人A。 Person F是他的父親,人M是他的母親,人B是他的兄弟和人S是他的兒子。 每個人可能有很多關係。這就是爲什麼,我們要創造新的關係的表像下:如何用1條記錄存儲家庭關係信息

+----+------+ 
| id | name | 
+----+------+ 
| 1 | A | 
| 2 | F | 
| 3 | M | 
| 4 | B | 
| 5 | S | 
+----+------+ 

關係型

+----+---------+ 
| id | value | 
+----+---------+ 
| 1 | Father | 
| 2 | Mother | 
| 3 | Brother | 
| 4 | Son  | 
| 5 | Wife | 
| 6 | Husband | 
+----+---------+ 

關係

+----+----------+------------+------+ 
| id | PersonID | RelativeID | Type | 
+----+----------+------------+------+ 
| 1 | 1  | 2   | 1 | 
| 2 | 1  | 3   | 2 | 
| 3 | 1  | 4   | 3 | 
| 4 | 1  | 5   | 4 | 
| 5 | 2  | 1   | 4 | 
| 6 | 2  | 3   | 5 | 
| 7 | 3  | 1   | 4 | 
| ......       | 
+----+----------+------------+------+ 

在這種情況下,第1行意味着2 is father of 1 (用於ID)和第五排意味着1 is son of 2。在現實世界中,這兩行是等價的,但如果我不插入這些行中的一行,則不能使用存在的行來丟失行。

現在的問題是: 如何使結構,其中包含1行中的這2個含義?

+0

有點offtopic(n ot回答你的問題),但我建議保留現有的設計。如果你開始使用PersonID和RelativeID'對稱',那麼你的所有查詢變得更復雜(或更慢)。同樣,當你需要三個或更多的相關人員時,你的數據可能會有一些未來的擴展(比如與許多參與者相關的事件) - 在目前的設計中,這不是問題。您可以使用觸發器同步雙記錄。 – Arvo 2015-03-19 07:57:00

+0

猜測'關係(id,personA,personB,AtoB_type,BtoA_type)'可以幫忙嗎? – amow 2015-03-19 08:24:10

回答

1

事實上親屬間2我們2的關係

Person A is person B`s wife <=> Person B is person A`s husband 
Person C is person D`s sister <=>Person D is person C`s brother (D is male) 
Etc... 

所以如果你爲你的第三個表(關係)都Reverse_Relation_Type列,那麼你的問題將得到解決,你將不會有冗餘數據所有,你將有:

+----+----------+------------+---------------+-----------------------+ 
| id | PersonID | RelativeID | Relation_Type | Reverse_Relation_Type | 
+----+----------+------------+---------------+-----------------------+ 
| 1 | 1  | 2   | 1    |4      | 
| 2 | 1  | 3   | 2    |4      | 
| 3 | 1  | 4   | 3    |3      | 
| 4 | 1  | 5   | 4    |6      | 
| 6 | 2  | 3   | 5    |1      | 
| ......                | 
+----+----------+------------+---------------+-----------------------+