2011-11-12 47 views
14

我想構建一個消息/聊天系統。它可以按時間順序存儲兩個人之間的對話。同樣,如果用戶A刪除對話,用戶B仍然應該訪問對話,直到他希望刪除它們。用於存儲人與人之間的聊天消息的數據庫設計

  1. 收件箱 - 用戶從各個用戶收到的所有消息都將顯示來自該特定線程的最新消息。

  2. 對話屏幕 - 在用戶A和用戶B

這是數據庫我已經想出的基本結構之間的對話的時間順序。我應該在數據庫中存儲兩次消息嗎?

  1. ID
  2. to_id
  3. from_id
  4. 消息
  5. 時間戳
  6. 閱讀
+0

我不明白爲什麼人們會給我一個投票的問題:( –

回答

7

我會用一個查找表,將儲存誰的權利,如果用戶刪除自己的信息,他們實際上只是刪除了該消息的關係不是以查看該消息

table->message     | table->messageUsers 
id->0, message->'hi', user_id->1  user_id->1, message_id->0 
             user_id->2, message_id->0 

這樣的消息消息本身。你只需從messageUsers表中刪除它們。或設置一個活躍的領域爲1或0.

+0

如果我刪除讓我們說用戶1消息。用戶2將如何知道該消息來自用戶1,而不是用戶3或4? –

+0

我更新了答案。所以你只需要在消息表中存儲'user_id'就是創建消息的用戶的ID。例如,如果message-> user_id = 1,並且在messageUsers中刪除了用戶1讀取該消息的能力,則用戶2仍然會看到該消息以及是誰創建的。 –

+0

這也假設你正在創建一個關係數據庫...希望你是。 –

1

將有兩個表。 節點 node_user

在節點表中,

  • NODE_ID
  • 標題
  • 消息
  • 時間戳

在node_user表,

  • node_user_id(PK)
  • NODE_ID
  • parent_node_id(用於螺紋)
  • from_id
  • to_id
  • 時間戳

當用戶A將消息發送到用戶B首先將消息存儲在節點表中。然後,在node_user表中添加兩條記錄。當用戶A刪除消息時,只刪除node_user表中的第一條記錄。 當用戶B刪除該消息時,可以從節點和node_user表中刪除記錄。

線索化消息,

  • 使用parent_node_id
+0

爲什麼我需要存儲消息三次? –

+0

對不起,我忘了刪除消息列在node_user表中,我將編輯,你不需要存儲消息三次,只需要在節點表中存儲一次,使用node_user表存儲發送者和接收者,如果你稍後添加CC和BCC功能,也可以工作。 –

+0

我修改了我的問題......以清楚地說明我的需求。猜測調用收件箱是不合適的。非常感謝 –

1

起初我認爲,當一個人刪除它,你可能只是轉折的收件人或發件人爲空,這將使你失去誰送的消息或向其發送的人。

您應該只添加一個字段deleted_by,其中將包含刪除它的人的ID或將爲null的字段。因此,從收件箱中選擇記錄,當你有這樣的:

SELECT * FROM消息,其中to_id =本身份識別碼和DELETED_BY <>身份識別碼

當您刪除您檢查消息,如果DELETED_BY爲空,如果是你用MyID更新deleted_by字段,如果不是(意味着另一方也刪除它),則刪除該記錄。

如果您希望線程具有相同的功能而不是消息(即管理對話,而不是一次處理一個消息),則應該有另一個表(MessageThreads),其中有from_id,to_id字段,deleted_by帶有一個thread_id字段。在Messages表中,您使用thread_id替代from_id to_id和deleted_by。

相關問題