[PostgreSQL] PostgreSQL에서 threshold 값 이력 관리 및 최신값 조회 테이블 설계하기

2025. 6. 28. 19:02·개발 (Development)/PostgreSQL

요구사항 정리

PostgreSQL을 사용하여 특정 설정값(threshold 등)을 관리해야 하는 상황이 있었습니다. 요구사항은 다음과 같았습니다.

  • 설정값을 데이터베이스에 저장하고, 나중에 읽어올 수 있어야 함
  • 설정값이 변경될 때마다 이력을 남기고, 기존 값을 덮어쓰지 않아야 함
  • 항상 가장 최신의 설정값을 쉽게 조회할 수 있어야 함
  • 나중에 다른 설정값이 추가될 수도 있으므로, 확장성 있게 설계하고자 함

이러한 조건을 만족시키기 위해 다음과 같은 방식으로 스키마를 설계하였습니다.

테이블 설계 방향

설정값의 이름과 값을 key-value 형태로 저장하는 방식으로 테이블을 구성하였고, 이력 관리를 위해 created_at 컬럼을 추가하였습니다.

테이블 구조 예시

CREATE TABLE config_history (
    id SERIAL PRIMARY KEY,
    config_key TEXT NOT NULL,                 -- 설정 이름 (예: 'score_threshold')
    config_value DOUBLE PRECISION NOT NULL,   -- 설정 값 (예: 0.85)
    config_type TEXT,                         -- 설정 유형 (예: 'threshold')
    created_at TIMESTAMP DEFAULT NOW(),       -- 생성 시각
    updated_by TEXT                           -- 설정 변경자 (선택 사항)
);
  • config_key: 어떤 설정값인지 구분하기 위한 키
  • config_value: 해당 설정값의 실제 수치
  • config_type: threshold, limit 등 설정의 분류 (확장용)
  • created_at: 이력 관리용 타임스탬프
  • updated_by: 누가 변경했는지 추적 가능

설정값 변경 예시

새로운 설정값을 저장할 때는 항상 INSERT를 사용합니다.

-- 예: score_threshold를 0.85로 설정
INSERT INTO config_history (config_key, config_value, config_type, updated_by)
VALUES ('score_threshold', 0.85, 'threshold', 'admin_user');

-- 예: probability_threshold를 0.9로 설정
INSERT INTO config_history (config_key, config_value, config_type, updated_by)
VALUES ('probability_threshold', 0.9, 'threshold', 'admin_user');

기존 값을 업데이트하지 않고 새로 insert함으로써, 모든 이력을 자동으로 관리할 수 있습니다.

최신 설정값 조회하기

모든 설정값(config_key)에 대해 가장 최신의 설정값을 조회하는 쿼리는 두 가지 방식으로 구현할 수 있습니다.

방법 1. DISTINCT ON (PostgreSQL 전용)

SELECT DISTINCT ON (config_key)
       config_key,
       config_value,
       config_type,
       created_at
FROM config_history
ORDER BY config_key, created_at DESC;

방법 2. ROW_NUMBER() 서브쿼리 사용

SELECT config_key, config_value, config_type, created_at
FROM (
    SELECT *,
           ROW_NUMBER() OVER (PARTITION BY config_key ORDER BY created_at DESC) AS rn
    FROM config_history
) t
WHERE rn = 1;

최신값 뷰(View)로 관리

매번 쿼리로 작성하는 것이 번거롭다면, 뷰를 만들어두는 것도 좋은 방법입니다.

CREATE OR REPLACE VIEW latest_config AS
SELECT DISTINCT ON (config_key)
       config_key,
       config_value,
       config_type,
       created_at
FROM config_history
ORDER BY config_key, created_at DESC;

필요할 때는 다음과 같이 간단하게 조회할 수 있습니다:

SELECT * FROM latest_config;

마무리

이번 설계를 통해 다음과 같은 장점을 확보할 수 있었습니다.

항목 설명
이력 관리 모든 설정값 변경사항이 자동으로 저장됨
최신값 추출 간단한 쿼리 또는 뷰로 관리 가능
확장성 새로운 설정 항목도 쉽게 추가 가능
변경 추적 누가 언제 어떤 설정을 바꿨는지 기록 가능

향후에는 특정 시간 기준의 설정 조회, 사용자별 변경 내역 조회 등으로도 확장할 수 있습니다. threshold 값을 버전처럼 관리하고 싶은 분들께 추천드리는 설계 방식입니다.

반응형

'개발 (Development) > PostgreSQL' 카테고리의 다른 글

[PostgreSQL] 문자열을 timestamp with time zone으로 변환하는 방법  (0) 2025.07.27
[PostgreSQL] MyBatis foreach + UNION ALL 쿼리의 성능 문제와 PostgreSQL 최적화  (1) 2025.07.05
[PostgreSQL] 두 테이블 비교 시 기준 테이블의 데이터를 모두 유지하는 방법  (0) 2025.05.25
[PostgreSQL] 시퀀스 자동 증가 설정과 오류 해결 방법 정리  (0) 2025.05.18
[PostgreSQL] 실전 활용 - 문자열 포함, 쉼표 구분 배열 매칭, JSON 배열 필터링  (0) 2025.04.26
'개발 (Development)/PostgreSQL' 카테고리의 다른 글
  • [PostgreSQL] 문자열을 timestamp with time zone으로 변환하는 방법
  • [PostgreSQL] MyBatis foreach + UNION ALL 쿼리의 성능 문제와 PostgreSQL 최적화
  • [PostgreSQL] 두 테이블 비교 시 기준 테이블의 데이터를 모두 유지하는 방법
  • [PostgreSQL] 시퀀스 자동 증가 설정과 오류 해결 방법 정리
LoopThinker
LoopThinker
모르는 것을 알아가고, 아는 것을 더 깊게 파고드는 공간
  • LoopThinker
    CodeMemoir
    LoopThinker
  • 전체
    오늘
    어제
    • 분류 전체보기 (216)
      • 개발 (Development) (151)
        • Algorithm (1)
        • Angular (1)
        • AWS (4)
        • DeepSeek (2)
        • Docker (7)
        • Git (3)
        • Java (30)
        • JavaScript (4)
        • Kafka (5)
        • Kubernetes (4)
        • Linux (6)
        • PostgreSQL (37)
        • Python (26)
        • React (3)
        • TypeScript (3)
        • Vue.js (5)
        • General (10)
      • 데이터 분석 (Data Analysis) (1)
      • 알고리즘 문제 풀이 (Problem Solving.. (27)
      • 자격증 (Certifications) (24)
        • ADsP (14)
        • 정보처리기사 (4)
        • Linux Master (5)
        • SQLD (1)
      • 기술 동향 (Tech Trends) (10)
      • 기타 (Others) (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    springboot
    AWS
    pandas
    데이터분석
    백준
    MyBatis
    javascript
    JSON
    리눅스 마스터 2급
    JPA
    ADsP
    Kafka
    백준알고리즘
    자바
    백준온라인저지
    DevOps
    deepseek
    Kubernetes
    PostgreSQL
    백준자바
    timescaledb
    Vue.js
    리눅스 마스터 2급 2차
    java
    docker
    Linux master
    오답노트
    python
    typescript
    Linux
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
LoopThinker
[PostgreSQL] PostgreSQL에서 threshold 값 이력 관리 및 최신값 조회 테이블 설계하기
상단으로

티스토리툴바