求一设计思想或者数据结构!

swazn_yj 2006-08-23 09:36:50
小弟作了个广告发布系统,统计广告点击量的时候遇到个问题比较棘手,请各位赐教!
点击量是按独立ip计数的,每独立ip每天点击数超过10次按10次计,所以要记录这个ip到第10次点击的时候的时间,它再点击就要比较这个时间过没过24小时,然后再重新计数。大体就是这么个意思。
我的表初步设计如下:
CREATE TABLE [Sw_Hits] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[AdID] [int] NULL ,
[CpID] [int] NULL ,
[HitTime] [smalldatetime] NULL CONSTRAINT [DF_Sw_Hits_HitTime] DEFAULT (getdate()),
[CusIP] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,--(客户ip)
[SerIP] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[SessionStart] [smalldatetime] NULL ,--(10次后的时间)
[Hits] [int] NULL CONSTRAINT [DF_Sw_Hits_Hits] DEFAULT (0),(总点击量)
[SessionHits] [int] NULL CONSTRAINT [DF_Sw_Hits_SessionHits] DEFAULT (0),(超过10次清0,update sessionstart,累加到总点击量)
CONSTRAINT [PK_Sw_Hits] PRIMARY KEY CLUSTERED
(
[id]
) ON [PRIMARY]
) ON [PRIMARY]
GO

就是来一个ip的访问,我先查询数据库有没有这个ip,没有就insert,有就查sessionstart是否为null,是就查sessionhits是否超过了10,超过就把它清0,sessionstart=getdate(),hits=hits+sessionhits,如果sessionstart不为null就比较时间是否超过24小时,是就重新计数。
这样的方法感觉判断比较麻烦,我一直也没写好,但是这样应该很节省数据库的记录数。
但是公司要点击数报表的话需要每小时、每天统计,以上的流程又要加上时间判断,每过一小时新增一条记录......想想头就大了!
还有个方法是来一条先count一下数据库里有多少条,少于10条就insert,大于10条就比较跟最后一条的时间差是否超过24小时,超过就继续insert,但是这样的话,日点击量如果超过1w独立ip,数据库的记录就超过10w条,我怕数据库顶不住。


各位大哥有没有很好解决这个统计问题的方案??

...全文
450 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
swsky 2006-08-28
  • 打赏
  • 举报
回复
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO


--execute p_tb_Count_Manager @cAct='add',@iADID=1,@cIP='127.0.0.1',@cFrom='http://dvd.txwnet.com/view.asp?pid=1255'
CREATE PROCEDURE sw_CountManager
@Act varchar(6),--操作指令
@ADID int=0,--广告ID
@CIP varchar(15),--访问IP
@CFrom varchar(100)--来源


AS

DECLARE @iRet int
--添加
IF @Act='add'
BEGIN

--判断该IP是否访问了这一广告,否,IP访问+1,是,IP访问不变
IF EXISTS(SELECT TCount FROM Sw_Count_Sum WHERE ADID=@ADID AND CIP=@CIP AND (Datediff(d,CTime,GetDate())=0))
BEGIN
--当天访问数加1
--这里加入判断tCount是否=10,是,就置
SELECT @iRet=tCount FROM Sw_Count_Sum WHERE ADID=@ADID AND CIP=@CIP AND (Datediff(d,CTime,GetDate())=0)
IF @iRet<10
BEGIN
UPDATE Sw_Count SET Counts=Counts+1 WHERE ADID=@ADID AND (Datediff(d,LTime,GetDate())=0)
UPDATE Sw_Count_Sum SET TCount=TCount+1,CTime=GetDate() WHERE ADID=@ADID AND CIP=@CIP AND (Datediff(d,CTime,GetDate())=0)
END

IF @@Error<>0 OR @@RowCount<=0
GOTO Error
ELSE
RETURN 0
END
ELSE
BEGIN
--插入IP访问详细
INSERT INTO Sw_Count_Sum(ADID,CIP,CFrom,TCount) VALUES(@ADID,@CIP,@CFrom,1)
--当天该广告已有访问,更新
IF EXISTS(SELECT ID FROM Sw_Count WHERE ADID=@ADID AND (Datediff(d,LTime,GetDate())=0))
UPDATE Sw_Count SET Counts=Counts+1,CountIP=CountIP+1 WHERE ADID=@ADID AND (Datediff(d,LTime,GetDate())=0)
--当天该广告未访问,插入
ELSE
INSERT INTO Sw_Count(ADID,Counts,CountIP) VALUES(@ADID,1,1)
RETURN 2
END

END

--详细资料
ELSE IF @Act='detail'
SELECT * FROM tb_Count WHERE ADID=@ADID


