假设我的网站包含具有可公开访问页面的用户个人资料(每个配置文件各有几个页面)。我想显示用户页面查看统计信息(例如,每页,特定时间段等)。存储页面浏览量的好方法是什么?
这就是我的想法:
Table Page Views
================
- Id (PK)
- Profile Id (FK)
- Page Id (FK)
- Timestamp
我担心此解决方案无法扩展。建议?
答案 0 :(得分:1)
你的直觉是正确的,写入数据库并不能很好地扩展。您希望避免每个页面请求的数据库事务。
那注意到,你真正关注的是缩放吗?如果是这样,假设有一个互联网站点(而不是内部站点),请跳过自己的站点并使用Google Analytics或类似的东西收集命中数据。然后获取该数据并对其进行处理以生成每个配置文件的总计。
但是,如果你真的很想自己做,那么请考虑使用日志解析。如果您可以枚举每个配置文件的URL,请使用该信息和Web服务器日志来生成命中总计。可以处理大量不同格式的Microsoft's Log Parser等工具,或者像sed和grep这样的* nix命令行工具都是你的朋友。
如果枚举不可能,请更改代码以记录您需要的信息并处理该日志文件。
使用日志,使用批处理生成结果,并使用MySQL的LOAD DATA将这些结果插入数据库。
关于roll我们推荐的最终说明 - 如果你有一个集群环境而不是每个请求的数据库事务,那么这将更好地扩展很多。
答案 1 :(得分:0)
这取决于您希望提供哪种报告。
如果您希望能够说“这是在这两个日期之间查看您网页的人员列表”,那么您必须存储您提议的所有数据。
如果您只需要能够说“您的页面在这两个日期之间被查看了X次”,那么您只需要一个包含页面ID,日期和计数器的表格。使用单个UPDATE查询更新每个页面视图上的计数器列。
答案 2 :(得分:0)
我想你可以
<强> tblPerson 强>
personid(pk)
activeProfileID(fk) -- the active profile to use.
timestamp
<强>的tblpage 强>
pageid(pk)
data
<强> tblPersonProfile 强>
profileID(pk)
timestamp
<强> tblProfilePages 强>
profilePageID(pk)
profileid(pk)
pageid(pk)
isActive