我的一个朋友有一个目录,目前持有约500行或500个项目。我们正在研究如何提供关于目录的报告,包括查看项目的次数以及查看项目的日期。
他的网站每月平均有大约25,000次网页展示,如果我们假设其中一半是目录项目,那么我们假设每个月大约有12,000个目录项目。
我的问题是管理数据库中项目视图的最佳方法。
第一个选项是将目录ID插入表中,然后增加其查看的次数。这样做的好处是其紧凑的性质。表中只有与目录项一样多的行。
`catalogue_id`, `views`
缺点是没有保留日期信息,缺少维持上次查看项目的时间。
第二个选项是每次查看项目时插入一个新行。
`catalogue_id`, `timestamp`
如果我们继续假设12,000个项目视图的数字,这意味着每月向表格添加12,000行,或每年144,000行。这样做的好处是我们知道查看项目的次数,以及查看项目的日期。
缺点是桌子的大小。是一个包含144,000行的表对MySQL来说太大了吗?
有兴趣听取有关如何实现这一目标的任何想法或建议。
感谢。
答案 0 :(得分:1)
正如你所提到的,第一个是更紧凑但有限的。但是,如果你更详细地看一下选项2;例如,如果您希望存储的不仅仅是视图计数,例如进入/退出页面,主机IP等。这些信息对于统计和跟踪可能非常宝贵。另一个问题是这些25,000次展示是否与众不同?如果没有,您可以通过用户名,IP或其他一些唯一标识符进行跟踪,这可以使您不使用尽可能多的行。您的问题的答案取决于您希望存储多少细节?什么是数据的重要性?
<强>更新强>
是的,由于时间间隔限制给定项目的重复将是一个很好的解决方案。同时知道是否有人访问过相同的项目可能对建议的项目安排小部件有用,类似于亚马逊所做的。还知道有人多次访问某个项目时告诉我,这是一个很好的项目,可以通过邮件发送,简报或热门产品页面向他们或其他人宣传。跟踪唯一视图将提供更诚实的视图计数,您可以选择显示或存储。在限制重复访问者价值的问题上,这主要仅根据您显示的信息发挥作用。所有这些都是以最适合您的方式构建信息。
答案 1 :(得分:0)
您的问题陈述:我们希望能够跟踪特定目录项的观看次数。
让我们检讨您的选择。
第一个选项:
在此选项中,您将存储catalogue_id和项目视图数的整数值。
优势:
<强>缺点:强>
这里的问题是,由于您要相对频繁地更新此表,因此它将成为一个非常繁忙的小表。例如,10个用户正在查看相同的项目。这10个更新必须一个接一个地运行。假设您正在使用InnoDB,第一个视图操作将锁定行更新计数器释放锁定。其他更新将在其后排队。因此,虽然桌面上的数据很小,但如果你开始扩展系统,它可能会成为后来的瓶颈。
您正在丢失粒度数据,即您没有跟踪原始数据。例如,假设网站开始增长,并且您有一个感兴趣的投资者,他们希望看到过去6个月内每周观看次数的细分。如果您使用此选项,您将无法向投资者提供数据。基本上你要保留一个摘要。
第二个选项:
在此选项中,您将创建一个至少包含以下最小字段catalogue_id和timestamp的日志记录表。您可以将其展开以添加用户名/ IP地址或其他一些信息,以使其更加精细。
<强>优点:强>
您正在保留精细数据。这将允许您以各种方式汇总数据。例如,您可以添加一个IP地址列来存储访问者IP,然后每月执行一次报告,显示按国家/地区查看的产品(您可以进行IP地址查找以了解他们来自哪个国家/地区)。另一个例子是在上个季度看到哪些产品被视为最多等等。这些数据对于帮助您决定如何发展业务非常重要。如果你想知道什么是有效的,那么就产品而言,这个细节绝对是至关重要的。
您的新表将是一个记录表。它只会是插入操作。插入几乎可以并行发生。如果使用此选项,与不断更新的表相比,随着站点的增长,它可能会更好地扩展。
<强>缺点:强>
我的建议是认真考虑第二种选择。如果你决定走这条路线,用建议的表结构更新你的问题,让我们来看看它。不要害怕大数据,而要害怕BAD设计,处理起来要困难得多。
然而,一如既往地选择你的。