Success:
RETURN 0
Error:
RETURN 1


GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

Reeezak 2006-08-25
  • 打赏
  • 举报
回复
做好就是用你们公司的那种办法,就是说每一次访问都添加一条独立记录,之后的统计就方便了,无论是计数还是报表

计数的话
SELECT CusIP, CASE WHEN COUNT(*) >= 10 THEN 10 ELSE COUNT(*) END AS Hits
FROM Sw_Hits
WHERE 时间等于当天
GROUP BY CusIP

统计就随便你了,想怎么统计都行
snwyq 2006-08-25
  • 打赏
  • 举报
回复
地區:北京
年限:2年
技術:.Net BS开发
工資:avg>>5K + 福利,几乎不加班,工作开心,心情愉快。
公司性質:汽车门户网站。

PS: 透露点消息,我们公司正在招.net BS开发人员,如果哪位同仁想换工作,是一个不错的机会选择,加richard_wung@hotmail.com 说应聘即可!
idda 2006-08-25
  • 打赏
  • 举报
回复
按自然天来计算吧,降低复杂度.不然你不好判断他那次开始点击算24小时内的第一次点击.得位没人人记录时间.如果按2自然天,你只要记住一个ip地址,一个点击次数即可.然后每天凌晨把所有点击次数清零
swazn_yj 2006-08-25
  • 打赏
  • 举报
回复
up!!
zhangaipl 2006-08-25
  • 打赏
  • 举报
回复
......记录这个ip到第10次点击的时候的时间,它再点击就要比较这个时间过没过24小时,然后再重新计数......
好像这个比较奇怪啊,如果这样的话我一天点10次,过23:59:59后才又可以点...不如简单点,统计00:00:00-23:59:59点击不能超过10次,到00:00:00把ip的点击数清0,
可能是我没理解,我觉得记录具体ip在什么时候点好像意义不大,这个需求似乎是要满足统计需要,因此是不是考虑根据报表来设计数据库会不会简单点,楼主解决了问题记得共享一下心得啊。
---------------------------------------------------------------------
同意这个说法。。没有必要去记录第10次的点击时间,每天过了0点就自动清0。
swazn_yj 2006-08-25
  • 打赏
  • 举报
回复
To:Reeezak(坚持信念)
我怕数据库顶不住!
snwyq 2006-08-24
  • 打赏
  • 举报
回复
地區:北京
年限:2年
技術:.Net BS开发
工資:avg>>5K + 福利,几乎不加班,工作开心,心情愉快。
公司性質:汽车门户网站。

PS: 透露点消息,我们公司正在招.net BS开发人员,如果哪位同仁想换工作,是一个不错的机会选择,加richard_wung@hotmail.com 说应聘即可!
swazn_yj 2006-08-24
  • 打赏
  • 举报
回复
up!!
guyes123 2006-08-24
  • 打赏
  • 举报
回复
看看
学学
接接分
whw123456 2006-08-24
  • 打赏
  • 举报
回复
up
hzh_wen_x 2006-08-24
  • 打赏
  • 举报
回复
up
yan63 2006-08-24
  • 打赏
  • 举报
回复
......记录这个ip到第10次点击的时候的时间,它再点击就要比较这个时间过没过24小时,然后再重新计数......
好像这个比较奇怪啊,如果这样的话我一天点10次,过23:59:59后才又可以点...不如简单点,统计00:00:00-23:59:59点击不能超过10次,到00:00:00把ip的点击数清0,
可能是我没理解,我觉得记录具体ip在什么时候点好像意义不大,这个需求似乎是要满足统计需要,因此是不是考虑根据报表来设计数据库会不会简单点,楼主解决了问题记得共享一下心得啊。
terryghz 2006-08-24
  • 打赏
  • 举报
回复
友情帮顶
swazn_yj 2006-08-24
  • 打赏
  • 举报
回复
再UP!
swazn_yj 2006-08-24
  • 打赏
  • 举报
回复
up!!
swazn_yj 2006-08-24
  • 打赏
  • 举报
回复
up!!
fds2003 2006-08-24
  • 打赏
  • 举报
回复
关注!!
wuluwulu 2006-08-24
  • 打赏
  • 举报
回复
感觉还是按自然天来算比较好...还要判断最后的记录和现在时间之差,比较麻烦
ww3347 2006-08-23
  • 打赏
  • 举报
回复
如果一定要省记录的话,可以为统计专门做一个表,数量级是每天W条
IP、日期、count01、count02... count24 ,记录每IP每小时有效点击数

IP进来,如果是有效hits,你就同时在这里相应UPDATE,其他不变。

PS:每天10W条也不是不可以接受:)
加载更多回复(3)

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