Потенційна проблема - це ефективність, але у вас ще немає проблеми з продуктивністю. Ви можете зробити багато речей, залежно від вибору бази даних, щоб вирішити цю проблему у рішенні №1: індексація, апаратне забезпечення, кешування тощо. Все це залежить від того, наскільки часто користувачеві потрібно отримувати поточну кількість непрочитаних повідомлень. Для багатьох з цих варіантів не потрібне спеціальне кодування з боку програми, тому ви можете реалізувати їх із зміною коду або дуже мало. Це полегшує зростання за допомогою програми.
Після того, як користувач підключається / входить в систему, отримання рахунку з бази даних один раз не так вже й погано. Чи буде у вашому додатку постійно оновлюватися список повідомлень, як-от електронна пошта? Звідси отримання непрочитаних даних не потребує чергової поїздки в базу даних, а для отримання нових повідомлень все одно піде поїздка.
Вирушаючи в db щоразу, коли читається повідомлення, щоб позначити IsRead? поля достатньо без перерахунку іншого поля.
З рішенням №2 (ведення рахунку в полі / на диску), чи буде вам потрібна процедура, щоб періодично перебудовувати / переглядати це поле, коли виникає проблема? І проблеми завжди є. Чи збираєтесь ви все це загорнути в транзакцію? Кожен раз, коли хтось надсилає комусь іншому повідомлення, це може бути невдалим, оскільки він не може оновити UnreadCount отримувача через блокування таблиці користувача? Або збираєтесь створити окрему таблицю для цього поля?