2012-12-23 306 views
1

我正在構建一個家譜+歷史[PHP]網站,以陪伴和展示我媽媽的家譜報告,她爲她父母的聖誕禮物放在一起。樹至少將基於一個MySQL數據庫('家族'),我目前正在使用兩個表:'人'和'婚姻'。我還有第三張「親子關係」表,但後來認爲這是不必要的。MySQL系列樹:層次結構,婚姻參考和顯示

中的表的結構如下:在

PERSONS 
- 'personID' [tinyint, pk] 
- 'firstName' 
- 'lastName' 
- 'sex' [set{'M','F'}] 
- 'birthDate' 
- 'fatherID' [internal rel = 'personID'] 
- 'motherID' [internal rel = 'personID'] 
- 'birthPlace' 
- 'deathDate' 
- 'deathPlace' 
- 'birthRecord' (filename) 

MARRIAGES 
- 'husbandID' [internal rel = 'persons.personID'] 
- 'wifeID' [internal rel = 'persons.personID'] 
- 'date' 
- 'place' 
- 'record' 

PK索引 '婚姻' 表包括兩個編號的cols的。 (*請原諒我使用性別歧視條款;它僅僅是爲了結構目的 - 以防萬一,我是MySQL的新手 - 而且我的家人也是非常右翼和保守的,但它確實沒有如果你願意的話,我不認爲是配偶1和配偶2,我個人根本不會對任何人產生同性戀和偏見。最終免責聲明。對所有人都是和平的。)

所以......你會明白我爲什麼要爲「婚姻」維護一張單獨的表格:每一對婚姻都有自己的數據必須包括在內,重複夫妻雙方記錄中的每次婚姻數據都是愚蠢的。我在'persons'表中有一個'spouseID'列,但是我需要手動匹配每個配偶的ID,並且無法弄清楚如何將該列鏈接到相應的婚姻專欄(在'婚姻'表),所以我放棄了。

如果有人能夠啓發我如何在'婚姻'中同時顯示個人姓名的配偶ID列,而不是顯示個人的姓名,也可能是盛大的。

但主要是我需要知道我怎樣才能連接兩個表(可能在'persons'表中包含一個'配偶'列,它與'婚姻'表集成在一起),其次是關於如何去顯示分層樹。

非常感謝。

P.S.這棵樹相當廣泛,大約有6代。有大約45人',我認爲16婚姻,無論這些信息可能是值得的...

+0

您的結構是關係良好的。我看到的唯一問題是,您無法輕鬆查詢婚姻狀況並找到某人的特定婚姻,而無需查詢husbandID和wifeID列。我個人會將這種關係轉移到相關的子女婚姻關係表上。你實際上與人有同樣的問題。無論如何,在你的查詢中,你只需要利用從婚姻到人際關係的每個關係的內部連接,並將所有人的列添加到行中。 – gview

+0

我不知道你的意思是「把這種關係轉移到一個相關的子女婚姻關係表」。我究竟該如何構建? (和'人'。)我試圖研究所有這些術語和技術,但最終我遇到的所有這些零星和稀疏相關的信息都不利於我,我需要與手頭任務相關的示例(並且我可以與我一起工作目前正在與之合作以便理解)。 – user163831

+0

我不明白你的意思是說我與'人'有什麼關係,這一點對我來說都不是很清楚...... – user163831

回答

1

簡單的SELECT-JOIN查詢在同一個表上兩次獲取所有的婚姻作爲一個列表。

SELECT m.*, 
     h.firstName as husbandFirstName, h.lastName as husbandLastName, 
     w.firstName as wifeFirstName, w.lastName as wifeLastName 
FROM marriages m 
LEFT JOIN persons h ON m.husbandID = h.personID 
LEFT JOIN persons w ON m.wifeID = w.personID; 

對於男性兒童的名單,你在傳遞這樣的父親ID:

SELECT p.firstName as fatherFirstName, p.lastName as fatherLastName, 
    c.firstName as childFirstName, c.lastName as childLastName 
LEFT JOIN persons c ON c.fatherID = p.personID 
WHERE p.personID = $fatherID; 
1

這是我在我的評論在ERD圖中提出的建議。

ERD