Spaces:
Running
Running
File size: 3,047 Bytes
76a8b94 220e583 5ffbc31 76a8b94 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | -- 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);
|