2011-10-20 2 views
4

나는 단체와 이사회 멤버가 있습니다. 모든 조직에는 이사회 구성원이 있으며 많은 이사회 구성원은 둘 이상의 조직의 이사회에 있습니다.관련된 엔티티를 통해 적절하게 순환하기

나는 그 관계를 설명하기 위해 JIT Hypertree을 사용하고 있습니다. JIT Hypertree 스키마는 하나의 항목을 모두의 부모로 요구하며 단일 JSON 배열을 기반으로 그려집니다.

나는 리 센터링 이벤트 쿼리를 사용하고 변경을 기반으로 그래프를 다시 채우고 싶습니다. 그럼 2 레벨 괜찮을거야하지만 난 그렇게하는 방법을 해결할 수있게되지 않았습니다.

내가 현재 가지고있는 코드는 시작 조직에서 3 단계로 수동으로 반복되지만 원하는 것은 모든 관련 레코드를 통해 다시 저주하는 것입니다.

그래서 Org로 시작하여 Org의 자식 배열 (이사회 멤버)을 추가 할 것입니다. 그런 다음 각 게시판 구성원에 대한 모든 게시판 (현재 Org이 아닌)을 가져 와서 게시판 구성원의 자녀로 추가하십시오.

각 트레일이 끝날 때까지 계속됩니다. 아마도 한 보드에만 속한 보드 멤버 일 것입니다.

누구나이 배열을 만들고 중복을 피하는 방법에 대한 조언이 있으십니까?

hakre 응답 내 데이터 구조가 고유 ID와 조직의 테이블, 고유 ID를 가진 사람들의 테이블, 다음기구를 지정하는 두 브리징 테이블입니다 // 편집 2011년 10월 24일 재에서
$board = $center->board(); 

$top['id'] = $center->ID; 
$top['name'] = $center->Org; 
$top['children'] = array(); 
if ($board) { 
    foreach ($board as $b) { 
     $child['id'] = $b->ID; 
     $child['name'] = (strlen(trim($b->Last)) > 0) ? $b->First . ' ' . $b->Last : 'Unknown'; 
     $child['data']['orgname'] = $center->Org; 
     $child['data']['relation'] = $b->Role; 
     $child['data']['occupation'] = $b->Occupation; 
     $child['children'] = array(); 
     $childboards = $b->boards(); 
     if ($childboards) { foreach ($childboards as $cb) { 
      $gchild['id'] = $cb->ID; 
      $gchild['name'] = $cb->Org; 
      $gchild['data']['orgname'] = (strlen(trim($b->Last)) > 0) ? $b->First . ' ' . $b->Last : 'Unknown'; 
      $gchild['children'] = array(); 
      $childboardmembers = $cb->board(); 
      if ($childboardmembers) { foreach ($childboardmembers as $cbm) { 
       $ggchild['id'] = $cbm->ID; 
       $ggchild['name'] = (strlen(trim($cbm->Last)) > 0) ? $cbm->First . ' ' . $cbm->Last : 'Unknown'; 
       $ggchild['data']['orgname'] = $cb->Org; 
       $ggchild['data']['relation'] = $cbm->Role; 
       $ggchild['data']['occupation'] = $cbm->Occupation; 
       $ggchild['children'] = array(); 
       $gchild['children'][]= $ggchild; 
      }} 
      $child['children'][]= $gchild; 
     }} 
     $top['children'][] = $child; 
    } 
} 
$top['data'] = array(); 
$top['data']['description'] = $center->Desc; 
echo json_encode($top); 

(엔티티)과 사람과 사람이 엔티티에서하는 역할. 일반적인 many-to-many. 서브 보드가 전혀 없습니다. 나는 그 이미지를 만들었지 만 지금은 무의미한 것처럼 보이지만 바닥에 그것을 추가 할 것이다.

JIT를 라이브러리 데이터 구조는 그들의 밴드의 예에서 다음과 같이 진행한다는 점에서 (나에게) 조금 견과류입니다 :

