基于 AJAX 的聊天的数据库体系结构


database architecture for ajax based chat

首先,我完全知道web-sockets和comet是比AJAX更好的方法,但我试图使我的代码尽可能简单,所以我现在使用AJAX。

上下文

目前,用于获取特定会话消息的PHP代码(使用"cid")嵌入在用户查看消息的页面中。因此,每次刷新页面时才会加载消息。因此,我决定创建一个基于 AJAX 的系统,该系统以设定的间隔(即 5 秒)为我获取消息。

问题所在

作为 AJAX 请求的结果执行的 SQL 代码显然只需要返回当前未显示在屏幕上的消息,否则完整的对话将每 5 秒回显到屏幕上。因此,AJAX 需要一种方法来确定消息是否已经在屏幕上,我认为这需要使用数据库字段来完成,但我不知道如何完成。

当前数据库体系结构

(我会发布一张图片,但我的声誉太低了。

Message_id(主键)、cid(消息也属于哪个对话)、消息、sent_user、receive_user sent_time。

我正在使用没有jQuery的AJAX。

如果message_id是自动增量的,那么如果消息显示,应该可以测试。只需跟踪客户收到的最高message_id即可。(这是假设您每 x 秒发送一次所有消息,而不是一次发送一条消息。

它可以是一个会话变量,或者你可以以某种方式通过 Ajax 将最高 id 返回给客户端,并保留一个保存最高接收message_id的 js 变量,并在 ajax 的请求参数中将其发送回服务器,并在 SQL 查找中使用它。

... where message_id > highest_mid_received and ...

实际上以前这样做过,我想我是通过跟踪客户端上的最高 id 来做到的。如果您通过 Ajax 返回 json,这将使发送消息和 id 变得简单。 我想当我这样做时,我只是使用了一个带有分隔符的字符串,并在 Javascript 中使用了split,即使它现在由于 json 而老式,这也有效。

如果您担心用户意外关闭选项卡并希望他们在打开页面的新选项卡时自动再次获取所有消息,则在客户端上保留变量更有意义。如果这不是问题,或者您肯定希望他们在关闭选项卡并在同一页面上启动新消息后不再收到所有消息,那么在会话中跟踪更有意义。

向表格中添加delivered字段。加载(刷新)页面后,添加一段代码来更新所有记录并将其标记为已交付。这是真的,因为当用户第一次进入聊天时,您提到他/她会收到所有消息。

UPDATE messages SET delivered = 1 WHERE cid = ?

现在,在 ajax 调用期间,您将选择已传递的每条消息 = 0

SELECT * FROM messages WHERE delivered = 0 AND cid = ?
UPDATE messages SET delivered = 1 WHERE delivered = 0 AND cid = ?

然后返回 AJAX 呼叫的选定记录,并将其附加到聊天中。如果SELECT返回空,则表示没有要追加到会话的新消息,并且您无需执行 UPDATE 语句。