Penso che la struttura che hai suggerito (senza il campo "assegnato" come da commenti) funzionerebbe, con l'aggiunta di una tabella aggiuntiva, ad esempio "Submissions_User", contenente un riferimento a user_id e un campo incrementale per il conteggio degli invii. Quindi tutto ciò di cui hai bisogno è un "ascoltatore di eventi" come da questo post e penso che saresti a posto.
MODIFICA:per i badge degli obiettivi, esegui l'ascoltatore dell'evento su ogni invio (solo per l'utente che effettua l'invio del corso) e assegna qualsiasi badge pertinente sul posto. Per i badge basati sul tempo, eseguivo un lavoro CRON ogni notte. Scorri l'elenco completo degli utenti una volta e assegna i badge a seconda dei casi.