2011-04-24 5 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 

그래서 당신은 "출생"유형의 삶의 이벤트를 가질 수 있고, ROLE_ID 부모 있었고, 누구 아이 누구인지를 알려줍니다. 이것은 결혼, 사망, 이혼, 수양 부모, 대리 부모 (매우 복잡한 관계를 가진 3 ~ 4 명의 부모가있는 곳) 등으로 확장 될 수 있습니다.

더 먼 관계를 저장하는 방법은 다음과 같습니다. 예를 들어, 'father'역할을 가진 사람에게 일치하는 event_id를 부여하여 다른 사람의 아버지를 계산할 수 있습니다. 그런 다음 그 사람의 아버지를 얻을 수 있으며 원래 사람의 할아버지가 있습니다. 누군가가 알려지지 않은 곳이라면 알 수없는 데이터를 가진 사람을 창조하십시오.

+0

이것은 재미 있고 문제를 해결할 잠재력이 있습니다 (필자는 필요한 경우 자리 표시자를 사용하여 원거리 관계에 공백을 두지 말 것을 제안합니다). 내가 가진 유일한 질문은 어떻게 내가 투명하게 관계의 방향을 결정할 수 있는가하는 것입니다. 지금 당장은 한 노드가 다른 노드와 상대적으로 어디에 위치하는지에 대한 판단을 내리기 위해 매번 이벤트 유형 설명이나 역할을 조사해야 할 것처럼 보입니다. –

+0

@tandu '관계의 방향'이 무슨 뜻인지 모르겠다. 나는 그것이 SQL보다는 당신의 프로그램 논리에 달려 있다고 생각한다. 데이터베이스는 단지 'Bob'의 'birth'이벤트에이를 저장하고 'Geoff'는 아버지 였고 'Alice'는 어머니 였고 'Bob'은 'baby'였습니다. 프로그램에서, Bob의 부모가 누구인지 알아 보려면 person_event_role에서 선택하십시오. 여기서 life_event_id는 Bob의 출생이고 life_event_role_id는 어머니 또는 아버지입니다. –

+0

그것이 바로 내가 지향하는 것입니다. 예를 들어 사용자가 Bob 인 경우 Bob의 아들, 아버지 및 아내가 트리에서 어디에 있는지 찾아야합니다. 그의 아들은 남쪽, 그의 아버지는 북쪽, 그의 아내는 서쪽 또는 동쪽입니다. 당신이 이미 대답 한 것처럼 보이지만, 당신은 사람의 역할에 기초하여이 방향을 계산하라는 말을합니다. PHP에서 각 문자열을 검사하고 그 방향을 계산해야한다면 MySQL에서이 작업을 투명하게 수행 할 수는 없지만 스키마가 필요하지 않다고 말하는 것 같습니다. –

1
person 
------- 
person_id 
other_stuff 

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

는 관심있는 값과의 관계 유형을 채 웁니다. (FK 일부 선택 목록에 좋은 것)

나는 흥미로운 subdiscussion/생각 provokation에 대한에 날짜를 넣어.

+0

이것은 내가 기울고있는 것이지만, 그것이 100 % 최선의 방법인지 확실하지 않습니다. 이것은 또한 결석 한 부모와의 조부모 - 자식 관계의 문제를 반드시 해결하지는 못합니다. 부모가 결석하지 않으면 내가이 두 가지를 저장하지 않는다면 조부모 - 부모 관계에 의해 제거되기 때문에이 관계를 저장할 필요가 없습니다. –

+0

이 모델을 사용하면 두 가지를 모두 저장할 수 있습니다. 나는 그것을 권장하지 않습니다. 당신은 managin 중복 관계의 작업을 구매하고 있습니다. 이것은 구조가 비정규 화 될 때의 문제와 같습니다. 그 관계 유형을 기반으로 레코드를 엄격히 제한해야합니다. – Randy

+0

@tandu, 생물학 .... 아이는 부모 없이는 태어난 적이 없다. 심지어 computer_science 나무에서도 그렇습니다. 시작과 끝 날짜는 문제를 능숙하게 해결합니다. – Johan

0

GEDCOM data modelGramps data model은 서로 다른 도구간에 유전자 데이터를 교환하기위한 가장 일반적인 형식 중 두 가지입니다. 이러한 데이터 모델 중 하나를 사용하면 (1) 도구를 다른 도구와 더욱 호환 가능하게 만들고 (2) 데이터 모델이 유전자 데이터를 처리하도록 특별히 고안된 경우를 고려하여 데이터 모델이 많은 특수한 경우에 적용될 수 있도록해야합니다.

Oxy-Gen 또는 Gramps PHP exporter 같은 도구는 GEDCOM 데이터를 데이터베이스로 가져 오는 방법에 관해 알려줄 것입니다.

자세한 내용은 내 대답도 “Family Tree” Data Structure을 참조하십시오.