我想跟踪用户 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 ...)。
关于统计信息:这与首先存储数据是一个不同的问题。对于任何统计数据,您可能需要某种聚合。为了加快这一点,您可以考虑缓存结果和类似的结果。