2017-07-30 48 views
0

我目前正在使用NodeJS,AngularJS,MySQL和Socket.IO在兩個用戶之間進行私聊。我想以某種方式保存聊天記錄,以便您不僅可以看到正在通過Socket.IO傳輸的新聊天記錄,還會看到您在當前會話之前編寫的消息。如何正確存儲兩個用戶之間的聊天

如何在服務器上正確存儲以前的聊天記錄?

+0

...通過在數據庫表中創建記錄?你目前卡在哪裏?你需要桌子設計方面的幫助,還是其他什麼?另外,如果這只是一個數據庫問題,則無需使用Angular和Node進行標記。 –

+0

這是一個非常廣泛的主題,「正確」的定義非常模糊。你有沒有嘗試過某種東西,或者你是否完全在開始? –

+0

我想過創建一個表「消息」,只是插入每條消息,但我認爲,如果你有很多消息,它會變得非常快 – daG

回答

1

通常的方式做到這一點是:

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中進行緩存。

相關問題