cee01af96a
documents 13 신규 컬럼 (md_content/md_frontmatter/md_status/content_origin 포함) + 4 인덱스 + 1 CHECK 제약 + document_lineage 테이블 (FK RESTRICT). 상태값은 모두 TEXT+CHECK (확장 시 enum drop/rebuild 비용 회피). 어떤 워커도 컬럼을 채우지 않음 — 스키마 기반만 깔고 Phase 1B 에서 marker_worker 로 채우기 시작. Plan: ~/.claude/plans/plan-idempotent-sundae.md (round 3 approved) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
30 lines
1.4 KiB
SQL
30 lines
1.4 KiB
SQL
-- 212_document_lineage.sql
|
|
-- Phase 1A: AI 생성 문서가 어느 원본에서 파생됐는지 추적.
|
|
-- Plan: ~/.claude/plans/plan-idempotent-sundae.md (round 3 approved)
|
|
--
|
|
-- 이력 테이블 FK = ON DELETE RESTRICT (feedback_history_table_fk_restrict).
|
|
-- 부모 문서 hard delete 차단, soft delete (documents.deleted_at) 만 허용.
|
|
-- relation_type 도 TEXT+CHECK (확장 시 enum drop/rebuild 비용 회피).
|
|
|
|
CREATE TABLE document_lineage (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
source_document_id BIGINT NOT NULL REFERENCES documents(id) ON DELETE RESTRICT,
|
|
derived_document_id BIGINT NOT NULL REFERENCES documents(id) ON DELETE RESTRICT,
|
|
relation_type TEXT NOT NULL
|
|
CHECK (relation_type IN ('cited','summarized_from','generated_from','revised_from')),
|
|
metadata JSONB NOT NULL DEFAULT '{}'::jsonb,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
CONSTRAINT document_lineage_no_self
|
|
CHECK (source_document_id <> derived_document_id),
|
|
CONSTRAINT document_lineage_uq
|
|
UNIQUE (source_document_id, derived_document_id, relation_type)
|
|
);
|
|
|
|
-- reverse-lookup: '이 문서가 어느 생성문서의 source 였나'
|
|
CREATE INDEX idx_document_lineage_source
|
|
ON document_lineage (source_document_id);
|
|
|
|
-- forward-lookup: '이 생성문서의 source 는 무엇이었나'
|
|
CREATE INDEX idx_document_lineage_derived
|
|
ON document_lineage (derived_document_id);
|