我正在研究一个Product Catalog
应用程序的Invoicing
模块。
当用户创建新发票时,product name
字段应该是一个自动完成字段,该字段显示产品目录中最近使用的产品。
如何将此“使用最近/频率”存储在数据库中?
我正在考虑添加一个新的字段recency
,它将由1
在每次使用该产品时增加,而在使用其他产品时由1/(count of all products)
减少。然后使用这个recency
字段来排序,但在我看来,这并不是最好的解决方案。
你能帮我解决这种问题的最佳做法是什么?
发布于 2017-06-25 00:12:00
最近计算的解决方案:
在products表中创建一个新列,例如名为last_used_on
。它的数据类型应该是TIMESTAMP
(Unix-time的MySQL表示)。
优势:
资源:
使用率计算的解决方案:
实际上,你说的不是频率计算,而是速率--尽管人们可以说频率也是一个速率。
频率意味着以时间作为参考单元,它以赫兹(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
表中,添加一个类型为int
或bigint
的列usages
,并在每次使用产品时简单地增加其值。然后,当您想获取最常用的产品时,只需应用如下sql语句中的筛选器:
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是三种不同的事物。
祝好运。
发布于 2017-06-24 22:22:33
为了允许将来的灵活性,我建议使用以下额外的(*)表来存储所有用户使用产品的整个历史记录:
名称:product_usage
栏:
这将允许根据需要对查询进行微调。例如,您可以决定只根据过去的使用情况为登录用户订购。或者,在特定的时间框架内的总使用可能更有意义。这种表格也可能具有审计的双重目的-例如报告所有用户中最受欢迎或最不受欢迎的产品。
(*)假设数据库模式中不存在类似的东西
发布于 2017-06-28 07:52:13
您的问题与许多其他网络规模的搜索应用程序有关,例如显示拼写更正、相关搜索或“趋势”主题。您正确地认识到,最近和频率都是确定“流行”建议的重要标准。在实践中,最好是在两者之间做出妥协:仅仅最近就会受到随机波动的影响;但你也不想只使用频率,因为有些产品可能在过去购买了很多,但它们的受欢迎程度正在下降(或者它们可能已缺货或被后续型号所取代)。
在这些场景中通常使用的一个非常简单但有效的实现是指数平滑。首先,大多数情况下,在固定的时间间隔(例如,每天一次)更新人口就足够了。设置一个衰变参数α(比方说,α),它告诉你昨天的订单与今天相比有多重要。同样,两天前的订单价值α*α~9倍于今天,以此类推。要估计此参数,请注意,在log(.5)/log(α)天(α=.95约为14天)之后,该值会衰减到一半。
该实现只需要为每个产品附加一个字段,orders_decayed
。然后,您所要做的就是每天晚上用总订单更新这个值:
orders_decayed =α* orders_decayed + (1-α) * orders_today.
您可以根据此值对适用的建议进行排序。
https://stackoverflow.com/questions/44694715
复制相似问题