Tenho a seguinte estrutura de tabelas:
messages, contacts e chats.
Ao começar conversar com um contato automaticamente é criado um chat (pra salvar algumas informações relevantes, como por exemplo o unread_count) vinculado ao contato e a cada mensagem enviada pro contato ou recebida dele é salvo na tabela messages.
Quantas mensagens ficam salvas no banco de dados?
Todas as mensagens enviadas/recebidas.
Fica salvo todo o histórico da conversa ou somente as mensagens não lidas?
Todo o histórico.
Como você salva as mensagens? (Qual é a estrutura?)
Mencionei no começo, embora eu acredite que seja irrelevante nesse caso pois as notificações de mensagens não lidas chegam por um evento de socket de um sistema terceiro e tudo é armazenado na tabela chat, não messages.