El problema potencial es el rendimiento y todavía no tiene un problema de rendimiento. Hay muchas cosas que puede hacer dependiendo de la base de datos elegida para manejar esto en la solución # 1: indexación, hardware, almacenamiento en caché, etc. Todo esto depende de la frecuencia con la que el usuario necesita obtener un recuento actual de mensajes no leídos. Muchas de estas opciones no requieren codificación personalizada en el lado de la aplicación, por lo que puede implementarlas con un cambio de código o muy poco. Facilita el crecimiento con la aplicación.
Una vez que un usuario se conecta / inicia sesión, obtener el recuento de la base de datos una vez no es tan malo. ¿Su aplicación mantendrá una lista de mensajes en constante actualización como el correo electrónico? Obtener un recuento no leído desde aquí no requiere otro viaje a la base de datos y para recibir nuevos mensajes de todos modos se va a realizar un viaje de db.
¿Ir a la base de datos cada vez que se lee un mensaje para marcar el IsRead? campo es suficiente sin un nuevo cálculo de otro campo.
Con la solución # 2 (mantener un recuento en un campo / en el disco), ¿necesitará una rutina para reconstruir / recalcular periódicamente este campo cuando haya un problema? Y siempre hay problemas. ¿Vas a envolver todo esto en una transacción? ¿Cada vez que alguien le envía a alguien más un mensaje, puede fallar porque no puede actualizar el UnreadCount del usuario receptor debido a un bloqueo de la tabla de usuarios? ¿O va a crear una tabla separada para este campo?