2012-12-23 5 views
1

나는 부모님의 크리스마스 선물로 모은 엄마의 계보 보고서를 동봉하고 보여주기 위해 패밀리 트리 + 기록 [PHP] 웹 사이트를 구축 중입니다. 트리는 적어도 MySQL 데이터베이스 ('패밀리')를 기반으로합니다.이 데이터베이스에서는 현재 '사람'과 '결혼'이라는 두 테이블로 작업하고 있습니다. 나는 또한 세 번째 테이블 인 '친자 관계'를 가지고 있지만 불필요한 것으로 간주합니다. 결혼 "ID 모두 테이블의 COLS 구성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 지수는 다음과 같은 구조이다.' (성 차별적 용어의 사용을 용서해주십시오. 단순히 구조적인 목적을 위해서입니다. MySQL을 처음 접하는 분도 마찬가지입니다. 제 가족도 우익이고 보수적 인 편입니다.하지만 실제로는 그렇지 않습니다. 당신이 원한다면, 문제가되지 않으며 아무런 의미가 없으며 배우자 1과 배우자 2로 간주 될 수도 있습니다. 나는 개인적으로 동성애 혐오감도없고 누구에게도 편견이 없습니다. 면책 조항을 끝내십시오. 모두에게 평화하십시오. 왜 내가 결혼에 대한 별도의 테이블을 유지하고 싶은지 알 수 있습니다. 각 결혼은 포함되어야하는 자체 데이터를 가지고 있으며, 두 배우자의 기록에서 각 결혼에 대한 데이터를 반복하는 것은 어리석은 일입니다. 나는 'persons'테이블에서 'spouseID'컬럼을 사용 했었지만 각각의 배우자의 ID를 수동으로 일치시킬 필요가 있었으며, 해당 컬럼을 해당 결혼 컬럼에 연결하는 방법을 알지 못했습니다 (' 어쨌든, 결혼 테이블) 어쨌든 나는 그것을 떨어 뜨렸다.

"결혼"에 배우자 ID 열 둘 모두를 표시하는 대신 누군가의 이름을 대신 표시하거나 밝힐 수있는 사람이 있다면 나를 나에게 밝힐 수 있습니다.

하지만 주로 나는 두 테이블 (어떻게 든 '결혼 테이블'과 통합 된 '사람'테이블에 '배우자'열을 포함 할 수 있음)을 연결하는 방법과 두 번째로 계층 적 트리를 표시합니다.

매우 감사드립니다.

P. 나무는 6 세대에 걸쳐 상당히 광범위합니다. 약 45 명의 '인물'이 있는데, 그 정보가 무엇이든 상관없이 16 가지의 결혼이 있다고 생각합니다. ...

+0

귀하의 구조는 관계형 소리입니다. 내가 보는 유일한 문제는 husbandID와 wifeID 열 모두를 쿼리하지 않고도 결혼에 대한 쿼리를 쉽게 수행 할 수없고 특정 결혼을 찾을 수 없다는 것입니다. 나는 개인적으로 그 관계를 관련있는 자녀의 결혼 테이블로 옮길 것입니다. Person과 실제로 같은 문제가 있습니다. 여하튼, 당신의 질의에서 당신은 단순히 관계의 각각에 대한 결혼에서 사람으로의 내적 결합을 활용할 필요가 있습니다. 그것은 모든 인물의 열을 행에 추가 할 것입니다. – 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