php - 保存搜索结果的数据库结构

标签 php mysql data-structures

我目前在一家社交网站工作。

我的老板最近想到了随机显示搜索结果而不是正常结果(注册日期)的想法。这样做的问题简单明了:如果您从一页转到另一页,每次都会显示不同的结果,因为列表每次都是随机的。

我想到了将结果存储在数据库+cookie 中,如下所示:

  • 包含 $_POST 请求序列化版本的 Cookie(如果我们想要重新排序则需要)
  • 将作为搜索基础的表 id => searches (id,user_id, creation_date)
  • 存储结果及其顺序的表 => searches_results (search_id, order, user_id)

流程图看起来像这样:

  • 每次搜索后,我都会将“位置”存储到 cookie 或 session 中
  • 然后我在“搜索”中删除之前的搜索
  • 然后我删除“searches_results”中以前的结果
  • 然后我在“搜索”键中插入一行
  • 然后我将每个用户行插入“searches_results”
  • 最后我将用户重定向到类似 ?search_id=[search_key] 的地方

这里有一个很大的缺陷:性能....绝对有可能使系统或宕机或非常慢。

知道什么是最好的结构吗?

最佳答案

如果您不是随机排序,而是通过某个顺序已知且可重复但不明显的函数进行排序,该怎么办?您可以使用搜索查询中的一些数据为这样的函数做种子,以使其重复变得更加不明显。这样,您可以在结果中来回翻页,并始终获得您期望的结果。音乐播放器将这种功能用于其随机播放功能(因此,如果您单击后退,则会播放上一首歌曲,如果您再次单击下一首,则会回到起点)。我相信您可以预知一些功能来完成此... bitwise XORing具有某些常量(来自查询)的 ID 值,然后按结果数排序可能就足够了。我随意选择了 XOR,因为它是一个非常简单的函数,可以为您提供可重复且不明显的结果。

关于php - 保存搜索结果的数据库结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/467075/

相关文章:

php - 最佳 OOP 实践 PHP/MySQL

检测 "clusters"点的算法

php - 如何检查数据库中是否存在用户名?

php - 为 iFrame 设置用户代理

mysql - 选择两个或多个(标志)列为 ON 的行

python - 在 python 中实现树结构的最佳方法是什么

c++ - 对于非常小的表(通常<10个项目)的高性能表结构,一旦创建表就不会改变?

php - 如何从数据库制作动态菜单模块

PHP:用于登录的 Cookie

当 MySQL 查询花费超过 X 秒时,PHP PDO 执行以中止?