cert-study-app / docs /04_database.md
github-actions
Sync from GitHub d2682fe6d3fcffe93aa302c286320962009f6436
9381502
|
Raw
History Blame Contribute Delete
4.52 kB
# 04. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ
## ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐฉ์‹
์ด ํ”„๋กœ์ ํŠธ๋Š” PostgreSQL๊ณผ Chroma๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๋‘ ์ €์žฅ์†Œ๋Š” ๋ชฉ์ ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
| ์ €์žฅ์†Œ | ์—ญํ•  |
| --- | --- |
| PostgreSQL | ๋ฌธ์ œ, ์ •๋‹ต, ํ•ด์„ค, ํ’€์ด ๊ธฐ๋ก์ฒ˜๋Ÿผ ์ •ํ™•ํžˆ ๋ณด๊ด€ํ•ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ ์ €์žฅ |
| Chroma | ์œ ์‚ฌ ๋ฌธ์ œ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ ์ €์žฅ |
## PostgreSQL์„ ์“ฐ๋Š” ์ด์œ 
PostgreSQL์€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ž…๋‹ˆ๋‹ค. ์ •ํ•ด์ง„ ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ , ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์กฐํšŒํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
์ด ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์•„๋ž˜ ๋ฐ์ดํ„ฐ๋ฅผ PostgreSQL์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
- ๋ฌธ์ œ ๋ณธ๋ฌธ
- ๋ณด๊ธฐ
- ์ •๋‹ต
- ํ•ด์„ค
- ๋ฌธ์ œ ์œ ํ˜•
- ์‹œํ—˜๋ช… ๋˜๋Š” ์ถœ์ฒ˜
- ํ’€์ด ๊ธฐ๋ก
- ๊ฐœ๋… ์ •๋ฆฌ
- PDF ์ฒ˜๋ฆฌ ์ž‘์—… ์ƒํƒœ
๋ฌธ์ œํ’€์ด ์›น์—์„œ๋Š” โ€œ์ •๋‹ต์ด ๋ฌด์—‡์ธ์ง€โ€, โ€œ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ‹€๋ ธ๋Š”์ง€โ€ ๊ฐ™์€ ์ •๋ณด๊ฐ€ ์ •ํ™•ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฐ์ดํ„ฐ๋Š” Chroma๋ณด๋‹ค PostgreSQL์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
## ์ฃผ์š” ํ…Œ์ด๋ธ”
ํ˜„์žฌ ๋ชจ๋ธ์€ `cert_study_app/models.py`์— ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
### questions
๋ฌธ์ œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ํ•ต์‹ฌ ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค.
์ฃผ์š” ์ปฌ๋Ÿผ:
- `stem`: ๋ฌธ์ œ ๋ณธ๋ฌธ
- `answer`: ์ •๋‹ต
- `explanation`: ํ•ด์„ค
- `question_type`: ๋ฌธ์ œ ์œ ํ˜•
- `question_number`: ๋ฌธ์ œ ๋ฒˆํ˜ธ
- `source`: ์‹œํ—˜๋ช… ๋˜๋Š” ํŒŒ์ผ ์ถœ์ฒ˜
- `raw_text`: ์›๋ณธ ํŒŒ์‹ฑ ํ…์ŠคํŠธ
- `options_json`: ๋ณด๊ธฐ ๋ฐ์ดํ„ฐ
- `quality_score`: ํŒŒ์‹ฑ ํ’ˆ์งˆ ์ ์ˆ˜
- `quality_status`: ํŒŒ์‹ฑ ํ’ˆ์งˆ ์ƒํƒœ
- `chunk_key`: ์ฒญํ‚น ์‹๋ณ„์ž
PDF ํŒŒ์‹ฑ ๊ฒฐ๊ณผ๊ฐ€ ๋ฌธ์ œ ๋‹จ์œ„๋กœ ์ •๋ฆฌ๋˜๋ฉด ์ด ํ…Œ์ด๋ธ”์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
### attempts
์‚ฌ์šฉ์ž์˜ ํ’€์ด ๊ธฐ๋ก์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
์ฃผ์š” ์ปฌ๋Ÿผ:
- `user_id`: ์‚ฌ์šฉ์ž ์‹๋ณ„์ž
- `question_id`: ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋Š”์ง€
- `chosen`: ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ ๋ฅธ ๋‹ต
- `correct`: ์ •๋‹ต ์—ฌ๋ถ€
- `note_type`: ์˜ค๋‹ต๋…ธํŠธ ๋“ฑ ๋ณต์Šต ์ƒํƒœ
ํ˜„์žฌ๋Š” ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์ด๋ฏ€๋กœ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ํ๋ฆ„์„ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
### concept_notes
๊ฐœ๋… ์ •๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
์ฃผ์š” ์ปฌ๋Ÿผ:
- `concept_name`: ๊ฐœ๋… ์ด๋ฆ„
- `summary`: ๊ฐœ๋… ์š”์•ฝ
- `exam_point`: ์‹œํ—˜์—์„œ ์ค‘์š”ํ•œ ํฌ์ธํŠธ
- `trap_point`: ํ—ท๊ฐˆ๋ฆฌ๊ธฐ ์‰ฌ์šด ํฌ์ธํŠธ
- `keywords`: ๊ด€๋ จ ํ‚ค์›Œ๋“œ
- `source_question_id`: ์–ด๋–ค ๋ฌธ์ œ์—์„œ ๋‚˜์˜จ ๊ฐœ๋…์ธ์ง€
### ingestion_jobs
PDF ์ฒ˜๋ฆฌ ์ž‘์—… ์ƒํƒœ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
์ฃผ์š” ์ปฌ๋Ÿผ:
- `exam_name`: ์‹œํ—˜๋ช…
- `pdf_path`: PDF ๊ฒฝ๋กœ
- `status`: ์ž‘์—… ์ƒํƒœ
- `stage`: ํ˜„์žฌ ์ฒ˜๋ฆฌ ๋‹จ๊ณ„
- `current`, `total`: ์ง„ํ–‰๋ฅ  ๊ณ„์‚ฐ์šฉ ๊ฐ’
- `inserted`: ์ €์žฅ๋œ ๋ฌธ์ œ ์ˆ˜
- `quality_score`: ํ’ˆ์งˆ ์ ์ˆ˜
- `quality_report_json`: ํ’ˆ์งˆ ๋ฆฌํฌํŠธ ๊ฒฝ๋กœ
- `quality_gate_json`: ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ ๊ฒฐ๊ณผ ๊ฒฝ๋กœ
- `error_message`: ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€
์ด ํ…Œ์ด๋ธ” ๋•๋ถ„์— PDF ์ฒ˜๋ฆฌ ํ˜„ํ™ฉ ํ™”๋ฉด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
### azure_docs_syncs
์™ธ๋ถ€ ๋ฌธ์„œ ์ƒ‰์ธ ์ƒํƒœ๋ฅผ ๊ธฐ๋กํ•˜๊ธฐ ์œ„ํ•œ ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค.
์ฃผ์š” ์ปฌ๋Ÿผ:
- `embedding_model`
- `status`
- `urls_checked`
- `documents_indexed`
- `chunks_indexed`
## Chroma๋ฅผ ์“ฐ๋Š” ์ด์œ 
Chroma๋Š” ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ž…๋‹ˆ๋‹ค. ํ…์ŠคํŠธ๋ฅผ ์ˆซ์ž ๋ฒกํ„ฐ๋กœ ๋ฐ”๊พผ ๋’ค, ์˜๋ฏธ๊ฐ€ ๋น„์Šทํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ’€๊ณ  ์žˆ์„ ๋•Œ, Chroma๋ฅผ ์ด์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
- ํ˜„์žฌ ๋ฌธ์ œ์™€ ๋น„์Šทํ•œ ๋ฌธ์ œ ์ฐพ๊ธฐ
- ๊ฐ™์€ ๊ฐœ๋…์„ ๋ฌป๋Š” ๋ฌธ์ œ ์ฐพ๊ธฐ
- ๊ณต์‹ ๋ฌธ์„œ๋‚˜ ์„ค๋ช… ์ž๋ฃŒ์—์„œ ๊ด€๋ จ ๋‚ด์šฉ ์ฐพ๊ธฐ
## PostgreSQL๊ณผ Chroma๋ฅผ ํ•จ๊ป˜ ์“ฐ๋Š” ์ด์œ 
PostgreSQL์€ ์ •ํ™•ํ•œ ์ €์žฅ๊ณผ ์กฐํšŒ์— ๊ฐ•ํ•˜๊ณ , Chroma๋Š” ์˜๋ฏธ ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰์— ๊ฐ•ํ•ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ๋‘ ์ €์žฅ์†Œ๋ฅผ ์ด๋ ‡๊ฒŒ ๋‚˜๋ˆ  ์“ฐ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
- PostgreSQL: ์›๋ณธ ๋ฐ์ดํ„ฐ์˜ ๊ธฐ์ค€ ์ €์žฅ์†Œ
- Chroma: ๊ฒ€์ƒ‰์„ ๋น ๋ฅด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ๋ณด์กฐ ์ƒ‰์ธ
์ฆ‰, Chroma๋Š” PostgreSQL์„ ๋Œ€์ฒดํ•˜๋Š” ์ €์žฅ์†Œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. Chroma ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋Š” ๋‹ค์‹œ PostgreSQL์˜ ๋ฌธ์ œ ID์™€ ์—ฐ๊ฒฐ๋˜์–ด ์‹ค์ œ ๋ฌธ์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐฉ์‹์ด ์ข‹์Šต๋‹ˆ๋‹ค.
## SQLite์— ๋Œ€ํ•œ ์ •๋ฆฌ
ํ˜„์žฌ ํ”„๋กœ์ ํŠธ๋Š” PostgreSQL ์‚ฌ์šฉ์„ ๊ธฐ๋ณธ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
SQLite๋Š” ๊ฐœ๋ฐœ ์ดˆ๊ธฐ์— ๊ฐ„๋‹จํžˆ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์ข‹์ง€๋งŒ, Docker Compose์™€ Airflow๊นŒ์ง€ ํ•จ๊ป˜ ์“ฐ๋Š” ๊ตฌ์กฐ์—์„œ๋Š” PostgreSQL์„ ๊ธฐ์ค€์œผ๋กœ ๋งž์ถ”๋Š” ํŽธ์ด ๋” ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค.
ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ `CERT_STUDY_DB_FALLBACK=1`๋กœ SQLite fallback์„ ํ—ˆ์šฉํ•˜๋Š” ๋ฐฉํ–ฅ์ด ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.