首页 新闻 会员 周边

关于排行榜的数据库设计及实现

0
[已解决问题] 解决于 2013-04-11 10:19

环境:SQL2008

小弟我菜鸟,现遇到该问题求助大神们,希望得到回复和解答,谢谢。

该排行榜是针对图书在线阅读做的,浏览过同类的贴吧贴子,给出的答复多是根据时间的筛选统计出周,月的排行;我想了想这样的设计,会记录下每次点击浏览事件时记录下该次点击事件的时间,试想假定图书的数量够多同时在线阅读的读者够多,那么数据库中的记录会多到吓人,查询时给数据库的负担也过大。

所以我想了想,不这样做因为排行榜并没有想到要实时排行...(拜读过一个大神的老贴子虽然没怎么读懂大概意思就是这么做耗资源不可行)数据库表设计如下:

浏览记录表:

类别编号 书名 书籍号 点击次数(进行累加点击更新该数据) 时间(以日期为单位忽略时分秒)

现想通过任务给数据库分配任务实现每日晚11点对该表进行操作,以书籍编号为准 根据当天的数据将所有的书籍生成明日的数据行,以此来记录明天的点击次数,保证该表中一个图书编号只记录一条数据。

例:

BC001 《肖申克的救赎》 B001    100(可累加)     2012-12-18

假定该条数据在12-18日晚11点(作业执行时间暂定 不考虑此期间的数据丢失)的点击次数累加情况为100

那么在此同时在该表生成的明日预留的操作数据为

BC001 《肖申克的救赎》 B001    100(可累加)     2012-12-19

那么此条数据就可以用来记录该本书的明日的点击情况了。

现在遇到的问题就是怎么样去生成这条数据

select * from A表 into B表

有类似的T-SQL语句不过我就尴尬了

该语句必须要求B表不存在,如果将数据每日的更新都放在一张新表中一个是表的命名问题,还有就是最后统计时多表的查询会增加麻烦,还有会让这个表设计变得没有意义了吧?(不是想的很清白 求大神指正)

xcycanits的主页 xcycanits | 初学一级 | 园豆:184
提问于:2012-12-19 20:13
< >
分享
最佳答案
0

Insert into Table2(field1,field2,...) select value1,value2,... from Table1

 

要求目标表Table2必须存在,由于目标表Table2已经存在,所以我们除了插入源表Table1的字段外,还可以插入常量

 

SELECT vale1, value2 into Table2 from Table1

要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中

奖励园豆:5
geass.. | 小虾三级 |园豆:1821 | 2012-12-19 20:56

Insert into Table2(field1,field2,...) select value1,value2,... from Table1

 

要求目标表Table2必须存在,由于目标表Table2已经存在,所以我们除了插入源表Table1的字段外,还可以插入常量

我想应该是这种用法,我不清楚怎么用 我先查查去

因为我是想通过这张表自身生成下一天的数据

不管怎么样 还是谢谢您~回复还真是神速啊~

xcycanits | 园豆:184 (初学一级) | 2012-12-19 21:02
其他回答(3)
0

你的想法有问题,不该用生成下一天数据的方式(比如你前一天把数据生成好了,这时我插入一个新的书籍,你就统计不到了)

而是在更新点击次数的时候,有这条数据则更新,没有这条数据则插入,写一个存储过程来调用

Rich.T | 园豆:3440 (老鸟四级) | 2012-12-20 09:30

刚开始我想的是交给数据库一个作业,在网站访问量小的时候做自动生成的下一天的数据,但是我在写的时候,还是加入了判断,先判断是否是第一次浏览,如果是则插入数据,如果不是根据Id来更新此Id的浏览次数;同时在更新的时候还需要对日期进行判断,我点击的时候是获取的系统当前时间,拿这个时间和数据库中的时间做比较,如果是同一天时间则选择更新数据,如果不是同一天则选择插入数据;但是这么写之后我又纠结于这样写之后对数据库的压力以及排行榜的数据统计的效率。因为是菜菜 所以不是很清楚的分辨出怎么写代码是必须的,怎么样能规避数据库压力过大,怎么样提高该操作的执行效率之类的问题,我有考虑 但是却分不清,理不明白......有没有好的建议 比如看哪本书之类的呢?

支持(0) 反对(0) xcycanits | 园豆:184 (初学一级) | 2012-12-20 09:40
0

按照时间频率创建表比如:order_20121220,order20121221(每天一个表)

比如要取某个时间的排序就直接定位到那个表

yanhong-liu | 园豆:202 (菜鸟二级) | 2012-12-26 16:54

IQueryable<t> table = null;
var query = from c in table
           
where c.Date >= DateTime.Parse("2012-04-21") && c.Date < DateTime.Parse("2012-05-23")
            group c by c.Name into g
           
where g.Count() > 0
            select new { Name

支持(0) 反对(0) zhi++ | 园豆:487 (菜鸟二级) | 2013-04-11 19:26

IQueryable<t> table = null;
var query = from c in table
           
where c.Date >= DateTime.Parse("2012-04-21") && c.Date < DateTime.Parse("2012-05-23")
            group c by c.Name into g
           
where g.Count() > 0
            select new { Name

支持(0) 反对(0) zhi++ | 园豆:487 (菜鸟二级) | 2013-04-11 19:26

IQueryable<t> table = null;
var query = from c in table
           
where c.Date >= DateTime.Parse("2012-04-21") && c.Date < DateTime.Parse("2012-05-23")
            group c by c.Name into g
           
where g.Count() > 0
            select new { Name

支持(0) 反对(0) zhi++ | 园豆:487 (菜鸟二级) | 2013-04-11 19:26
0

IQueryable<t> table = null;
var query = from c in table
           
where c.Date >= DateTime.Parse("2012-04-21") && c.Date < DateTime.Parse("2012-05-23")
            group c by c.Name into g
           
where g.Count() > 0
            select new { Name

zhi++ | 园豆:487 (菜鸟二级) | 2013-04-11 19:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册