그래프
관계로만 답할 수 있는 질문이 무엇인지, 그래프 탐색이 표 조회와 어떻게 다른지 설명합니다.
엔티티와 관계를 정의하고 실제 데이터를 채우면 그래프가 만들어집니다. 그래프는 점과 선으로 그린 그림이 아니라, 관계를 따라 이동할 수 있는 데이터 구조입니다.
표 조회는 조건에 맞는 행을 찾는 데 강하지만, 몇 단계 건너 이어지는 질문에는 약합니다. "박수민 님과 두 다리 건너 프로젝트로 이어진 사람"처럼 연결을 두세 번 따라가야 하는 질문은 조인을 겹겹이 쌓는 대신 관계를 따라가는 편이 짧고 정확합니다.
표 조회가 약해지는 지점
한 표 안에서 조건을 거는 질문은 표가 잘 다룹니다. 이번 달에 착수한 프로젝트를 찾는 일에 그래프는 필요하지 않습니다.
약해지는 쪽은 거리가 미리 정해지지 않은 질문입니다. 박수민 님에서 시작해 그가 참여한 프로젝트, 같은 프로젝트에 참여한 직원, 그 직원이 참여한 다른 프로젝트까지 따라가야 한다면, 표에서는 단계마다 조인을 하나씩 더 써야 합니다. 몇 단계까지 갈지 모르는 질문은 조인 개수를 미리 정할 수 없습니다. 그래프에서는 같은 질문이 연결을 따라 계속 이동하는 하나의 동작이 됩니다.
여기서 한 가지가 눈에 띕니다. 모델에는 직원과 직원을 직접 잇는 관계가 없습니다.
다이어그램을 불러오는 중입니다. Mermaid 원본:
flowchart LR
accTitle: 등록된 관계 세 개와 등록되지 않은 직원 사이 연결
accDescr: 직원이 팀에 속하고 프로젝트에 참여하며 프로젝트가 거래처와 함께하는 관계 세 개는 모델에 등록되어 있습니다. 직원과 직원을 직접 잇는 관계는 등록되어 있지 않아, 같이 일한 사이는 같은 프로젝트를 거쳐 이어 읽어야 나옵니다.
E1[직원 박수민] -->|속한다| T[팀]
E1 -->|참여한다| P[한빛 프로젝트]
E2[직원 이지호] -->|참여한다| P
P -->|함께한다| C[거래처]
E1 -.->|같이 일한 사이 · 등록 없음| E2점선은 등록되지 않은 연결입니다. 두 사람이 같이 일했다는 사실은 어디에도 행으로 저장되어 있지 않고, 같은 프로젝트로 이어진 참여 기록 두 개를 이어 읽을 때 나타납니다. 그래프가 하는 일이 이것입니다.
한 단계씩 넓혀 가는 탐색
그래프에서 한 대상을 기준으로 삼으면 그 대상에 직접 이어진 연결이 한 단계 범위입니다. 거기서 범위를 한 단계씩 넓히면 두 단계, 세 단계 떨어진 대상까지 들어옵니다. 어디서 멈출지는 질문이 정합니다.
이 방식이 조인과 다른 점은 경로를 미리 설계하지 않아도 된다는 것입니다. 어느 쪽으로 이어질지 모르는 상태에서 시작해, 연결이 나타나는 대로 따라갈 수 있습니다. 데이터를 조사하는 단계에서 특히 유용한 성질입니다.
관계의 방향은 연결의 뜻을 정하지, 이웃으로 보이는지를 정하지 않습니다. 직원이 프로젝트에 참여한다는 관계는 프로젝트 쪽에서 출발해도 이웃으로 나타나고, 참여하는 쪽과 참여 대상의 구분만 그대로 유지됩니다.
그래프는 적재된 만큼만 압니다
모델에 관계를 정의했다고 그래프가 채워지지는 않습니다. 관계에도 실제 행이 필요하고, 그 행은 파이프라인이 적재합니다.
관계 행이 없으면 노드는 서로 떨어진 채 남습니다. 대상은 존재하지만 이어진 것이 없어 범위를 넓혀도 따라갈 곳이 나오지 않습니다. 예상한 연결이 보이지 않을 때 원인은 대개 다음 셋 중 하나입니다.
- 관계 행이 아직 적재되지 않았습니다.
- 관계의 참조 컬럼에 전달한 값이 엔티티의 식별 키 값과 맞지 않습니다.
- 연결이 여러 단계 떨어져 있어 지금 보는 범위 밖에 있습니다.
그래프는 데이터가 실제로 이어져 있는지 확인하는 자리이기도 합니다. 모델이 옳아도 적재가 어긋나면 그 사실이 화면에 그대로 드러납니다.
그래프로 볼 만한 질문
연결 자체가 답인 질문에 그래프를 씁니다. 무엇이 무엇에 영향을 주는지, 이 대상이 어디까지 이어지는지, 두 대상 사이에 경로가 있는지 같은 질문입니다.
반대로 합계, 평균, 순위처럼 값을 집계하는 질문은 표와 대시보드의 몫입니다. 그래프로도 셀 수 있지만 그렇게 쓰는 것은 도구를 바꿔 쥔 것에 가깝습니다. 연결을 따라가야만 나오는 답인지 먼저 확인하면 어느 쪽을 열지 쉽게 정해집니다.