2011-12-02 47 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是一个自动增量列。

相关问题