feat(study): related-types DB 캐시 — HNSW 매번 재계산 제거
- migrations 220/221: study_questions 에 related_repeat/similar JSONB + 카운트/grade/computed_at/threshold_version + partial idx - 임베딩 워커: ready 처리 직후 같은 트랜잭션에서 related 계산·저장 + 같은 토픽 ready 행들의 related_computed_at=NULL invalidation - 신규 cron study_q_related_refresh (1분, batch=20) — stale 캐시 일괄 재계산 - API list_related_types: cache hit (computed_at + threshold version 일치) 시 SELECT 1번으로 응답. miss 면 즉시 계산+저장 후 응답 - update_question PATCH: 본문/exam_round 변경 시 related_computed_at=NULL - soft delete: 같은 토픽 ready 행 invalidation threshold 변경 시: related_types.THRESHOLD_VERSION 갱신 + UPDATE WHERE version != '<신>' SET computed_at=NULL 한 번이면 cron 자동 일괄 재계산. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
-- 220_study_q_related_cache.sql
|
||||
-- PR-12-A 후속: study_questions 에 related-types 결과 영속 캐시.
|
||||
-- 매 진입마다 HNSW cosine 검색 반복하던 비용을 1회 계산 + 영속 저장으로 전환.
|
||||
--
|
||||
-- 임베딩 워커가 ready 처리 후 같은 트랜잭션에서 채움. 같은 topic 다른 문제가
|
||||
-- ready 가 되면 invalidation 으로 related_computed_at = NULL 마킹 → cron 재계산.
|
||||
--
|
||||
-- 컬럼:
|
||||
-- related_repeat / related_similar JSONB — [{id, sim, exam_round, exam_question_number, subject, scope, qtext}]
|
||||
-- related_repeat_round_count / related_similar_round_count INTEGER — 회차 distinct 수
|
||||
-- related_repeat_grade VARCHAR(50) — 단골/잘 나오는 반복 출제/반복 출제/신출/빈출 (또는 NULL)
|
||||
-- related_computed_at TIMESTAMPTZ — NULL = stale, 다음 cron 재계산 대상
|
||||
-- related_threshold_version VARCHAR(20) — 'v1_0.95_0.85' 같은 임계값 fingerprint
|
||||
|
||||
ALTER TABLE study_questions
|
||||
ADD COLUMN IF NOT EXISTS related_repeat JSONB,
|
||||
ADD COLUMN IF NOT EXISTS related_similar JSONB,
|
||||
ADD COLUMN IF NOT EXISTS related_repeat_round_count INTEGER,
|
||||
ADD COLUMN IF NOT EXISTS related_similar_round_count INTEGER,
|
||||
ADD COLUMN IF NOT EXISTS related_repeat_grade VARCHAR(50),
|
||||
ADD COLUMN IF NOT EXISTS related_computed_at TIMESTAMPTZ,
|
||||
ADD COLUMN IF NOT EXISTS related_threshold_version VARCHAR(20);
|
||||
Reference in New Issue
Block a user