# MySQL 추가 마이그레이션 적용 기준

## 적용 순서

1. `migration_v45_from_yellow_v44.sql`
2. `migration_v46_media_saved_flow.sql`
3. `migration_v47_media_stat_hour.sql`

## v45

- 기존 `ig_media`, `ig_media_user_download`를 삭제하거나 변경하지 않는 추가형 구조다.
- 회원, 장치, 그룹, 게시물, 통계, 자산, 대본, 후킹, 연구, 작업, 동기화, 포인트 기본 테이블을 추가한다.

## v46

- 다운로드 시작 경로별 batch/job과 공통 `MEDIA_SAVED` 완료 이벤트를 추가한다.
- 적용 대상 `source_mode`:
  - `MANUAL_SINGLE`
  - `BULK_ALL`
  - `BULK_FILTERED`
  - `TOP_SORTED`
  - `TRANSCRIPT_REQUEST`
- 서버에는 MP4/JPG 원본, 로컬 절대경로, 로컬 상대경로를 저장하지 않는다.
- 서버에는 게시물·자산 식별자, 파일명, 크기, 해시, 완료 시각, 수집자·장치만 저장한다.
- `client_event_id`와 `device_id` 조합으로 재전송 중복을 막는다.

## 실제 서버 적용 전 조건

- DB 백업
- staging 적용
- MySQL 버전 호환성 확인
- 생성 테이블·인덱스·외래키 확인
- `yellow.php` 기존 API 회귀 확인
- v46 수신 API 구현 후 실제 동기화 검증

## v47

- `ig_media`에 조회수 제공 여부와 최신 통계 정렬·UTC 관측 필드를 추가한다.
- `ig_media_stat_hour`에 수집자+shortcode+UTC 1시간 bucket 고유 이력을 저장한다.
- 같은 observed_at 재전송은 sample_count를 증가시키지 않고, 더 최신 관측만 수치와 정렬값을 갱신한다.
- PHP `media_stat_hour_upsert`/`media_stat_hour_list`를 통해서만 로컬과 송수신한다.
- 버전형 1회 migration이다. 운영 서버에 컬럼·테이블이 이미 있으면 재실행하지 않고 `schema_check`로 확인한다.
