-- 노트 링크 테이블 생성 -- 노트 문서 간 또는 노트-문서 간 링크를 관리하는 테이블 CREATE TABLE IF NOT EXISTS note_links ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), -- 링크 출발점 (노트 또는 문서 중 하나) source_note_id UUID REFERENCES notes_documents(id) ON DELETE CASCADE, source_document_id UUID REFERENCES documents(id) ON DELETE CASCADE, -- 링크 도착점 (노트 또는 문서 중 하나) target_note_id UUID REFERENCES notes_documents(id) ON DELETE CASCADE, target_document_id UUID REFERENCES documents(id) ON DELETE CASCADE, -- 출발점 텍스트 정보 selected_text TEXT NOT NULL, start_offset INTEGER NOT NULL, end_offset INTEGER NOT NULL, -- 도착점 텍스트 정보 (선택사항) target_text TEXT, target_start_offset INTEGER, target_end_offset INTEGER, -- 링크 메타데이터 link_text VARCHAR(500), description TEXT, link_type VARCHAR(20) DEFAULT 'note' NOT NULL, -- 생성자 및 시간 정보 created_by UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE, -- 제약 조건 CONSTRAINT note_links_source_check CHECK ( (source_note_id IS NOT NULL AND source_document_id IS NULL) OR (source_note_id IS NULL AND source_document_id IS NOT NULL) ), CONSTRAINT note_links_target_check CHECK ( (target_note_id IS NOT NULL AND target_document_id IS NULL) OR (target_note_id IS NULL AND target_document_id IS NOT NULL) ) ); -- 인덱스 생성 CREATE INDEX IF NOT EXISTS idx_note_links_source_note ON note_links(source_note_id); CREATE INDEX IF NOT EXISTS idx_note_links_source_document ON note_links(source_document_id); CREATE INDEX IF NOT EXISTS idx_note_links_target_note ON note_links(target_note_id); CREATE INDEX IF NOT EXISTS idx_note_links_target_document ON note_links(target_document_id); CREATE INDEX IF NOT EXISTS idx_note_links_created_by ON note_links(created_by); CREATE INDEX IF NOT EXISTS idx_note_links_created_at ON note_links(created_at); -- updated_at 자동 업데이트 트리거 CREATE OR REPLACE FUNCTION update_note_links_updated_at() RETURNS TRIGGER AS $$ BEGIN NEW.updated_at = NOW(); RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER trigger_note_links_updated_at BEFORE UPDATE ON note_links FOR EACH ROW EXECUTE FUNCTION update_note_links_updated_at(); -- 코멘트 추가 COMMENT ON TABLE note_links IS '노트 문서 간 링크 관리 테이블'; COMMENT ON COLUMN note_links.source_note_id IS '출발점 노트 ID (노트에서 시작하는 링크)'; COMMENT ON COLUMN note_links.source_document_id IS '출발점 문서 ID (문서에서 시작하는 링크)'; COMMENT ON COLUMN note_links.target_note_id IS '도착점 노트 ID'; COMMENT ON COLUMN note_links.target_document_id IS '도착점 문서 ID'; COMMENT ON COLUMN note_links.link_type IS '링크 타입: note, document, text_fragment';