【问题标题】:Storing chat messages inside a MySql table在 MySql 表中存储聊天消息
【发布时间】:2012-01-11 04:46:30
【问题描述】:

在过去的几周里,我一直在开发一个基于 Web 的聊天客户端应用程序,并且我有一个关于在 MySql 表中存储聊天消息的问题。我创建了一个名为会话的表,现在它包含 5 个字段;

user1ID、user2ID、消息(mediumtext)、状态、时间戳。

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

【问题讨论】:

  • 您是否将消息附加到表中唯一行中的现有字段? O_O

标签: php mysql chat web


【解决方案1】:

您需要更好的数据库架构 - 更具关系性。这样做还会为您带来一些其他改进(密码保护聊天和多用户聊天)

这是您的数据库的 ERD。


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. 将数据限制在最后 x 分钟内。或者 2,仅发送自您提供给刷新脚本的最后一个日期时间以来的消息数据。
  • 感谢您接受我的回答。如果您需要,请在此处提出更多问题。 :)
  • @TimG 也许您已经对此聊天模式有一组查询?这将非常有用。
  • @DmytroMedvid - 完成。我用我希望的改进稍微更新了架构。 DDL 在 mySQL 中应该可以正常工作
【解决方案2】:

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

聊天

  • 聊天ID
  • user1ID
  • user2ID
  • 开始日期时间
  • 结束日期时间

聊天内容

  • 聊天内容ID
  • 聊天ID
  • 留言
  • 日期时间
  • 状态

这样,您的数据更易于搜索和组织。例如,如果您想在 X 时间说出某条消息怎么办?或者您想获取所有带有 X 状态的聊天消息?

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

【讨论】:

  • 非常感谢。我试图使用最少数量的表和字段,这就是我这样做的原因,但这似乎不是一个好的解决方案
  • 可能值得更新您的架构以节省您的麻烦。
  • 实际上,如果将表格合二为一,您可以获得相同的结果。组合表将有一个 Message_id,它是 PK 和 AI,并且还将包含一个 Message_Sent_Timestamp 字段,由于您有一个 AI,您将能够知道第一条消息是何时发送的,这当然是“startedDateTime”。 “EndedDateTime”也是如此——Message_id 的最后一行将包含该日期。您需要问自己的问题是“聊天桌是否有重要意义?如果有,那么在聊天中什么重要到我需要它成为一张桌子?”
【解决方案3】:

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

id、user1id、user2id、消息、状态、时间戳

其中 id 是一个自增列。

【讨论】:

    猜你喜欢
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 2017-10-20
    • 2018-09-30
    相关资源
    最近更新 更多