“访问量最大”在应用程序中的工作原理

时间:2009-08-10 11:00:24

标签: database-design

在我的应用的主页中,我尝试实施类似Chrome浏览器的“访问量最大的网站”。 Safari有他们的主页。主要不同之处在于应用程序将显示来自数据库(人员,组织,订单,发票等)的对象,而不是网站。

它应该像自动书签一样工作。

DB中已存在“最近查看”表(InstanceId,UserId,LastVisitDate)。

我可以使用(NumberOfVisits)属性扩展它,但这不允许我对旧的更近期访问进行加权。

我正在研究的一个想法是根据LastVisitDate对NumberOfVisits进行加权。 当用户再次访问该实例时,我会在添加新访问之前减轻现有的NumberOfVisits。

之前有没有人实现过这样的系统? 你知道Safari& Chrome是否在主页上执行此操作?

6 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

普通老愚蠢的“上个月的访问次数”怎么样?

我还会考虑用户在一个特定实体上停留的持续时间。例如,在上个月他每次工作半小时的情况下,用户访问过的实体重量增加了3倍,而不是他访问过的实体10次,但只开了15-20秒。< / p>

答案 2 :(得分:1)

查询

SELECT
    InstanceId,
    UserId,
    COUNT(InstanceId) AS [Count]
GROUP BY InstanceId, UserId
HAVING Date >= DATEADD(DAY, -7, GETDATE()) -- This will give the most visited instances in the last week. In the same way you can get the most visited instances in a day, month, year, etc.
ORDER BY [Count] DESC

答案 3 :(得分:1)

“最常见的”通常与过去几周/几天/年相关。所以你需要记住一个“要求”。所以想象一下,你想拥有最近30天访问量最大的网站,一种方法就是拥有这样的表格结构

<强>编号

<强>的PageId

<强> LastFlush

<强> Visists

其中“LastFlush”-colum是一个DateTime,告诉您上次刷新的时间。但是,如果您使用此结构,则会出现另一个问题,“30天后”您回到0并且没有要显示的MostVisistedSites。

另一个方面是将每个visist存储在一行中,例如

<强>编号

<强>的PageId

<强> Visisted

然而,这会在您的表格中填满更多行,但它会让您更好地了解您的网站,当然,您可以删除所有过去30天的访问者,如果您愿意,只需关注新访问者。

答案 4 :(得分:0)

以下是实施的解决方案: 在我的LastView表中添加了两列,现在是:

  • 对象类型
  • 的ObjectID
  • 用户ID
  • DateTimeLastView
  • NumberOfVisits(new)
  • NumberOfVisitsNormalized(new-Calculated)

说明

  • NumberOfVisitsNormalized是NumberOfVisits乘以较旧条目变小的因子。这样,新访问比旧访问更有价值。
  • 当访问次数增加时,我将INSERT值为10 SELECTS,更新为5 SELECTS。
  • NumberOfVisits = 1 + NumberOfVisitsNormalized。
  • 如果用户在上次访问后的10分钟内访问同一页面,则无法获得奖励。
  • 如果用户在上次访问后的24小时内访问同一页面,则会获得50%的奖励。

我们有这样的方式:

  • 上次访问的网页
  • 用户上次见到
  • 收藏页面

只有6个(5个实数+ 1个计算的)列,没有触发器,UDF,SP和快速查询。

答案 5 :(得分:0)

您可以使用漏桶抽象。

存储访问次数以及上次更新的日期。更新时,请设置访问次数为
(旧号码 - (自上次更新后的天数*老化因子)+ 1)

查询时,始终使用
进行标准化 (访问次数 - (自上次更新以来的天数*因子))
然后你可以按照结果排序。

老化因素越大,数字下降的速度就越快。

您还可以使用“自上次更新以来的天数”的方块(或多维数据集),以便在上次访问时使用的时间越长,衰减速度越快。