배지 백필 코드

여기서 진행 중인 배지 백필(backfill) 과정을 보고 있습니다:

특히 다음 쿼리에 몇 가지 문제가 있는 것 같습니다 (Long-Running Sidekiq Jobs 참고):

    sql = <<~SQL
      DELETE FROM user_badges
        WHERE id IN (
          SELECT ub.id
          FROM user_badges ub
          LEFT JOIN (
            #{badge.query}
          ) q ON q.user_id = ub.user_id
          #{post_clause}
          WHERE ub.badge_id = :id AND q.user_id IS NULL
        )
    SQL

이 쿼리는 LEFT JOIN을 사용하여 매칭이 있든 없든 user_badges의 모든 결과가 반환되도록 하지만, 다음 부분은 매우 혼란스럽습니다:

ON q.user_id = ub.user_id
...
AND q.user_id IS NULL

쿼리는 user_id가 일치하는 행을 조인(join)하지만, WHERE 절을 통해 해당 행을 버리므로 거기서 조인의 의미가 사실상 사라집니다. 그래서 궁금한 점이 있습니다:

  1. 백필 함수의 목적은 무엇인가요? 처리 중인 배지를 완전히 지우고 한 번에 다시 재구성하는 것처럼 보입니다. 이것이 필요한가요?

  2. 이 함수와 관련하여 게시물을 대상으로 하는 배지와 그렇지 않은 배지 사이의 차이는 무엇인가요? LEFT JOIN을 사용하는 경우, 재구성을 위해 지울 올바른 badge_id를 찾는 데 이것이 중요합니까?

3개의 좋아요