interesting  ... my first reaction was that the 2 copies of a message was wrong and would only cause database inconsistencies ... But, after thinking about it, what if one use chose to delete the message on their phone? That certainly shouldn't delete it on the the other user's phone, and you can definitely do that in all other messaging apps ive ever seen, so this is definitely the right way to go about it. I think the message should just belong to a message class the way you've set it up. Something like:

`Message`
`sender_id, receiver_id, text, song, etc. `

Sure it will cause duplicates but that shouldn't be a huge issue. 
Then you can cross the `contact_id` or `user_id` (however you defined it) with the sender_id and receiver_id in the Message table to receive all sent messages and all received messages and then organize them by the id of their conversation partner and the message timestamp. 

I think this is good and you seem to be on the right track here