Ja bym zrobil tak:
Message:
MessageId
Title
Description
CreatedAt
ReadAt
MessageStatus:
MessageStatusId
MessageId
UserId
DirectoryId
Wyslanie wiadomosci:
1) Tworzysz rekord Message, wypelniasz odpowiednie pola, ReadAt moze byc np. null
2) Tworzysz dwa rekordy MessageStatus:
Dla wysylajacego:
jego UserId, DirectoryId na rekord slownika Directories z 'Sent'
Dla odbierajacego:
UserId - id odbiorcy, DirectoryId - 'Inbox'
Gdy odbiorca otworzy wiadomosc (i wiadomosc nie jest w DirectoryId - 'Sent'):
1) Odswiezasz rekord z MessageId wpisujac do pola ReadAt aktualna date
Usuniecie wiadomosci:
1) Sprawdzasz czy dla kazdego MessageStatus z tym samym MessageId DirectoryId wskazuje na 'Deleted' (nie 'Trash', tam sobie wiadomosci moga lezec)
Dzieki temu rozwiazaniu uzytkownicy maja niezalezna kontrole nad wiadomoscia. Rowniez mozna wysylac wiadomosci
do wielu uzytkownikow na raz, oszczedzajac miejsce w bazie danych.
Tabela MessageStatus nie musi zawierac MessageStatusId, poniewaz mozna uznac ze MessageId + UserId bedzie zawsze unikalne.
Ale to kwestia gustu.
edit:
Dla wygody mozesz potem sobie stworzyc widok w postaci
Message + MessageStatus zlaczony po MessageId
edit:
Oczywiscie nie bedzie informacji o nadawcy i odbiorcy, ale to kwestia komplikacji widoku troche

Ale to niech ktos sie pomeczy bo ja spadam do domu