gpt4 book ai didi

php - 使用 PHP MySQL 的事件提要

转载 作者:可可西里 更新时间:2023-11-01 07:33:31 27 4
gpt4 key购买 nike

我正在使用 PHP 和 MySQL 制作某种“事件流/提要”。

我有一个流表,它只存储事件的类型和时间戳。然后我需要查找可以在各种表中找到的事件的实际数据(取决于事件类型)。该流应该能够处理数百个用户,因此我需要它表现良好。我得到的选项:

  • 获取流表 - 使用某种开关在 PHP 中循环,然后调用 SQL 获取适当的事件数据(针对每个事件)。 (慢)
  • 用一些连接创建一个大的 SQL 语句,在一个请求中获取所有事件数据。仍然在 PHP 中进行切换,但不必再次调用 SQL。 (这对大 table 来说很慢吗?)
  • 在 MySQL 中使用某种 View - 我以前没有这样做过。
  • 使用多个 SQL 调用获取所有事件数据并将它们存储在 PHP 数组中,然后从那里进行切换。

我还有其他选择吗?就性能而言,最佳方法是什么?

最佳答案

您可以使用单个查询执行数据驱动的JOIN。本质上,您将JOIN 每个需要的子表,然后通过别名从您需要的表中选择内容。假设 1 是 activity_drink,2 是 activity_eat,3 是 activity_sports 并且所有子表都有您要获取的列 content:

SELECT a.`timestamp`,
CASE a.`activity_type`
WHEN 1 THEN ad.`content`
WHEN 2 THEN ae.`content`
WHEN 3 THEN asp.`content`
END AS content
FROM activities AS a
LEFT JOIN activity_drink AS ad ON (ad.`activity_id` = a.`activity_id`)
LEFT JOIN activity_eat AS ae ON (ae.`activity_id` = a.`activity_id`)
LEFT JOIN activity_sports AS asp ON (asp.`activity_id` = a.`activity_id`)

这基本上会在选定时间对您的表进行非规范化。您也可以将其转换为 VIEW为了便于访问。它不应该太昂贵,假设你已经正确设置了外键、ID 和/或 UNIQUE 索引(MySQL 会注意到表中没有匹配的行并“忽略它”——选择 NULL排)。我还没有完全正确地测试它,因为我缺少任何数据并且不得不假设,但该代码段应该基本上可以正常运行。

但是,我想提一下,我个人对必须进行数据驱动的联接持谨慎态度。在这种情况下进行规范化的正确方法是找到最大的公共(public)属性集并将它们放入 activities 表中。如有必要,您可以将额外信息添加到相邻的表格中。但是,一般来说,如果多个表使用相同的数据,您应该将其移到主列中,除非绝对有必要不这样做。

关于php - 使用 PHP MySQL 的事件提要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7445122/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com