在过去的几周里,我一直在研究基于Web的聊天客户端应用程序,我有一个关于在MySql表中存储聊天消息的问题。我创建了一个名为conversations的表,现在它由5个字段组成;
user1ID,user2ID,messages(mediumtext),status,timestamp。
当我测试聊天应用程序时,一切都运行得很好,但问题是每次用户发送内容时,我都会将该值作为新行附加到我的“消息”字段中。在检索消息时,我的sql代码会读取整个内容并将其显示给相应的用户。因此,数据量按添加到消息字段中的文本量线性增加。 我的问题是,有没有办法只选择文本字段中的最后一行,或者是另一种可以减少传输数据量的解决方案。
答案 0 :(得分:13)
您需要更好的数据库架构 - 更多关系。这样做也会给你一些其他改进(密码保护聊天和多用户聊天来命名一对)
以下是对数据库的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 :(得分:4)
为什么没有这样的表结构:
<强>聊天强>
<强> chatContent 强>
这样,您的数据就更容易搜索和整理。例如,如果您想在X时间获得某个消息,该怎么办?或者你想获得具有X状态的所有聊天消息?
将数据分成2个表应该更好更整洁。
答案 2 :(得分:0)
考虑在表格中每行存储一条消息:
id,user1id,user2id,message,status,timestamp
其中id是自动增量列。
答案 3 :(得分:0)
这是另一个模式。我将目的描述如下:
user_group_chat
上,将列user_id
,group_id
和created_at
用作主键。 user_id
列也是表users
的FOREIGN KEY,但DELETE上是CASCADE,而group_id
也是表groups
的FOREIGN KEY,而DELETE上则是CASCADE太。并将其作为FOREIGN KEY的原因很简单。如果用户或组不存在,也应该消失。user_user_chat
上,我也将列from_user_id
,to_user_id
和created_at
用作主键。简而言之,它的行为也与表user_group_chat
相同。只是该表负责存储用户与用户之间的聊天。