【问题标题】:database architecture for ajax based chat基于 ajax 的聊天的数据库架构
【发布时间】:2015-01-08 16:30:12
【问题描述】:

首先,我完全意识到 web-sockets 和 comet 是比 AJAX 更好的方法,但我正在努力使我的代码尽可能简单,所以我现在使用 AJAX。

上下文

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

问题

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

当前的数据库架构

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

Message_id(主键)、cid(消息也属于哪个会话)、message、send_user、receive_user、send_time。

我正在使用没有 jQuery 的 AJAX。

【问题讨论】:

  • 如果 message_id 是自动增量的,那应该可以测试消息是否显示。只需跟踪客户端收到的最高 message_id 即可。 (这是假设您每 x 秒发送一次所有消息,而不是一次发送一条消息)
  • 你为什么不用jQuery?
  • 这将如何实现?你会设置一个会话变量来存储收到的最高 message_id 吗?
  • 我已将该评论作为更详细的答案。
  • 不,只需在每个请求中发送最新的消息 ID,并让响应包含比该消息更新的消息,以及在过去 10 秒内编辑的消息。然后,通过添加新消息并通过 id 修改现有消息来更新您的 ui。

标签: javascript php ajax


【解决方案1】:

如果 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 而现在它已经过时了,它也可以工作。

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

【讨论】:

    【解决方案2】:

    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语句。

    【讨论】:

    • 起初我考虑过这种方法,但是如果两个用户同时查看对话,一个将看到消息传递=0,然后将传递设置为1,另一个用户将无法查看消息。除非我错过了什么:)
    • 这比它需要的数据库更密集。
    猜你喜欢
    • 2016-04-27
    • 1970-01-01
    • 2021-09-26
    • 2011-08-05
    • 2018-10-20
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多