在MySql表中存储聊天消息

时间:2011-12-02 03:43:05

标签: php mysql chat web

在过去的几周里,我一直在研究基于Web的聊天客户端应用程序,我有一个关于在MySql表中存储聊天消息的问题。我创建了一个名为conversations的表,现在它由5个字段组成;

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

当我测试聊天应用程序时,一切都运行得很好,但问题是每次用户发送内容时,我都会将该值作为新行附加到我的“消息”字段中。在检索消息时,我的sql代码会读取整个内容并将其显示给相应的用户。因此,数据量按添加到消息字段中的文本量线性增加。 我的问题是,有没有办法只选择文本字段中的最后一行,或者是另一种可以减少传输数据量的解决方案。

4 个答案:

答案 0 :(得分:13)

您需要更好的数据库架构 - 更多关系。这样做也会给你一些其他改进(密码保护聊天和多用户聊天来命名一对)

以下是对数据库的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);

答案 1 :(得分:4)

为什么没有这样的表结构:

<强>聊天

  • chatID
  • user1ID
  • user2ID
  • startedDateTime
  • EndedDateTime

<强> chatContent

  • chatContentID
  • chatID
  • 消息
  • 日期时间
  • 状态

这样,您的数据就更容易搜索和整理。例如,如果您想在X时间获得某个消息,该怎么办?或者你想获得具有X状态的所有聊天消息?

将数据分成2个表应该更好更整洁。

答案 2 :(得分:0)

考虑在表格中每行存储一条消息:

id,user1id,user2id,message,status,timestamp

其中id是自动增量列。

答案 3 :(得分:0)

这是另一个模式。我将目的描述如下:

  • 好吧,就像在Facebook上一样。一个用户可以属于多个组,一个组也可以属于多个用户。

enter image description here

  • 在表user_group_chat上,将列user_idgroup_idcreated_at用作主键。 user_id列也是表users的FOREIGN KEY,但DELETE上是CASCADE,而group_id也是表groups的FOREIGN KEY,而DELETE上则是CASCADE太。并将其作为FOREIGN KEY的原因很简单。如果用户或组不存在,也应该消失。
  • 在表user_user_chat上,我也将列from_user_idto_user_idcreated_at用作主键。简而言之,它的行为也与表user_group_chat相同。只是该表负责存储用户与用户之间的聊天。