Il potenziale problema sono le prestazioni e non hai ancora un problema di prestazioni. Ci sono molte cose che puoi fare a seconda del database scelto per gestirlo nella soluzione n. 1: indicizzazione, hardware, memorizzazione nella cache, ecc. Tutto dipende dalla frequenza con cui l'utente ha bisogno di ottenere un conteggio di messaggi non letti. Molte di queste scelte non richiedono la codifica personalizzata sul lato app, quindi è possibile implementarle con un cambio di codice o molto poco. Rende più facile crescere con l'app.
Una volta che un utente si connette / accede, ottenere il conteggio dal database una volta non è poi così male. La tua app manterrà un elenco di messaggi in costante aggiornamento come la posta elettronica? Ottenere un conteggio non letto da qui non richiede un altro viaggio nel database e per ottenere nuovi messaggi farà comunque un viaggio in db.
Fai un salto nel db ogni volta che un messaggio viene letto per segnalare IsRead? il campo è sufficiente senza ricalcolare un altro campo.
Con la soluzione # 2 (mantenendo un conteggio in un campo / su disco), avrai bisogno di una routine per ricostruire / ricalcolare periodicamente questo campo quando c'è un problema? E ci sono sempre problemi. Hai intenzione di concludere tutto questo in una transazione? Ogni volta che qualcuno invia a qualcun altro un messaggio, potrebbe non riuscire perché non può aggiornare UnreadCount dell'utente destinatario a causa di un blocco della tabella Utente? O stai per creare una tabella separata per questo campo?