[MySQL]중복 데이터 처리하기

포동동·2023년 4월 9일
1

[유튜브 프로젝트]

목록 보기
4/13

문제상황

영상데이터, 채널데이터, 추적데이터들을 담고있는 테이블들을 매일 업데이트 해야한다. 그런데 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에 대한 기본 정보들을 담고 있는 테이블.
    • 각 video에 대한 정보가 업데이트 되는 경우는 많지 않지만, 새로운 video가 추가되는 경우가 많다.
  • video_history 테이블
    • video에 대한 추적용 데이터를 담고 있는 테이블.
    • 같은 video에 대한 row가 중복 insert 된다.
  • channel 테이블
    • channel에 대한 기본 정보들을 담고 있는 테이블.
    • 업데이트가 거의 없다.
  • channel_history 테이블
    • channel에 대한 추적용 데이터를 담고 있는 테이블.
    • 같은 channel에 대한 row가 중복 insert 된다.

이와 같은 각각의 특성들이 있어 아래와 같이 코드를 수정했다.
  • video 테이블
    • 기존의 데이터들을 모두 수집하나, ON DUPLICATE KEY UPDATE를 통해 변화가 있는 컬럼을 update 시킨다.
  • channel 테이블
    • channel 크롤링 하는 코드를 삭제하고 업데이트가 되는 컬럼(AI 모델에서 생성)과 channel_id만 수집하고 ON DUPLICATE KEY UPDATE를 통해 변화가 있는 컬럼을 update 시킨다.
  • video_history, channel_history 테이블
    • 기존과 같은 코드

이렇게, 매일 row가 추가 되는 테이블과 업데이트가 거의 없는 테이블, 업데이트는 없지만 row 추가가 있는 테이블을 모두 성공적으로 DB에 insert 할 수 있게 되었다.

profile
완료주의

0개의 댓글