我目前正在使用NodeJS,AngularJS,MySQL和Socket.IO在兩個用戶之間進行私聊。我想以某種方式保存聊天記錄,以便您不僅可以看到正在通過Socket.IO傳輸的新聊天記錄,還會看到您在當前會話之前編寫的消息。如何正確存儲兩個用戶之間的聊天
如何在服務器上正確存儲以前的聊天記錄?
我目前正在使用NodeJS,AngularJS,MySQL和Socket.IO在兩個用戶之間進行私聊。我想以某種方式保存聊天記錄,以便您不僅可以看到正在通過Socket.IO傳輸的新聊天記錄,還會看到您在當前會話之前編寫的消息。如何正確存儲兩個用戶之間的聊天
如何在服務器上正確存儲以前的聊天記錄?
通常的方式做到這一點是:
Table messages:
message_id PRIMARY KEY
sender_id FOREIGN KEY
recipient_id FOREIGN KEY
Index on (sender_id, recipient_id, message_id)
Index on (recipient_id, sender_id, message_id)
但是,這種結構有一個問題:有沒有簡單的方法來有效的,因爲你有什麼最後N個消息由「ID DESC」排序在你的WHERE像「WHERE sender_id = ... OR recipient_id = ...」,這將使最後兩個索引(這是用於快速排序)有點沒用。
更智能的結構是這樣的:
Table chatrooms:
chatroom_id PRIMARY KEY
Table chatrooms_users
chatroom_id FOREIGN KEY
user_id FOREIGN KEY
現在,當兩個用戶(或更多)要開始一起聊天,你可以創建或從該表中重用一個聊天室,然後將相關行成chatroom_users將聊天室鏈接到其活動會員。這應該在用戶加入/離開聊天室時更新。
如果對話只涉及兩個用戶(從不超過兩個),那麼你可以使用一個簡單的結構:
Table conversations
conversation_id PK
first_user_id FOREIGN KEY
second_user_id FOREIGN KEY
反正。整個想法是爲我們兩個用戶之間的對話或聊天室提供唯一的標識符。然後,消息表變得簡單了很多:
Table messages:
message_id PK
chatroom_id (or conversation_id) FK
sender_id FK
Index on (chatroom_id, message_id)
在這種情況下,要注意的是,最後一個索引優化此:
SELECT * FROM messages WHERE chatroom_id=constant ORDER BY id DESC LIMIT 10
因此,當用戶與其他用戶打開聊天窗口,你可以通過索引查找輕鬆找到conversation_id(或chatroom_id),並快速列出最後的消息,也可以使用索引查找,而無需任何排序。
應該修剪舊消息並將其移動到歸檔表中,以使消息表保持較小且可在RAM中進行緩存。
...通過在數據庫表中創建記錄?你目前卡在哪裏?你需要桌子設計方面的幫助,還是其他什麼?另外,如果這只是一個數據庫問題,則無需使用Angular和Node進行標記。 –
這是一個非常廣泛的主題,「正確」的定義非常模糊。你有沒有嘗試過某種東西,或者你是否完全在開始? –
我想過創建一個表「消息」,只是插入每條消息,但我認爲,如果你有很多消息,它會變得非常快 – daG