여기서 진행 중인 배지 백필(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 절을 통해 해당 행을 버리므로 거기서 조인의 의미가 사실상 사라집니다. 그래서 궁금한 점이 있습니다:
-
백필 함수의 목적은 무엇인가요? 처리 중인 배지를 완전히 지우고 한 번에 다시 재구성하는 것처럼 보입니다. 이것이 필요한가요?
-
이 함수와 관련하여 게시물을 대상으로 하는 배지와 그렇지 않은 배지 사이의 차이는 무엇인가요? LEFT JOIN을 사용하는 경우, 재구성을 위해 지울 올바른 badge_id를 찾는 데 이것이 중요합니까?