2011-12-02 46 views
4

在過去的幾周裏,我一直在研究基於Web的聊天客戶端應用程序,並且有關於將聊天消息存儲在MySql表中的問題。我創建了一個名爲conversations的表格,現在它由5個字段組成;將聊天消息存儲在MySql表中

user1ID,user2ID,messages(mediumtext),status,timestamp。

當我測試聊天應用程序時,一切正常,但問題在於每次用戶發送內容時,我都會將該值作爲新行附加到我的「消息」字段中。當涉及到檢索消息時,我的sql代碼會讀取所有內容並將其顯示給相應的用戶。因此,數據量會隨着添加到消息字段中的文本量而線性增加。 我的問題是,有沒有辦法選擇只從文本字段的最後一行或可能會減少傳輸數據量的另一種解決方案。

+0

你追加的消息到現有的領域唯一的行中一張桌子??? O_O – Nemoden

+0

是的,不幸的是我:) –

回答

11

你需要一個更好的數據庫模式 - 更多的關係。這樣做會給你一些其他的改進(密碼保護聊天和多用戶聊天來命名一對夫婦)

這是一個ERD爲你的分貝。

enter image description here


2016年5月6日編輯 添加與DDL(希望)改善字段類型和名稱

CREATE TABLE user 
(
    user_id CHAR(32), 
    user_login VARCHAR(255), 
    user_password CHAR(64), 
    user_email VARCHAR(400), 
    PRIMARY KEY (user_id) 
); 

CREATE TABLE message 
(
    message_id CHAR(32), 
    message_datetime DATETIME, 
    message_text TEXT, 
    message_chat_id CHAR(32), 
    message_user_id CHAR(32), 
    PRIMARY KEY (message_id) 
); 

CREATE TABLE user_chat 
(
    user_chat_chat_id CHAR(32), 
    user_chat_user_id CHAR(32), 
    PRIMARY KEY (user_chat_chat_id,user_chat_user_id) 
); 

CREATE TABLE chat 
(
    chat_id CHAR(32), 
    chat_topic VARCHAR(32), 
    chat_password CHAR(64), 
    user_chat_user_id CHAR(32), 
    PRIMARY KEY (chat_id) 
); 

CREATE INDEX user_login_idx ON user (user_login); 
ALTER TABLE message ADD FOREIGN KEY message_chat_id_idxfk (message_chat_id) REFERENCES chat (chat_id); 

ALTER TABLE message ADD FOREIGN KEY message_user_id_idxfk (message_user_id) REFERENCES user (user_id); 

ALTER TABLE user_chat ADD FOREIGN KEY user_chat_user_id_idxfk (user_chat_user_id) REFERENCES user (user_id); 

ALTER TABLE chat ADD FOREIGN KEY chat_id_idxfk (chat_id,user_chat_user_id) REFERENCES user_chat (user_chat_chat_id,user_chat_user_id); 
+0

有幾種不同的限制傳輸數據的方法:1.將數據限制爲最後x分鐘。或者2,僅發送自提供給刷新腳本的最後一個日期時間以來的消息數據。 –

+0

哇,這是偉大的肯定看着它感謝很多 –

+0

感謝您接受我的答案。如果需要,可以在這裏提出更多問題:) –

4

爲什麼不能有一個表的結構是這樣的:

聊天

  • chatID
  • user1ID
  • user2ID
  • startedDateTime
  • EndedDateTime

chatContent

  • chatContentID
  • chatID
  • 消息
  • 日期時間
  • 狀態

這樣一來,你的數據更容易搜索和組織。例如,如果你想在X時間聽到特定的消息,該怎麼辦?或者你想獲得所有X狀態的聊天信息?

將數據分成2個表應該更好,更整潔。

+0

非常感謝。我試圖使用最少數量的表和字段,這就是爲什麼我這樣做,但它似乎不是一個好的解決方案 –

+0

這可能是值得更新您的架構,以節省您頭痛的軌道。 – F21

+0

其實你可以得到相同的結果,如果你把表合併成一個。組合表將具有一個Message_id,它是PK和AI,並且還將包含Message_Sent_Timestamp字段,並且由於您具有AI,因此您將能夠知道何時發送了第一條消息,這當然是「startedDateTime」。同樣的事情發生在「EndedDateTime」 - Message_id的最後一行將包含該日期。你需要問自己的問題是:「對於聊天桌是否有重要意義?如果是這樣,聊天中什麼是非常重要的,以至於我需要它成爲一張桌子?」 – OhadM

0

考慮在表中存儲每行一個消息:

ID,user1id,user2id,消息,狀態,時間戳

其中id是一個自動增量列。

相關問題