Есть роль А И B. Только роль A может начать чат с ролью B
Роли у пользователей заданы на уровне учетной записи и не меняются от чата к чату или определяются в момент создания чата?
То есть при создании чата будут определена роль администратора (создателя) которая будет более привилегирована, чем тот, кому он пишет?
Чат может содержать только 2х лиц
Вы очень оптимистичны, выставляя такое ограничение. В следующей итерации разработки вам захочется сделать функционал группового чата. Тогда наличие колонок user_id, second_user_id вам встанет боком.
В таблицу chat лучше добавить такие колонки:
id - идент. чата
date_create - дата создания
id_user_creator - кто создал чат
title - название чата (в этой итерации разработки можно не вставлять)
Для участников чата лучше предусмотреть таблицу chat_participant:
id - идент. участника
id_chat - идент. чата из таблицы chat
id_role - роль в чате (если она определяется в момент создания, для группового чата)
id_user - пользователь чата
id_last_read_message - идент. последнего прочитанного сообщения (самый простой вариант, как отмечать что прочитано, и потом определять, есть ли новые сообщения)
date_include - дата вступления в чат (для группового чата)
date_exclude - дата исключения из чата (для группового чата)
Для сообщений чата - таблица chat_message:
id - id сообщения
id_partic/id_user - автор сообщения (можно реализовать как по ключу от таблицы участника, так и по таблице пользователей)
date_create - дата создания сообщения
date_update - дата обновления сообщения (для продвинутого функционала редактирования сообщений)
date_delete - дата удаления сообщения (для продвинутого функционала редактирования сообщений)
text_message - текст сообщения
Если совсем хотите быть продвинуты в функционале редактирования сообщений, то вы захотите хранить историю изменения сообщений в таблице chat_message_history:
id - идент. истории
id_next - указатель на следующую запись истории
id_message - идент. сообщения
date_change - дата изменения сообщения
id_user/id_partic - кто изменил
text_message - состояние текста сообщения