El problema potencial es el rendimiento y aún no tiene un problema de rendimiento. Hay muchas cosas que puede hacer dependiendo de la base de datos de elección 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 una codificación personalizada en el lado de la aplicación, por lo que puede implementarlas con un cambio de código o muy poco. Hace que sea más fácil crecer 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 constantemente actualizada de mensajes como el correo electrónico? Obtener un recuento no leído desde aquí no requiere otro viaje a la base de datos y, de todos modos, obtener nuevos mensajes va a hacer un viaje de db.
¿Viaja 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 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 un mensaje a otra persona, podría fallar porque no puede actualizar el UnreadCount del usuario receptor debido a un bloqueo de la tabla Usuario. ¿O va a crear una tabla separada para este campo?