-- 자막 Phase 1 미출시 초안. 운영 DB 적용/호환성은 확인하지 않았다. -- 실행 전 deployment-gates.md의 엔티티 대조 및 운영 DB 게이트 승인이 필요하다. -- MySQL 8.0.17 이상, utf8mb4_0900_bin(NO PAD), InnoDB 3072-byte 인덱스 지원이 전제다. -- 대소문자와 후행 공백을 보존하여 eventId 및 S3 bucket/key를 정확히 구별한다. -- source_upload_error_at은 최종 JPA의 TIMESTAMP 선언과 초 단위 정밀도를 맞췄다. CREATE TABLE subtitle_job ( job_id VARCHAR(36) NOT NULL COMMENT 'Spring 생성 자막 작업 UUID', content_id BIGINT NOT NULL COMMENT '기존 콘텐츠 Long 식별자', source_bucket VARCHAR(255) NOT NULL COMMENT '최초 등록 원본 S3 버킷', source_key VARCHAR(255) NOT NULL COMMENT '최초 등록 원본 S3 객체 키', output_key VARCHAR(255) NOT NULL COMMENT 'MediaConvert 출력 객체 키의 확장자 제외 경로', status VARCHAR(32) NOT NULL COMMENT '자막 작업 상태', error_code VARCHAR(255) NULL COMMENT '자막 처리 오류 코드', error_message TEXT NULL COMMENT '자막 처리 오류 설명', source_upload_error_code VARCHAR(255) NULL COMMENT '원본 업로드 불확실성 오류 코드', source_upload_error_at TIMESTAMP NULL DEFAULT NULL COMMENT '원본 업로드 오류 기록 시각', created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성 시각', updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정 시각', PRIMARY KEY (job_id), UNIQUE KEY uk_subtitle_job_source (source_bucket, source_key), KEY ix_subtitle_job_content_created (content_id, created_at) ) ENGINE=InnoDB ROW_FORMAT=DYNAMIC DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin COMMENT='원본 binding과 자막 작업 상태 및 오류'; CREATE TABLE subtitle ( id BIGINT NOT NULL AUTO_INCREMENT COMMENT '언어별 자막 결과 Long 식별자', job_id VARCHAR(36) NOT NULL COMMENT '소속 자막 작업 UUID', language VARCHAR(35) NOT NULL COMMENT '자막 언어 태그', format VARCHAR(16) NOT NULL COMMENT '자막 파일 형식', s3_bucket VARCHAR(255) NOT NULL COMMENT '자막 결과 S3 버킷', s3_key VARCHAR(255) NOT NULL COMMENT '자막 결과 S3 객체 키', PRIMARY KEY (id), UNIQUE KEY uk_subtitle_job_language (job_id, language), CONSTRAINT fk_subtitle_job FOREIGN KEY (job_id) REFERENCES subtitle_job (job_id) ) ENGINE=InnoDB ROW_FORMAT=DYNAMIC DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin COMMENT='작업별 언어별 자막 결과'; CREATE TABLE subtitle_callback_receipt ( event_id VARCHAR(255) NOT NULL COMMENT 'callback 중복 방지 이벤트 식별자', job_id VARCHAR(36) NOT NULL COMMENT 'callback 대상 자막 작업 UUID', body_hash VARCHAR(64) NOT NULL COMMENT '원래 HTTP body bytes의 SHA-256 소문자 16진수', created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성 시각', PRIMARY KEY (event_id) ) ENGINE=InnoDB ROW_FORMAT=DYNAMIC DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin COMMENT='callback 이벤트와 원본 요청 본문 해시 수신 기록'; ALTER TABLE content ADD COLUMN latest_subtitle_job_id VARCHAR(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin NULL DEFAULT NULL COMMENT '최신 선택 자막 작업 UUID';