new_project / schema.sql
So-yeon's picture
Initial upload: 정부 사업 공고 대시보드
3425b39 verified
-- =============================================
-- 정부 사업 공고 대시보드 Supabase 스키마
-- Supabase SQL Editor에서 실행하세요
-- =============================================
-- 1. 공고 테이블
CREATE TABLE IF NOT EXISTS announcements (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
source TEXT NOT NULL, -- 'MSS' | 'MOTIE'
title TEXT NOT NULL, -- 공고명
announcement_no TEXT, -- 공고번호
department TEXT, -- 담당 부서
business_type TEXT, -- 사업 유형
apply_start DATE, -- 신청기간 시작
apply_end DATE, -- 신청기간 종료
detail_url TEXT, -- 상세 페이지 URL
registered_at DATE, -- 공고 등록일
fetched_at TIMESTAMPTZ DEFAULT NOW(), -- 수집 시각
period_source TEXT, -- 'list' | 'detail' | 'attachment' | null
UNIQUE (source, announcement_no)
);
-- 2. 첨부파일 테이블
CREATE TABLE IF NOT EXISTS attachments (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
announcement_id UUID NOT NULL REFERENCES announcements(id) ON DELETE CASCADE,
file_name TEXT NOT NULL,
file_url TEXT NOT NULL,
file_type TEXT -- 'pdf' | 'hwp' | 'docx' | 'zip' 등
);
-- 3. 마지막 업데이트 시각 추적 테이블
CREATE TABLE IF NOT EXISTS crawl_log (
id SERIAL PRIMARY KEY,
crawled_at TIMESTAMPTZ DEFAULT NOW(),
new_count INTEGER DEFAULT 0,
status TEXT DEFAULT 'success', -- 'success' | 'error'
message TEXT
);
-- 4. 인덱스
CREATE INDEX IF NOT EXISTS idx_announcements_source ON announcements(source);
CREATE INDEX IF NOT EXISTS idx_announcements_apply_end ON announcements(apply_end);
CREATE INDEX IF NOT EXISTS idx_attachments_announcement_id ON attachments(announcement_id);