首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在MySQL中存储最近的使用频率

如何在MySQL中存储最近的使用频率
EN

Stack Overflow用户
提问于 2017-06-22 08:55:53
回答 7查看 1.2K关注 0票数 6

我正在研究一个Product Catalog应用程序的Invoicing模块。

当用户创建新发票时,product name字段应该是一个自动完成字段,该字段显示产品目录中最近使用的产品。

如何将此“使用最近/频率”存储在数据库中?

我正在考虑添加一个新的字段recency,它将由1在每次使用该产品时增加,而在使用其他产品时由1/(count of all products)减少。然后使用这个recency字段来排序,但在我看来,这并不是最好的解决方案。

你能帮我解决这种问题的最佳做法是什么?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2017-06-25 00:12:00

最近计算的解决方案:

在products表中创建一个新列,例如名为last_used_on。它的数据类型应该是TIMESTAMP (Unix-time的MySQL表示)。

优势:

  • 时间戳包含日期和时间部分。
  • 这样就可以对日期和时间进行非常精确的计算和比较。
  • 它允许您将保存的值格式化为您选择的日期时间格式。
  • 您可以将任何日期-时间格式转换为时间戳。
  • 关于自动完成字段,它允许您根据需要筛选产品列表。例如,显示自日期时间以来使用的所有产品.或获取日期-时间-1和日期-时间-2之间使用的所有产品。或者只在星期一,下午1:37:12,在过去的两年,两个月零三天(如此灵活的时间戳)使用产品。

资源:

使用率计算的解决方案:

实际上,你说的不是频率计算,而是速率--尽管人们可以说频率也是一个速率。

频率意味着以时间作为参考单元,它以赫兹(Hz =1/秒)为单位测量。例如,假设您想询问一个产品在过去一年中使用了多少次。

A比率,另一方面,是两个相关单位之间的比较关系。例如,美元兑欧元的汇率--它们都是货币。如果比较发生在同一类型的两个术语之间,则结果是一个没有度量单位的数字:百分比。相似:50个苹果/273个苹果= 0.1832 = 18.32%

也就是说,我想您试图计算使用率:一个产品的使用次数与所有产品的使用次数之间的关系。比如,对于一个产品:usage rate of the product = 17 usages of the product / 112 total usages = 0.1517... = 15.17%。在“自动完成”中,您可能希望以大于给定百分比的使用率显示产品(例如,9% )。

这很容易实现。在products表中,添加一个类型为intbigint的列usages,并在每次使用产品时简单地增加其值。然后,当您想获取最常用的产品时,只需应用如下sql语句中的筛选器:

代码语言:javascript
运行
复制
SELECT
    id, 
    name, 
    (usages*100) / (SELECT sum(usages) as total_usages FROM products) as usage_rate
FROM products 
GROUP BY id
HAVING usage_rate > 9
ORDER BY usage_rate DESC;

下面是一个研究案例:

最后,最近的频率rate是三种不同的事物。

祝好运。

票数 6
EN

Stack Overflow用户

发布于 2017-06-24 22:22:33

为了允许将来的灵活性,我建议使用以下额外的(*)表来存储所有用户使用产品的整个历史记录:

名称:product_usage

栏:

  • id -内部代理项自动递增主键
  • product_id (int) -产品标识符的外键
  • user_id (int) -用户标识符的外键
  • 时间戳(日期时间)-使用产品的日期/时间

这将允许根据需要对查询进行微调。例如,您可以决定只根据过去的使用情况为登录用户订购。或者,在特定的时间框架内的总使用可能更有意义。这种表格也可能具有审计的双重目的-例如报告所有用户中最受欢迎或最不受欢迎的产品。

(*)假设数据库模式中不存在类似的东西

票数 4
EN

Stack Overflow用户

发布于 2017-06-28 07:52:13

您的问题与许多其他网络规模的搜索应用程序有关,例如显示拼写更正、相关搜索或“趋势”主题。您正确地认识到,最近和频率都是确定“流行”建议的重要标准。在实践中,最好是在两者之间做出妥协:仅仅最近就会受到随机波动的影响;但你也不想只使用频率,因为有些产品可能在过去购买了很多,但它们的受欢迎程度正在下降(或者它们可能已缺货或被后续型号所取代)。

在这些场景中通常使用的一个非常简单但有效的实现是指数平滑。首先,大多数情况下,在固定的时间间隔(例如,每天一次)更新人口就足够了。设置一个衰变参数α(比方说,α),它告诉你昨天的订单与今天相比有多重要。同样,两天前的订单价值α*α~9倍于今天,以此类推。要估计此参数,请注意,在log(.5)/log(α)天(α=.95约为14天)之后,该值会衰减到一半。

该实现只需要为每个产品附加一个字段,orders_decayed。然后,您所要做的就是每天晚上用总订单更新这个值:

orders_decayed =α* orders_decayed + (1-α) * orders_today.

您可以根据此值对适用的建议进行排序。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44694715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档