Actions
새기능 #525
open[데이터/스키마] song UNIQUE(song_name) 동명이곡 병합 해소 — (song_name, artist) 복합키
Status:
해결
Priority:
보통
Assignee:
-
Start date:
06/27/2026
Due date:
% Done:
100%
Estimated time:
Description
#519에서 분리(스키마 마이그레이션, Design-First 필요).
문제¶
song.song_name이 UNIQUE라 동명이곡(예: 'Hello','Stay','그날')이 단일 song.id로 병합됨. 장르/ENGLISH_TITLE/가사가 song_id 기준이라 무관한 곡끼리 공유되고, findSong/findSongByName이 서로 다른 곡의 차트 이력을 합침. 적재 스크립트가 song NOT IN (SELECT song_name FROM song)로 삽입(load_*/reload_billboard).
방향(설계 필요)¶
- song 식별을 (정규화 song_name, artist) 복합 또는 별도 정규화키로 변경.
- 기존 데이터 마이그레이션(병합행 분리, FK 재매핑) — #524 수준 위험, 신중한 설계·검증 필요.
- Design-First: 설계서 작성 후 구현. [AI 등록]
Updated by joungmin ko about 2 months ago
- Status changed from 신규 to 해결
- % Done changed from 0 to 100
구현 완료(커밋 3073c7a). 설계 리뷰(REJECT) must-fix M1~M5 반영 후 마이그레이션 실행.
- scripts/migrate_525_song_composite_key.py: 단일 트랜잭션 + 검증 게이트 + 백업(*_bak_525). 전-참조 universe(7테이블)로 충돌 7,254 song 분리 → 신규 11,818행, song_id 재매핑(BB 46,345/Melon 13,609/SA 10,747/lyrics 26/favorites 4), SA reconcile 5,280.
- 검증 게이트 PASS: 재귀속 불일치 0, 충돌 0, dangling FK 0, 복합중복 0, 행수 정합 → 커밋. UNIQUE(song_name)→UNIQUE(song_name,artist_id) 교체.
- forward-fix(M4): 적재 4스크립트 (song_name,artist) 키.
라이브 검증: 'Stay' 아티스트별 분리, /songByName 아티스트별 결과, /artist·/list 정상.
백업·song_split_map 보존(롤백/딥링크 호환). 후속: 분리행 genre/english_title 재도출 → #528. [AI 조치]
Actions