🔎 PostgreSQL에서 pgRouting을 그래프 데이터베이스로 활용하는 방법
PostgreSQL은 강력한 관계형 데이터베이스이지만, 일부 확장을 활용하면 그래프 데이터베이스로도 활용할 수 있습니다. 그중 하나가 바로 pgRouting입니다.
pgRouting은 일반적으로 최단 경로 탐색에 사용되지만, 사실상 기본적인 그래프 기능을 제공하여 다양한 응용이 가능합니다. 특히 전용 그래프 데이터베이스(Neo4j, Apache AGE) 없이도 간단한 그래프 구조를 구현하고 활용할 수 있습니다.
이 블로그에서는 pgRouting의 개념과 활용법을 살펴보고, GIS(지리정보 시스템) 외에도 태스크 스케줄링, 서버 리소스 할당, 추천 시스템 등 다양한 비(非)GIS 활용 사례를 알아보겠습니다.
📌 pgRouting이란?
pgRouting은 PostGIS 확장 기능 중 하나로, 그래프 기반 네트워크 분석을 수행할 수 있는 PostgreSQL 확장입니다.
✔ 주요 기능:
- 최단 경로 탐색 (Dijkstra, A* 알고리즘)
- 네트워크 분석 (경로 최적화, 이동 비용 계산)
- 그래프 데이터 처리 (노드/엣지 구조)
✔ 활용 분야:
- GIS: 지도 기반 네비게이션, 물류 최적화
- 태스크 스케줄링: 작업 간 종속 관계를 고려한 일정 최적화
- 리소스 할당: 네트워크 내 최적의 경로 찾기
- 추천 시스템: 사용자 행동 기반 콘텐츠 추천
1️⃣ pgRouting을 이용한 그래프 데이터 모델링
✅ 그래프의 기본 개념
pgRouting은 데이터를 **그래프 구조(노드와 엣지)**로 모델링하여 사용합니다.
- 노드(Node): 개별 엔터티(장소, 작업, 서버, 사용자 등)
- 엣지(Edge): 노드 간의 연결 관계(도로, 종속성, 데이터 흐름 등)
예를 들어, 다음과 같은 그래프를 생각해볼 수 있습니다.
(A) ---3--- (B) ---2--- (C)
여기서 A, B, C는 노드이며, 3과 2는 **엣지의 가중치(비용)**입니다.
2️⃣ 비(非) GIS 환경에서의 pgRouting 활용 사례
🛠 1. 태스크 스케줄링(Task Scheduling)
프로젝트에서 작업 간 종속 관계를 그래프로 표현할 수 있습니다.
🔹 예제 시나리오:
작업(Task) 간 선후 관계가 있으며, 특정 작업이 끝나야 다음 작업이 시작될 수 있음.
(Start) → (Task A) → (Task B) → (Task C) → (End)
🔹 pgRouting을 활용한 최적 일정 계산
-- 작업 테이블 생성
CREATE TABLE tasks (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL
);
-- 작업 간 종속 관계(엣지) 테이블 생성
CREATE TABLE dependencies (
id SERIAL PRIMARY KEY,
source INTEGER NOT NULL,
target INTEGER NOT NULL,
duration INTEGER NOT NULL,
CONSTRAINT fk_source FOREIGN KEY (source) REFERENCES tasks(id),
CONSTRAINT fk_target FOREIGN KEY (target) REFERENCES tasks(id)
);
-- 예제 데이터 삽입
INSERT INTO dependencies (source, target, duration) VALUES
(1, 2, 3), -- Task A (3일)
(2, 3, 4), -- Task B (4일)
(3, 4, 5), -- Task C (5일)
(4, 5, 2); -- Task D (2일)
-- 최장 경로(전체 프로젝트 일정) 계산
SELECT * FROM pgr_dijkstra(
'SELECT id, source, target, duration AS cost FROM dependencies',
1, -- 시작 작업 ID
5 -- 종료 작업 ID
);
📌 결과: 프로젝트의 총 소요 시간(최장 경로)이 도출됨 → 일정 최적화 가능
🖥 2. 서버 리소스 할당 & 네트워크 최적화
클라우드 서버 간의 데이터 전송 경로 최적화를 위해 pgRouting을 활용할 수 있습니다.
🔹 예제 시나리오:
- 여러 개의 서버가 있고, 각 서버 간 데이터 전송 비용(레이턴시)이 다름
- 최적의 경로를 찾아 데이터 이동 속도를 최적화해야 함
🔹 pgRouting을 활용한 네트워크 최적 경로 찾기
-- 서버 노드 테이블 생성
CREATE TABLE servers (
id SERIAL PRIMARY KEY,
name TEXT,
x DOUBLE PRECISION,
y DOUBLE PRECISION
);
-- 서버 간 연결 테이블 생성
CREATE TABLE server_latency (
id SERIAL PRIMARY KEY,
source INTEGER,
target INTEGER,
cost DOUBLE PRECISION,
CONSTRAINT fk_source FOREIGN KEY (source) REFERENCES servers(id),
CONSTRAINT fk_target FOREIGN KEY (target) REFERENCES servers(id)
);
-- 예제 데이터 삽입
INSERT INTO server_latency (source, target, cost) VALUES
(1, 2, 1.5), -- Server A → Server B (1.5ms)
(2, 3, 2.0), -- Server B → Server C (2.0ms)
(2, 4, 1.8), -- Server B → Server D (1.8ms)
(4, 3, 1.0); -- Server D → Server C (1.0ms)
-- A* 알고리즘을 활용한 최적 경로 탐색
SELECT * FROM pgr_astar(
'SELECT id, source, target, cost FROM server_latency',
1, -- Server A (출발지)
3 -- Server C (목적지)
);
📌 결과: 서버 간 **최적 경로(레이턴시 최소화 경로)**가 도출됨 → 리소스 효율성 극대화
📺 3. 추천 시스템(Recommendation System)
YouTube 같은 추천 시스템에서도 pgRouting을 활용할 수 있습니다.
🔹 예제 시나리오:
- 사용자들이 특정 영상을 시청하거나 좋아요를 누르면 관계(엣지)가 형성됨
- 이를 바탕으로 비슷한 영상을 추천
🔹 pgRouting을 활용한 영상 추천
-- 추천을 위한 영상 간 관계 데이터 삽입
INSERT INTO video_relationships (source_video_id, target_video_id, relationship_type, weight) VALUES
(1, 2, 'same_category', 5), -- 같은 카테고리
(2, 3, 'watched_by_same_users', 3), -- 같은 사용자가 시청
(4, 5, 'same_category', 5);
-- 특정 사용자가 좋아한 영상과 관련된 추천 영상 찾기
SELECT * FROM pgr_dijkstra(
'SELECT id, source_video_id AS source, target_video_id AS target, weight AS cost FROM video_relationships',
1, -- 사용자가 본 영상 ID
3 -- 추천할 영상 ID
);
📌 결과: 사용자의 시청 패턴을 기반으로 최적의 추천 경로 도출
🔎 PostgreSQL에서 pgRouting을 그래프 DB처럼 활용하기
pgRouting은 단순한 최단 경로 탐색을 넘어 다양한 그래프 활용이 가능합니다.
- 태스크 스케줄링: 프로젝트 일정 최적화
- 네트워크 최적화: 서버 리소스 효율적 분배
- 추천 시스템: 사용자 행동 기반 추천
📌 결론: PostgreSQL만으로도 그래프 기반 분석이 가능하며, 전용 그래프 DB 없이도 효과적인 데이터 분석을 수행할 수 있습니다. 🚀
https://supabase.com/blog/pgrouting-postgres-graph-database
Postgres as a Graph Database: (Ab)using pgRouting
Build production-grade applications with a Postgres database, Authentication, instant APIs, Realtime, Functions, Storage and Vector embeddings. Start for free.
supabase.com
'DB' 카테고리의 다른 글
텍스트 임베딩을 저장하는 최고의 방법: Parquet와 Polars 활용하기 (0) | 2025.03.07 |
---|---|
Rust로 다시 태어난 SQLite: Limbo 프로젝트를 소개합니다 (0) | 2024.12.13 |
2025년에 주목해야 할 7가지 데이터베이스: 기술 혁신을 탐구하다 (0) | 2024.12.11 |
실시간 데이터 동기화의 핵심! Change Data Capture (CDC) 알아보기 (0) | 2024.11.13 |
Prepared Statement란 무엇인가? (0) | 2024.11.06 |