Кажется, что между сообщениями и получателями существует отношение многие ко многим. Поэтому я бы выделил это в таблицу соединений; вы также можете поставить флаг «чтение» в эту таблицу соединений.
Это даст вам что-то вроде:
MESSAGE TABLE
- thread_id
- message_id
- subject
- content
- date_sent
- from (FK to user_id)
MESSAGE_RECIPIENT TABLE
- message_id (FK)
- recipient (FK to user_id)
- read (boolean)
Ваше требование показывать только одно непрочитанное сообщение для потока - это проблема с отображением, и я бы не пустил его в базу данных. В вашем коде переднего плана у вас должна быть логика, показывающая меньшее из действительного числа непрочитанных сообщений и 1 при расчете количества непрочитанных сообщений для отображения.
Чтобы найти всех получателей сообщения (чтобы вы могли «ответить всем»), вам необходимо присоединиться к таблице MESSAGE_RECIPIENT следующим образом:
select u.email_address
from users u,
message m,
message_recipient mr
where u.user_id = mr.recipient
and mr.message_id = m.message_id
and m.message_id = $whateverYourCurrentMessageIDis
(извинения за синтаксис архаичного объединения)