그것은 사람도 인 것처럼
Top: Nine Inch Nails 
    Child: Jerome Dillon 
    Child: Howlin Maggie (another band) 
     {all the bands' members and then all of their bands...} 

그래서 조직 (밴드) 처리 그것은 수많은 인물들로 구성되어있다. 그리고 위의 코드를 사용하여 재귀 할 때 끔찍한 부 풀림을 얻지 만 JSON은 팽창에도 불구하고 올바르게 작동합니다.

JSONExample Visualization // 최종 편집

schema

답변

2

귀하의 질문은 당신의 데이터 구조는 주로 알 수없는 의미에서 대답하기 어렵다. 내가 특별히 모르는,

*- Parent 
    +- Child 
    +- Child 
    ... 
    `- Child 

귀하의 데이터 구조가 다른 형식을 가지고 있지만 그것은 같은 뭔가 : 당신이 단순한 관계를 제공해야 그래픽 represenation를 들어

나는 제대로 그 이해하면

Org <-- 1:n --> Board 

Board <-- n:n --> Board # If you have sub-boards 

Board <-- n:n --> Member 

데이터가 표현되는 방식에 관계없이 그래픽 표현을 위해 필요한 구조로 데이터를 매핑하거나 변환하려면 데이터를 처리하는 몇 가지 기능이 필요합니다.

이렇게하려면 두 키와 특정 키간에 분류/유형을 공유해야하므로 이벤트에서 필요한 데이터를 조회하여 데이터를 반환 할 수 있습니다. 예 :

if (request_parent_is_org()) 
{ 
    $id = request_parent_id(); 
    $parent = data_get_board($id); 
    $parent->addChildrent(data_get_board_children($id)); 
} 
else 
{ 
    ... # All the other decisions you need to take based on request type 
} 

view_response_to_json($parent); 
+0

안녕 hakre이 응답 해 주셔서 감사합니다! 필자는 스키마를 명확히하고 JIT 라이브러리 JSON 스키마에 주석을 달았습니다. 제발 당신의 대답에 영향을 미치는지 한번보세요. 감사! – jerrygarciuh

2

다 대다 데이터 모델을 가지고있는 것은 graph입니다. JIT는 trees 용으로 설계되었습니다.

다른 말로하면 JIT는 한 사람이 여러 조직에 연결될 때마다 데이터에 표시되는 교차 선을 올바르게 표시하지 않습니다.

올바른 네트워크 그래프 시각화를 권하고 싶습니다. D3.js은 최신 브라우저를위한 훌륭한 구현을 제공합니다.

{ 
    "name": "Mme.Hucheloup", 
    "group": 1 
}, 
{ 
    "name": "Afton School Board", 
    "group": 2 
} 

그리고 당신은 연결 객체를 정의하여 관련 테이블의 각 협회 : -

이 사용하는 JSON 데이터 형식은 테이블 구조 주어진 구현하기 위해 실제로 쉽게 모든 조직과 사람들을 위해, 당신은 객체를 정의 그 (것)들을 함께 철사 :

{ 
    "source": 1, 
    "target": 2 
}, 

D3에있는 공상 코딩은 나머지를 다룬다. 행운을 빕니다!

+0

실제로 JIT의 하이퍼 트리는 내가 원하는 것을 정확히 수행하고, 말하지 않는 것은 않습니다. Mitch Landrieu 시장의 시장을 확인하십시오. http://nolasatellitegovernment.tulane.edu/network_mapping.php?oID=10 링크를 제공해 주셔서 감사합니다! 강제로 그래프를 지향하고있는 것은 아니지만 재미 있습니다! – jerrygarciuh

+0

그냥 내 전체 데이터 세트와 Force Directed Graph를 사용하여 데모를 만들었습니다. Links 배열은 엄밀히 말하자면 숫자 인덱스에 의한 것이므로 어떤 게시판 멤버 노드를 가지고 있든간에 Landrieu 시장을 어느 인덱스에 집어 넣을 지 알기위한 계획을 세워야합니다. 따라서 각 보드는 별도의 그래프로 표시됩니다. 아직도 재미! http://nolasatellitegovernment.tulane.edu/vis/d3/force/ – jerrygarciuh

+0

내 객체의 ID에 키를 추가하고 노드 []에 숫자 인덱스를 저장하는 추가 된 색인 배열이있는 또 다른 방법이 있습니다. 두 개 이상의 보드에 연결된 보드 멤버가 자유롭게 중복 된 노드를 가지고있는 경우 이상한 유물이 있습니다. 모두 재미 있지만, 내가 겪은 것이 아닙니다. 확대를 위해 확대를 추가했습니다. 전체지도를 보려면 노드 위로 스크롤하십시오. http://nolasatellitegovernment.tulane.edu/vis/d3/force/linked.html – jerrygarciuh

2

당신은 아래의 기능을 사용할 수 있습니다 :

function get_orgs_and_childs ($child_id, $found = array()) 
{ 
    array_push ($found, $child['name']); 

    if($child['children'])){ 
      $found[] = get_parents($child['id'], $found); 
    } 
    return $found; 
} 

사용하여 전화 :

$orgs = get_orgs_and_childs($child['id']); 
관련 문제