7

我正在开发一个基于 PHP、Mysql、Apache 的项目。

我有一个名为通知的模块,就像 FACEBOOK 中可用的通知一样,为此我有 3 种方法

或者我将每个更新插入到一个表中,计算需要通知这些更新的用户数量,即如果假设类别 B 有一些更新并且这个类别 B 包含 100 个用户,那么我将为相应的用户插入 100 行一个说,通知表。

第二种方式

我可以做的只是在表中插入一个特定的类别条目,然后对每个护理 ID 进行繁重的 JOIN 查询,以从多个表中获取所有记录以获取记录。

第三种方式

我在每次更新时都使用触发器,以便它可以用于通知用户。

我相信这三种方式在某些时候都是有问题的。

现在任何人都可以提出任何更好的想法或其中哪一个是更好的选择吗?

我担心网站的性能,因为它将有大量条目

谢谢

4

2 回答 2

0

这比我最初想的要复杂一些:)

应用程序/用户行为如何?我们什么时候应该做最多的工作?是在插入数据时,还是在我们获取数据时。

我将不得不对最常见的操作做出假设。我会假设获取数据会更常见一些,因为许多用户会看到未读消息的通知,但只有一个“插入”新消息?

因此,我会将工作放在插入新通知上,但是当用户开始涌向您的应用程序时,它仍然可能会很糟糕。

但我认为模型需要在任何优化之前设置,这更重要。稍后可以通过使用denormalisation、 scheduling 等来管理优化。我不会真正触摸触发器,恕我直言,它们有点时髦。

我也会采取另一种方法。

用户写了一条新消息

  • 插入消息
  • 更新当时更新的 user_category(有很多)类别

    UPDATE user_category SET last_changed = 'NOW()' where category_id = ?;

如何查找用户未读消息

  • 选择自上次用户查看后已更新的类别(脏?)。
  • 从那些不在“user_message_noticed”中的类别中选择所有消息(见下文)。

用户已阅读消息

  • 在耦合消息和用户的 *user_message_noticed* 模式中插入一行。类别 id 在那里,所以我们可以在没有额外连接的情况下更快地完成上述操作。

在从该类别读取的所有消息上 - 使用用户阅读所有消息的日期更新 *user_category™(有很多很多)。

但有时,你无法真正摆脱实际工作。

于 2011-09-04T01:33:53.663 回答
0

MySQL 中的触发器支持充其量是粗制滥造的,所以我不会朝那个方向努力,尽管这可能是一个很好的方法。

最简单的方法如下:对于每次登录/注销,从“在线用户”.id 中插入/删除用户,然后让前端(无论如何都要做傻事)现在询问并然后知道他知道哪些id在表中。

连接,除了在 mysql 中相对不太聪明之外,即使有索引,在大表上也会很慢。

触发器,一样,然后,你会要求触发器做什么?推送到此人已登录的所有内容?推给有兴趣的人?这意味着又一次加入,即性能下降。

通知表?无缘无故地巨大而缓慢(即 100 个插入而不是一个 where 查询 ..meh)。

于 2011-09-22T11:32:06.253 回答