Spaces:
Running
Running
| -- JobSonar Database Schema | |
| -- SQLite (๋ก์ปฌ ๊ฐ๋ฐ) / PostgreSQL (ํ๋ก๋์ ) ํธํ | |
| -- ์ฑ์ฉ๊ณต๊ณ ๋ฉ์ธ ํ ์ด๋ธ | |
| CREATE TABLE IF NOT EXISTS jobs ( | |
| id INTEGER PRIMARY KEY AUTOINCREMENT, | |
| source_site TEXT NOT NULL, -- 'wanted' | 'saramin' | 'jobkorea' | |
| source_id TEXT NOT NULL, -- ์ฌ์ดํธ๋ณ ๊ณ ์ ID (์ค๋ณต ๋ฐฉ์ง) | |
| url TEXT NOT NULL, | |
| title TEXT NOT NULL, -- ๊ณต๊ณ ์ ๋ชฉ | |
| company_name TEXT NOT NULL, | |
| job_category TEXT, -- '๋ฐ์ดํฐ ์์ง๋์ด' | '๋ฐ์ดํฐ ๋ถ์๊ฐ' ๋ฑ | |
| industry TEXT, -- ํ์ฌ ์ ์ข (์ํฐ๋: API, ์ฌ๋์ธ/์ก์ฝ๋ฆฌ์: HTML) | |
| employment_type TEXT, -- '์ ๊ท์ง' | '๊ณ์ฝ์ง' | '์ธํด' ๋ฑ | |
| location TEXT, -- '์์ธ' | 'ํ๊ต' ๋ฑ | |
| experience_min INTEGER, -- ์ต์ ๊ฒฝ๋ ฅ (๋ ) | |
| experience_max INTEGER, -- ์ต๋ ๊ฒฝ๋ ฅ (๋ ), NULL = ๋ฌด๊ด | |
| salary_min INTEGER, -- ์ฐ๋ด ํํ (๋ง์) | |
| salary_max INTEGER, -- ์ฐ๋ด ์ํ (๋ง์) | |
| posted_date DATE, -- ๊ณต๊ณ ๊ฒ์์ผ | |
| deadline_date DATE, -- ๋ง๊ฐ์ผ | |
| is_active BOOLEAN NOT NULL DEFAULT 1, | |
| is_duplicate BOOLEAN NOT NULL DEFAULT 0, -- ํ ์ฌ์ดํธ ๋์ผ ๊ณต๊ณ ์ค๋ณต ์ฌ๋ถ | |
| collected_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| UNIQUE(source_site, source_id) | |
| ); | |
| -- ๊ธฐ์ ์คํ ํ ์ด๋ธ (๊ณต๊ณ ๋ณ ํ๊ทธ) | |
| CREATE TABLE IF NOT EXISTS job_skills ( | |
| id INTEGER PRIMARY KEY AUTOINCREMENT, | |
| job_id INTEGER NOT NULL REFERENCES jobs(id) ON DELETE CASCADE, | |
| skill_name TEXT NOT NULL, -- ์ ๊ทํ๋ ์คํฌ๋ช (์๋ฌธ์) | |
| UNIQUE(job_id, skill_name) | |
| ); | |
| -- ์์ง ์คํ ๋ก๊ทธ (GitHub Actions ๋๋ฒ๊น ์ฉ) | |
| CREATE TABLE IF NOT EXISTS crawl_logs ( | |
| id INTEGER PRIMARY KEY AUTOINCREMENT, | |
| source_site TEXT NOT NULL, | |
| started_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| finished_at DATETIME, | |
| jobs_found INTEGER DEFAULT 0, | |
| jobs_inserted INTEGER DEFAULT 0, | |
| jobs_updated INTEGER DEFAULT 0, | |
| status TEXT NOT NULL DEFAULT 'running', -- 'running' | 'success' | 'failed' | |
| error_message TEXT | |
| ); | |
| -- ์ธ๋ฑ์ค | |
| CREATE INDEX IF NOT EXISTS idx_jobs_source ON jobs(source_site, source_id); | |
| CREATE INDEX IF NOT EXISTS idx_jobs_dedup ON jobs(lower(company_name), lower(title)); | |
| CREATE INDEX IF NOT EXISTS idx_jobs_category ON jobs(job_category); | |
| CREATE INDEX IF NOT EXISTS idx_jobs_posted ON jobs(posted_date); | |
| CREATE INDEX IF NOT EXISTS idx_jobs_active ON jobs(is_active); | |
| CREATE INDEX IF NOT EXISTS idx_job_skills_name ON job_skills(skill_name); | |
| CREATE INDEX IF NOT EXISTS idx_job_skills_job ON job_skills(job_id); | |