一尘不染

将视图计数存储在数据库表中

sql

每次访问数据库记录时,什么是最合适的和最有效的存储视图计数的方法?

我有ITEMS包含以下字段的表:id, item_name

每个项目都有自己的永久链接:http :
//domain.com/item_name

我希望能够使用此数据并Views: 2,938在页面上显示一个。哪种方法最好?


方法一

view_countITEMS表中创建一个附加字段,并对其进行更新以增加视图计数:

view_count = view_count + 1;

方法B

创建一个VIEWS包含以下字段的新表:

id, item_id, timestamp, ip

并在VIEWS每次查看页面时将新记录添加到表中。

方法C

完全有另一种方法吗?


我已经看到方法A在各种PHP论坛软件中都使用过,但是我的大学讲师告诉我方法B更好,因为add()所需的压力小于update()


阅读 220

收藏
2021-03-08

共1个答案

一尘不染

确实,INSERT操作通常比UPDATE语句消耗更少的资源。但是调整良好的UPDATE语句并不一定会带来麻烦。”

还有其他考虑。如果唯一已知和可预见的要求是“总”页数,则与为每个“视图”事件存储单独的行相比,单行将消耗更少的存储空间。同样,检索视图计数的查询将更加有效。

(实际上,“应变”是在存储中,而不仅仅是磁盘空间,而是磁带的数量和备份所需的时钟时间,还原所需的时间等)

如果您需要能够按小时或按天报告观看次数,则拥有更细粒度的数据将使您能够做到这一点,而这是您无法从总数中获得的。

您实际上可以两者兼而有之。

如果我需要一个“摘要”计数来放置页面,那么我就不必对历史事件记录中的大量行运行查询,而在下一次页面时只需输入新值2939被查看。从单行中检索单列值对数据库资源的“压力”要小得多,而不是每次查看页面时都要翻阅数千行事件数据以将其聚合为一个计数。

如果还需要能够按国家,IP或小时,天,周或月来按国家或IP管理性地报告“视图”,则我还将存储单个事件行,以使它们可用于切片和骰子分析。

2021-03-08