fe26aadb27
asyncpg exec_driver_sql 의 prepared statement 제약상 multi-statement 파일은
"cannot insert multiple commands into a prepared statement" 에러로 적용 실패.
규칙: 한 migration = 한 statement (다중 ADD COLUMN 절은 단일 statement 라 허용,
인덱스/CHECK/CREATE TABLE 은 별도 파일).
이전 cee01af 의 211_md_canonical_layer.sql (6 statements) + 212_document_lineage.sql
(3 statements) 을 9 파일로 분할:
211 ALTER TABLE documents ADD COLUMN x13
212 ADD CONSTRAINT documents_md_draft_status_only_ai
213 idx_documents_md_status_pending
214 idx_documents_content_origin
215 idx_documents_md_frontmatter_gin (선제 인덱스)
216 idx_documents_md_draft_status
217 CREATE TABLE document_lineage
218 idx_document_lineage_source
219 idx_document_lineage_derived
dry-run 재검증: 13 cols / 28 doc idx / 4 lineage idx PASS.
계획 변경 없음 — schema 결과 동일, 적용 단위만 분할.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
20 lines
999 B
SQL
20 lines
999 B
SQL
-- 217_document_lineage.sql
|
|
-- Phase 1A: AI 생성 문서가 어느 원본에서 파생됐는지 추적.
|
|
--
|
|
-- 이력 테이블 FK = ON DELETE RESTRICT (feedback_history_table_fk_restrict).
|
|
-- 부모 문서 hard delete 차단, soft delete (documents.deleted_at) 만 허용.
|
|
|
|
CREATE TABLE IF NOT EXISTS 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)
|
|
);
|