2011-04-24 48 views
3

我需要在php和MySQL中構建一個系列樹。我很驚訝缺乏開源的可定製的HTML家族樹構建軟件,但我離題了。我花了很多時間閱讀關於存儲MySQL圖和家族樹的信息。一切都對我有意義:有一個有節點(人)的桌子和一個有邊緣(關係)的桌子。MySQL商店關係(系列)樹

我唯一的問題是我不確定存儲不一定相鄰的關係的最佳方式,例如兄弟姐妹和祖父母關係。起初我並不認爲這會有什麼大不了的,因爲我可以不加區別地強制父母(每個人都有父母)來解決這些關係。

但是,我也需要能夠存儲可能沒有共同父母的關係,如浪漫的伴侶。我讀過的每一樣東西都表明了一種親子關係,但由於浪漫的伴侶不共享一個共同的父母(希望),我不知道如何將它存儲在邊緣表中。我應該使用不同的表格還是什麼?如果它在同一個表格中,我該如何表示?只要我用不熟悉的關係來做這件事,我也可以和家人一起做。

綜上所述,三個問題:

  • 如何代表橫向的關係?
  • 如果橫向關係有一個共同的父母,我該如何存儲它?這是否應該是family表中存儲其他橫向關係的標誌?
  • 如何將兒童的兩個或更多邊緣(祖父母)隔開,但直接父母不可用?

任何幫助表示讚賞,如果任何人有任何建議的一些JavaScript/HTML家譜樹建設軟件,那將是美好的。

回答

3

想法來自Geneapro schemaRootsMagic

person 
------ 
person_id 
name (etc) 

life_event_types 
---------------- 
life_event_type_id 
life_event_type_description (divorce, marriage, birth, death) 

life_events 
----------- 
life_event_id 
life_event_type_id 
life_event_description 
life_event_date 

life_event_roles 
---------------- 
life_event_role_id 
life_event_role (mother, father, child) 

person_event_role 
----------------- 
person_id - who 
life_event_id - what happened 
life_event_role_id - what this person did 

所以你可以有一個類型爲「birth」的生活事件,role_id告訴你誰是父母,誰是孩子。這可以擴展到婚姻,死亡,離婚,養父母,代理父母(你可能有3或4個父母的關係非常複雜)等。

至於儲存更遠的關係,你可以計算這些。例如,您可以通過獲取具有匹配event_id的「父親」角色的人來計算任何人的父親。然後你可以得到那個人的父親,並且你有原始人的祖父。無論有人未知,請創建未知數據的人員。

+0

這很有趣,有可能解決問題(如果需要,我會堅持使用佔位符不留空格的建議)。我唯一的問題是如何透明地確定關係的方向?現在看來,我必須每次檢查事件類型描述或角色,以判斷一個節點相對於另一個節點的位置。 – 2011-04-25 13:39:49

+0

@tandu我不確定'關係方向'是什麼意思?我認爲這歸結於你的程序邏輯,而不是SQL。你的數據庫僅僅存儲(例如)'Bob'的'出生'事件,'Geoff'是父親,'Alice'是母親,'Bob'是'寶貝'。在你的程序中,如果你想確定誰是鮑勃的父母,那麼你可以從person_event_role中選擇,其中life_event_id是鮑勃的出生地,而life_event_role_id可以是母親或父親。 – 2011-04-25 13:54:50

+0

這就是我所說的方向。例如,如果用戶是Bob,我需要找到Bob的兒子,父親和妻子在樹中的哪個位置。他的兒子是南方,他的父親是北方,他的妻子是西方或東方。不過,您似乎已經回答了:您正在說要根據人事活動角色來計算此方向。我不能在MySQL中透明地做到這一點,如果我不得不在PHP中檢查每個字符串並計算方向,但我想你是說這不是模式。 – 2011-04-25 14:23:06

1
person 
------- 
person_id 
other_stuff 

relation 
---------- 
person_id_1 
person_id_2 
relationship_type 
begin_dt 
end_dt 

只是填充你感興趣的任何值的關係類型。(FK一些選擇列表將是巨大的)

我把日期上一個有趣的subdiscussion /思想provokation。

+0

這就是我所傾向的,但我不確定它是否是100%最好的方法。這也不一定解決缺少父母的祖父母 - 子女關係問題。如果父母不存在,則不需要存儲這種關係,因爲祖父母與父母關係可以避免這種關係,除非您建議我同時存儲這兩種關係。 – 2011-04-24 23:44:43

+0

這個模型可以讓你存儲兩個 - 我不知道我推薦。你正在購買managin多餘關係的工作,就像結構非規範化時的問題一樣......要麼你或者應該嚴格限制基於這種關係類型的記錄。 – Randy 2011-04-24 23:47:10

+0

@tandu,生物學......一個孩子永遠不會沒有父母就生下來。即使在計算機科學的樹木裏,這也是一個不錯的選擇。開始和結束日期很好地解決了我認爲的問題。 – Johan 2011-04-24 23:50:46

0

GEDCOM data modelGramps data model是兩種用於在不同工具之間交換生物​​數據的最流行的格式。考慮到兩種數據模型都是專門爲處理生物數據而設計的,使用這些數據模型中的任何一種都應該(1)使您的工具與其他工具更加兼容並且(2)確保您的數據模型能夠適應許多特殊情況。

Oxy-GenGramps PHP exporter這樣的工具應該可以幫助您瞭解如何將GEDCOM數據導入數據庫。

有關更多詳細信息,另請參閱我對「Family Tree」 Data Structure的回答。