Итак, что вам нужно. Предполагается, что у вас есть табицы user и group.
Таблица со списом чатов
chat
id - идентификатор чата
name - название чата (тема обсуждения)
user_id - идентификатор пользователя, который создал чат (необязательно)
Список участников чата
roster
chat_id - идентификатор чата
user_id - идентификатор пользователя
group_id - ид группы, если пользователь пишет от имени группы или NULL, если от пользователя (можно даже держать 2 записи, где group_id = null и где нет)
Список сообщений
messages
id - идентификатор сообщения
chat_id - идентификатор чата
user_id - ид пользователя
group_id - ид группы, если сообщение отправлено от имени группы или NULL, если от пользователя
text - текст сообщения
Статусы сообщений
message_status
message_id - идентификатор сообщения
user_id - идентификатор пользователя
read - прочтено или нет
notified - отправлено уведомление о сообщении или нет
Итак, как это работает.
Круг, в котором общаются пользователи называется чатом (chat).
Кто находится в чате определяется через ростер (roster). Ростер может не быть показан в интерфейсе.
Кто кого приглашает в чат определяется через бизнес-логику приложения.
В данной схеме сценарий "Пользователь2 пишет в Группа1" выглядит так.
Создается чат, далее в ростер добавляются П2 и Г1. Далее просто создается сообщение от имени П2. Через бизнес-логику находится владелец Г1 и ему отправляется уведомление.