kcg-monitoring/database/migration/001_initial_schema.sql
htlee 512020d6bb feat: 백엔드 Spring Boot + DB 스키마 + Python 분석서버 스켈레톤
- backend/: Spring Boot 3.2 + Java 17, Google OAuth + JWT 인증
  - AuthController/Service/Filter: id_token 검증 + gcsc.co.kr 도메인 제한
  - JPA Entity: users, login_history
  - 수집기 placeholder: GDELT, Google News, CENTCOM, Aircraft
  - ArticleClassifier: 프론트엔드 분류 정규식 이식
  - 프로파일: local / prod (PostgreSQL 211.208.115.83:5432/kcgdb)
- database/: 초기 스키마 (events, news, osint, users, login_history)
- prediction/: FastAPI placeholder (향후 해양 분석)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 13:54:58 +09:00

84 lines
2.7 KiB
SQL

-- 001: 초기 스키마 생성
-- events, news, osint, users, login_history
SET search_path TO kcg;
-- 이벤트 테이블 (GDELT 등 이벤트 데이터)
CREATE TABLE IF NOT EXISTS events (
id BIGSERIAL PRIMARY KEY,
event_id VARCHAR(64) UNIQUE,
title TEXT NOT NULL,
description TEXT,
source VARCHAR(128),
source_url TEXT,
category VARCHAR(64),
latitude DOUBLE PRECISION,
longitude DOUBLE PRECISION,
timestamp TIMESTAMP NOT NULL,
raw_data JSONB,
created_at TIMESTAMP NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events (timestamp);
-- 뉴스 테이블
CREATE TABLE IF NOT EXISTS news (
id BIGSERIAL PRIMARY KEY,
title TEXT NOT NULL,
summary TEXT,
source VARCHAR(128),
source_url TEXT UNIQUE,
category VARCHAR(64),
language VARCHAR(8),
timestamp TIMESTAMP NOT NULL,
raw_data JSONB,
created_at TIMESTAMP NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_news_timestamp ON news (timestamp);
-- OSINT 테이블
CREATE TABLE IF NOT EXISTS osint (
id BIGSERIAL PRIMARY KEY,
title TEXT NOT NULL,
content TEXT,
source VARCHAR(128),
source_url TEXT UNIQUE,
category VARCHAR(64),
credibility SMALLINT,
latitude DOUBLE PRECISION,
longitude DOUBLE PRECISION,
timestamp TIMESTAMP NOT NULL,
raw_data JSONB,
created_at TIMESTAMP NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_osint_timestamp ON osint (timestamp);
CREATE INDEX IF NOT EXISTS idx_osint_category ON osint (category);
-- 사용자 테이블
CREATE TABLE IF NOT EXISTS users (
id BIGSERIAL PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
name VARCHAR(128) NOT NULL,
picture TEXT,
last_login_at TIMESTAMP,
created_at TIMESTAMP NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_users_email ON users (email);
-- 로그인 이력 테이블
CREATE TABLE IF NOT EXISTS login_history (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES users(id),
login_at TIMESTAMP NOT NULL DEFAULT NOW(),
ip_address VARCHAR(45),
user_agent TEXT,
success BOOLEAN NOT NULL DEFAULT TRUE,
failure_reason VARCHAR(100)
);
CREATE INDEX IF NOT EXISTS idx_login_history_user_id ON login_history (user_id);
CREATE INDEX IF NOT EXISTS idx_login_history_login_at ON login_history (login_at);