에듀테크 프로젝트 대시보드
뷰와 구체화 뷰
복잡한 쿼리에 이름을 붙여 재사용합니다. 일반 뷰는 매번 실행, 구체화 뷰는 결과를 저장.
CREATE VIEW active_students AS
SELECT s.*, c.room
FROM students s JOIN classes c ON c.id = s.class_id
WHERE s.deleted_at IS NULL;
SELECT * FROM active_students WHERE grade = 1; -- 실제로는 원본 조인 실행단순한 단일 테이블 뷰는 수정 가능(INSERT/UPDATE 가능). 조인·집계가 있으면 읽기 전용이며, 필요 시 INSTEAD OF 트리거로 쓰기를 정의.
CREATE MATERIALIZED VIEW class_stats AS
SELECT class_id, count(*) AS n, avg(score) AS avg_score
FROM exams GROUP BY class_id
WITH DATA;
REFRESH MATERIALIZED VIEW class_stats; -- 갱신 (그동안 읽기 차단)-- CONCURRENTLY 는 UNIQUE 인덱스가 있어야 함
CREATE UNIQUE INDEX ON class_stats (class_id);
REFRESH MATERIALIZED VIEW CONCURRENTLY class_stats; -- 읽기 안 막힘 (대신 느림)cron 이나 pg_cron 으로 주기 실행실시간성이 필요하면 구체화 뷰 대신 요약 테이블 + 트리거 또는 애플리케이션 캐시(Redis)를 검토하세요.