o2o-castad-backend/docs/database-schema/migration_add_dashboard.sql

78 lines
2.9 KiB
SQL

-- ===================================================================
-- dashboard 테이블 생성 마이그레이션
-- 채널별 영상 업로드 기록을 저장하는 테이블
-- SocialUpload.social_account_id는 재연동 시 변경되므로,
-- 채널 ID(platform_user_id) 기준으로 안정적인 영상 필터링을 제공합니다.
-- 생성일: 2026-02-24
-- ===================================================================
-- dashboard 테이블 생성
CREATE TABLE IF NOT EXISTS dashboard (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '고유 식별자',
-- 관계 필드
user_uuid VARCHAR(36) NOT NULL COMMENT '사용자 UUID (user.user_uuid 참조)',
-- 플랫폼 정보
platform VARCHAR(20) NOT NULL COMMENT '플랫폼 (youtube, instagram)',
platform_user_id VARCHAR(100) NOT NULL COMMENT '채널 ID (재연동 후에도 불변)',
-- 플랫폼 결과
platform_video_id VARCHAR(100) NOT NULL COMMENT '플랫폼에서 부여한 영상 ID',
platform_url VARCHAR(500) NULL COMMENT '플랫폼에서의 영상 URL',
-- 메타데이터
title VARCHAR(200) NOT NULL COMMENT '영상 제목',
-- 시간 정보
uploaded_at DATETIME NOT NULL COMMENT 'SocialUpload 완료 시각 (정렬 기준)',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '레코드 생성 시각',
-- 외래키 제약조건
CONSTRAINT fk_dashboard_user FOREIGN KEY (user_uuid) REFERENCES user(user_uuid) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='채널별 영상 업로드 기록 테이블 (대시보드 통계 기준)';
-- 유니크 인덱스 (동일 채널에 동일 영상 중복 삽입 방지)
CREATE UNIQUE INDEX uq_vcu_video_channel ON dashboard(platform_video_id, platform_user_id);
-- 복합 인덱스 (사용자별 채널 필터링)
CREATE INDEX idx_vcu_user_platform ON dashboard(user_uuid, platform_user_id);
-- 인덱스 (날짜 범위 조회)
CREATE INDEX idx_vcu_uploaded_at ON dashboard(uploaded_at);
-- ===================================================================
-- 기존 데이터 마이그레이션
-- social_upload(status=completed) → dashboard INSERT IGNORE
-- 서버 기동 시 init_dashboard_table()에서 자동 실행됩니다.
-- 아래 쿼리는 수동 실행 시 참고용입니다.
-- ===================================================================
/*
INSERT IGNORE INTO dashboard (
user_uuid,
platform,
platform_user_id,
platform_video_id,
platform_url,
title,
uploaded_at
)
SELECT
su.user_uuid,
su.platform,
sa.platform_user_id,
su.platform_video_id,
su.platform_url,
su.title,
su.uploaded_at
FROM social_upload su
JOIN social_account sa ON su.social_account_id = sa.id
WHERE
su.status = 'completed'
AND su.platform_video_id IS NOT NULL
AND su.uploaded_at IS NOT NULL
AND sa.platform_user_id IS NOT NULL;
*/