在数据库级别跟踪计数器的最佳方法



我想跟踪用户 counter 虽然时间,并且能够在计数器中通过时间在计数器中生成有关更改的统计信息。

我很适合(尽管我想听听它们的更好方式)关于两个主表。看起来很像这样的用户和counter_change:

user:
+-----------+------------+
| id        | username   |
+-----------+------------+
| 1         | foo        |
| 2         | bar        |
+-----------+------------+
counter_change:
+-----------+--------------------+------------+
| user_id   | counter_change_val | epoch_time |
+-----------+--------------------+------------+
| 1         | 10                 | 1513242884 |
| 1         | -1                 | 1513242889 |
+-----------+--------------------+------------+

我希望能够显示当前计数器值(基本值为0)以及一些统计数据(例如:ex:ex:昨天您的网络计数器是 10或-2等)

我已经考虑过一些可能的解决方案,但它们似乎都不是 perfect 解决方案。

添加计数器对user表(或在某些新的counters表上):

此解决方案似乎是更有效的资源,在插入counter_change时,使用counter_change_val中的user更新计数器。

专利:

获取计数器当前值几乎不会消耗资源。

cons:

如果发生错误,COCT_CHANGES_VAL的总和可以从user中的计数器差异。

不能真正用于统计字段,因为它需要额外的查询,到那时,触发器将更加方便。


在插入/更新上添加A 计算user表(或在某些新的counters表上)的计数器:

此解决方案将由SQL触发器或ORM级别的某种函数组成,该函数将用Counter_change_val的总和更新插入到counter_change表的值。

这也将用于表明按日期分组的计算字段。例如,获得过去30天的平均每日变化。

专利:

获取计数器当前值几乎不会消耗资源。

cons:

在每个插入中,都需要所有当前用户counter_change的聚合。


添加视图或使用计数器和选择的总和

此解决方案将包括创建视图或选择以在需要时获取汇总counter_change_val的总和。

专利:

在桌子上不添加字段。

cons:

在运行时计算时,它将增加时间来请求响应时间。每次咨询计数器时,都需要对柜台变换值的汇总。

实际上,我不确定我是否了解您要做什么。尽管如此,我建议选项1或选项2:

选项1是有效的,如果正确完成,则可以防止错误。例如,您可以包装插入counter_change并在事务中计算新的counter_value;这将防止任何矛盾之处。您可以在后端软件或触发器中执行此操作(例如,插入Counter_change)。

关于选项2,我尚不清楚为什么需要对当前用户的所有counter_change进行聚合。您可以像选项1一样从插入触发器内部的用户表中调整counter_value,并且可以使用交易使其安全。

IMHO,在Counter_change的每个插入物上调整当前的Counter_value是最有效的解决方案。您可以在后端软件或触发器中进行操作。在这两种情况下,都使用交易。

选项3)不应使用,因为它会将大量负载放在系统上(假设您每个用户有1000个counter_changes ...)。

关于统计信息:这与首先存储数据是一个不同的问题。对于任何统计数据,您可能需要某种聚合。为了加快这一点,您可以考虑缓存结果和类似的结果。

相关内容

最新更新