Badge Backfill Code

Ich untersuche hier den Prozess zum Nachfüllen von Abzeichen:

Insbesondere scheint die folgende Abfrage einige Probleme zu haben (siehe 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

Diese Abfrage führt einen LEFT JOIN durch, sodass alle Ergebnisse aus user_badges zurückgegeben werden, unabhängig davon, ob eine Übereinstimmung vorliegt. Dieser Teil wirkt jedoch sehr verwirrend:

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

Die Abfrage verknüpft Zeilen, bei denen die user_id übereinstimmt, verwirft diese Zeilen aber anschließend über die WHERE-Klausel, was die Verknüpfung dort ziemlich überflüssig macht. Daher frage ich mich:

  1. Was ist der Zweck der Nachfüllfunktion? Sie scheint das zu verarbeitende Abzeichen vollständig zu löschen und dann alles auf einmal neu aufzubauen. Ist das notwendig?

  2. Was ist der Unterschied zwischen einem Abzeichen, das auf Beiträge abzielt, und einem, das dies nicht tut, in Bezug auf diese Funktion? Bei einem LEFT JOIN spielt das beim Finden der richtigen badge_id zum Löschen für den Neuaufbau überhaupt eine Rolle?

3 „Gefällt mir“