聊天記錄表(messages)
message_id:消息唯一標(biāo)識(主鍵)
sender_id:發(fā)送者ID(關(guān)聯(lián)到用戶表的user_id)
receiver_id:接收者ID(關(guān)聯(lián)到用戶表的user_id,如果是群聊,此處可以是群組ID)
message_type:消息類型(例如:文本、圖片、視頻等)
content:消息內(nèi)容
timestamp:發(fā)送時間
再建一個聊天列表表(用戶id,跟聯(lián)系人id,唯一索引)。
聊天列表表(chat_list)
list_id:聊天列表唯一標(biāo)識(主鍵)
user_id:用戶ID (關(guān)聯(lián)到用戶表的user_id)
contact_id:聯(lián)系人ID(對于單聊,是對方的用戶ID;對于群聊,是群組ID)
last_message_id:最后一條消息的ID 關(guān)聯(lián)到消息表的message_id
unread_count:未讀消息數(shù)
每當(dāng)一個新消息被發(fā)送,你需要執(zhí)行以下操作:
在聊天記錄表messages表中插入新消息記錄時,聊天列表表的邏輯如下:
檢查chat_list表中是否已存在與該消息相關(guān)的記錄(基于user_id和contact_id)。
如果存在,更新該記錄的last_message_id和增加unread_count。
如果不存在,插入一條新記錄到chat_list,并設(shè)置last_message_id和unread_count。
最后查詢列表 就很簡單了。
SELECT cl.user_id, cl.contact_id, cl.unread_count, m.content, m.timestamp
FROM chat_list cl
JOIN messages m ON cl.last_message_id = m.message_id
WHERE cl.user_id = ?
ORDER BY m.timestamp DESC;
chat_list 表中 unread_count
如果2人在時時對話,
發(fā)送人增加未讀count 和 接收人清除未讀count ,
同寫sql
大佬您的是怎么處理的
chat_list 發(fā)消息時創(chuàng)建一條就可以了,
我表達(dá)的是
a-b 對話 a和b都在聊天窗口
a 發(fā)消息時 chat_list 表中的count +1
b 在聊天窗口時,消息已讀,請求清理 count =1 未0 ,a-b這一步的sq count 字段反復(fù)寫入清空
讓a-b時時聊天中如何不產(chǎn)生 chat_list 的重復(fù)寫入優(yōu)化
我在用的方法是點擊進(jìn)對話存入 緩存該用戶對話窗口ID 讓后端判斷
session對話表。
發(fā)送人id與接收人id拼一起,按大小排序。
如無論1發(fā)給2還是2發(fā)給1,記錄的值都是:1_2,這樣就只有一條記錄。
id:1 (自增主鍵)
key:1_2 (兩個人id按大小排序用_連接)
uid1:1 (兩個人中小那個id)
uid2:2 (兩個人中大那個id)
last_message_id:1 (共用,對話最新那條消息id)
last_read_message_id1:0(小id已讀消息id)
last_read_message_id2:1(大id已讀消息id)
unread_count_1:1(小id未讀數(shù)量)
unread_count_2:0(大id未讀數(shù)量)