【问题标题】:Creating a 'People who viewed this also viewed' list创建“查看过此内容的人也查看过”列表
【发布时间】:2011-08-29 06:43:17
【问题描述】:
我正在考虑创建一个您在亚马逊、yelp 和其他在线网站上看到的“查看过此内容的人”列表。现在我正在考虑使用“product_id”、“last_viewed_product_id”、“hits”创建一个新表,当用户从 product_id=100 的页面转到 product_id=101 时,它将使用 product_id= 创建/更新此表101,last_viewed_product_id=100,并增加“命中”值。是否有更好的方法更优化且计算量更少?
【问题讨论】:
标签:
php
mysql
database
database-design
codeigniter
【解决方案1】:
看来你正走在正确的道路上 - 一些建议 -
对于计算密集型 - 您可能希望缓存您的结果,因此您只会给出一个每天更新一次或类似效果的顶部“x”数字。在这种情况下,实时似乎并不重要。
我不确定您的网站上有什么样的产品,但如果种类繁多,您可能只想显示具有相关信息的项目(因此《星球大战》只会有与《星球大战》相关的项目弹出)。
因此,如果您的产品或关键字有“标签”,您可能希望使用与之相关的关系。
您可能还想为他们获得产品的方式增加权重。如果他们通过单击您提供的列表获得产品,那么这些类型的项目将继续填充,并且不会让其他产品有机会出现,所以给它一个低权重。会弹出较重的项目。
【解决方案2】:
如果您有所有访问者的用户 ID(您可以为未注册用户创建临时用户 ID),您可以创建一个包含 user_id 和 product_id 列的历史记录表,其中存储用户访问过的所有产品。然后,当用户打开产品时,执行查询,搜索最近查看过该产品的 user_ids,然后将其加入到这些用户打开的产品中。然后,只对那些user_id打开最多的产品进行排序。
确保缓存它,因为连接会降低任何 SQL 服务器的速度。
【解决方案3】:
据我所知,亚马逊用来降低计算密集度的“技巧”是 a) 使用贝叶斯统计数据/平均值和 b) 计算部分聚合。后者允许您不需要计算所有内容(您可以改为对预先计算的聚合求和)。前者允许您注入您推断的相关材料。