排行榜问题的一些想法

关于排行榜的一些思考:

要做排行榜的对象,比如说新闻对象,再比如小说对象,这些对象所从属的类对应着数据库中的表,而这些表中的记录有上w条,甚至10w或者百w条。

回到排行榜问题,通常我们有两种做法:

第一种方式,临外再建一张表,这个表中有如下字段:
Hite表
列名 解释
Id 主键
date 每天的日期
hite 每天的点击次数
newsId 外键,指向被点击的新闻

我们思考下,当我们在处理日排行,周排行,月排行,总排行时,如果使用此种方式,当一条新闻没有被点击哪就算了,数据库不需要进行任何操作;当被点击时,如果是一天中的第一次,就需要插入一条记录,当这是第二次或者第二次以上,那么就需要更改hite字段的值进行++。
临外还有一个问题,假设这个网站很牛x,它一共有10w条新闻,每天都被点击,所以一天就需要10w条记录,如果长此以往,一年内就有10w*365条记录.(这里我们不考虑一定时间内对新闻进行清除的操作!)

第二种方式,主表news表我们不建立临外的表直接在主表中加入以下7个字段:
列名 解释
....
totalHiteCount 总点击量
dateHiteCount 本日点击量
lastHiteDate 最后点击日期
weekHiteCount 周点击量
fistDayOfWeek 本周的周一日期
monthHiteCount 月点击量
fistDayOfMonth 本月的第一天日期

处理的过程是这样的
          如果一条新闻没有被点击 则数据库不做任何操作
          如果该新闻被点击:先从数据库中将此条记录查上来:
          判断点击时的日期与数据库中的lastHiteDate日期是否相等,如果不相等dateHiteCount=1, 并将点击时的日期赋给lastHiteDate;否则dateHiteCount++;
判断点击时的日期所在周的周一与数据中的fistDayOfWeek是否相等,如果不相等,weekHiteCount=1 并将点击时的日期所在周的周一日期赋给fistDayOfWeek;否则weekHiteCount++;
判断点击时的日期所在月的第一天日期与数据库中的fistDayOfMonth是否相等,如果不相等,monthHiteCount=1,并将点击时的日期所在月的第一天日期赋给fistDayOfMonth;否则monthHiteCount=++;
总点击日期始终+1;
然后形成sql 更新数据库相应的字段!

我们发现此种方式比第一种方式有了一个最 显著的优点:
它不需要维护临外一张表!
这个很关键,我们知道使用第一种方式,我们不仅要建立临外一张表,而在消极情况下,此表中的记录会与日增加“新闻记录数” 条记录!何况使用此种方式仍旧需要更修改记录,只是它的判断比较简单摆了!



思考:
有了以上的说道,你会说要坚决采用第二种方式,但是代码的书写和数据库表的设计是根据具体的需要来确定的!假设现在来了一个需求,我想知道上一周的排行榜情况,第二种方式就不可取了,你可能会说 每一周的排行榜我们都写数据库或者写文件进行保存不就可以了,是的这确实可以满足这个需求。如果现在又来了临外一种需要,我要最近两周内的排行榜,如果使用第二种方式就需要更改数据库的表了,要更改对应的类了。
我在网上找了有关排行榜的解说,他们大多数都采用第一种方式,我想是很有道理的!!!我们知道 我们的数据库不可能保存去年的新闻把!也就是说在一定的时间点上需要清除数据库中的过期记录!临外现在的硬件,网速都这么发达,这些情况应该不是问题吧!?

你可能感兴趣的:(sql)