문제상황
영상데이터, 채널데이터, 추적데이터들을 담고있는 테이블들을 매일 업데이트 해야한다. 그런데 video_id나 channel_id가 PK로 걸려있는 경우도 있고 FK로 걸려있는 경우도 있어 insert에서 에러가 발생한다.
현재는 테이블이 아래와 같은 형태이다. 실제 데이터들을 담고 있는 컬럼은 제외하고 이번 문제의 중요한 id 컬럼들만 넣었다.
데이터는 video -> video_history -> channel -> channel_history와 같은 순서로 수집되는데 문제는 한 번 들어간 video 데이터나 channel 데이터가 업데이트 될 일은 거의 없고, 이에 반해, 추적용 데이터를 갖고있는 video_history
테이블과 channel_history
테이블에는 매일 몇십만건씩 데이터가 추가된다는 것이다.
그럴 경우, 아래의 기존 코드로는 update를 처리할 수 없다.
"INSERT INTO video (video_id, ...) VALUES (%s, ...)"
"INSERT INTO channel (channel_id, ...) VALUES (%s, ...)"
해결 방법
매일 업데이트 되지 않는 데이터들은 수집 하지 않는다 + 데이터에 변화가 있을 경우 update 한다. 로 해결하기로 했다.
우선 각 테이블의 특징들을 잘 알아야 한다.
video
테이블 video_history
테이블 channel
테이블channel_history
테이블video
테이블ON DUPLICATE KEY UPDATE
를 통해 변화가 있는 컬럼을 update 시킨다. channel
테이블ON DUPLICATE KEY UPDATE
를 통해 변화가 있는 컬럼을 update 시킨다. video_history
, channel_history
테이블이렇게, 매일 row가 추가 되는 테이블과 업데이트가 거의 없는 테이블, 업데이트는 없지만 row 추가가 있는 테이블을 모두 성공적으로 DB에 insert 할 수 있게 되었다.