Files
hyungi_document_server/migrations/212_document_lineage.sql
T
Hyungi Ahn cee01af96a feat(canonical): Phase 1A markdown canonical layer schema (211/212)
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>
2026-04-30 01:51:31 +00:00

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);