【问题标题】:Check for new content with JS/PHP/MySQL?使用 JS/PHP/MySQL 检查新内容?
【发布时间】:2018-02-14 23:57:18
【问题描述】:

我有四个表:projectspostsusersproject_users。一些用户通过project_users 表连接到一些项目。每个项目都包含来自posts 表的一堆行。非常直接。

用户可以编辑帖子行,每次更新时都应该保存user idtimestamp,以便其他用户可以看到新的和没有的。我应该将此信息保存到 1) 帖子行,为每一行保留最新的编辑器和时间,还是应该考虑 2) 一个完整的单独日志表?每种情况的好处是什么?

确定后,我想不时运行一个脚本,如果其他人更新了任何行(可怜的人的推动),它会刷新站点内容。给我一些观点。用 100 万个帖子询问数据库是否是一个很大的查询:“检查这个项目中是否有任何帖子在时间戳 x 之后更新了除您之外的任何用户”?只是问,因为我经常运行该查询。

一种更快的方法是将最新的编辑器记录到项目或项目用户行,但如果多人同时编辑,那么准确度会降低,并且也无法查看哪些行已更新。有意义吗?

【问题讨论】:

  • 谢谢!但是项目表只保留一个编辑器和一个日期,这很高兴知道,但由于我每 x 秒检查一次更新,如果 2 人更新彼此太近,刷新将无效:用户 A 更新,5 秒稍后用户 B 更新,5 秒后用户 A 再次更新,5 秒后脚本检查用户 A 的更新,但是当用户 B 是最新的编辑器时脚本没有运行,因此用户 A 将错过该更新。
  • 项目用户表包含有关谁连接到哪个项目的信息,因此无需将其放入用户表中。
  • 好的,那么当项目更新时,与项目相关的用户会收到通知,这将防止您必须运行脚本来检查是否发生更新的情况。您甚至可以在更新发生后使用SQL TRIGGERS 获取相关的用户 ID 并通知他们。
  • 您将如何通知他们?这需要 push 和 websockets 之类的东西吗?
  • 考虑使用sql triggers或在你的php代码中if (update successful){select where col=project_ID and col=user_ID and inform users}

标签: php mysql database database-design


【解决方案1】:

使用解决方案 (1)。这是一个简洁的设计,易于使用。

当您为编辑表单获取post 数据时,将updated_at 时间戳保存在隐藏字段中。然后每隔 X 秒运行一次 Ajax 请求以检查时间戳是否已更改。查询很简单:

SELECT updated_at FROM posts WHERE post_id = ?

由于您按主键进行过滤,因此即使表很大,查询也会非常快。

现在将获取的时间戳与隐藏字段中存储的时间戳进行比较。如果已更改 - 通知用户(编辑)。

正如您已经意识到的那样,另一个用户可能会在两个 Ajax 请求之间更新帖子。因此,您还应该在保存表单数据之前检查更新。不要忘记使用事务并锁定行:

伪代码:

START TRANSACTION
SELECT updated_at FROM posts WHERE post_id = ? FOR UPDATE

if ($row->updated_at == $form->updated_at)
    then update row
    else notify the user that he is unlucky ;-(

COMMIT

当然你也可以使用方案(2)并添加一个单独的表post_updates(post_id, user_id, updated_at)。要获取最新的时间戳,您将运行:

SELECT MAX(updated_at) as updated_at
FROM post_updates
WHERE post_id = ?

(post_id, updated_at) 上有一个索引,它应该运行得非常快。但是,只要您没有任何可以从该表中受益的要求,就不要使事情复杂化。

【讨论】:

  • 谢谢!这一切都很好,但是如果有 100 个帖子,那我就不能按主键了?
  • 我以为你一次更新一个post。有错吗?
  • 是的,您一次更新一行,但用户看到的表格有时多达 100 行,这些行都应该是最新的,而无需手动刷新页面。我不清楚这一点。
  • 现在我明白你的意思了。没有大的编辑表单,整个表格都是可编辑的,并且每列使用 ajax 保存。我的 javascript 每隔 x 秒检查一次是否有任何更新的行,我想知道这是否是一项繁重的任务,因为它会查找属于某个项目的多行,其用户 ID 不是您自己的,并且时间戳比您的更新最后一次检查。如果是直接的主键检查,我不会担心。
  • 我猜“整表”是指一个项目的所有行。要检查是否有任何行已更新,您只需查看最新的:SELECT MAX(updated_at) FROM posts WHERE project_id = ?。在这里你需要一个(post_id, updated_at) 的索引。或者您可以获取所有更新的行:SELECT * FROM posts WHERE project_id = ? and updated_at > ?。无论如何,您永远不需要从项目中获取所有行。
猜你喜欢
  • 1970-01-01
  • 2021-09-14
  • 2017-01-23
  • 2021-11-18
  • 2017-09-29
  • 2017-07-11
  • 1970-01-01
  • 2012-01-23
  • 2012-01-02
相关资源
最近更新 更多