mysql - 从 Mysql 中选择一种方法而不是另一种方法来获取数据的复杂性

标签 mysql join triggers database-performance

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

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

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

第二种方式

我能做的只是在表中插入一个特定的类别条目,然后对这些 caregory ID 中的每一个进行大量的 JOIN 查询,以从多个表中获取所有记录以获取记录。

第三种方式

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

我认为这三种方式在某些时候都存在问题。

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

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

谢谢

最佳答案

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

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

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

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

但我认为模型需要在任何优化之前设置,它更重要。稍后可以使用 denormalisation 管理优化,日程安排等。我不会真正接触触发器,恕我直言,它们有点时髦。

我也会做另一种方法。

用户写了一条新消息:

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

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

如何查找用户未读消息:

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

用户已阅读消息

  • 在 *user_message_noticed* 模式中插入一行,将消息和用户联系起来。类别 ID 在那里,因此我们可以在上面更快地完成操作而无需额外的连接。

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

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

关于mysql - 从 Mysql 中选择一种方法而不是另一种方法来获取数据的复杂性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7006471/

相关文章:

mysql - 如何使用express-session和express-mysql-session创建登录端点

asp.net-mvc - 对于强类型 View ,自定义类型的 MVC LINQ to SQL JOIN 失败

c# - IsSelected == False 的 ListBox DataTrigger 在人口上触发?

php - 如何查看以下系统中的反向关系

c - VS2010 - C - process.h - "joining"线程以 _beginthread 开始

c# - 使用 Entity Framework 和 MVC4 SQL Server 插入后触发器不触发

jquery - 使用 jquery 事件 keydown 模拟在文本区域上输入不起作用

mysql - 如何在 MySQL 中进行相交查询?

mysql - 根据输入的总点数返回随机行

mysql - 我需要更改 MySQL 数据库的默认字符集吗?