现在的位置: 首页 > 综合 > 正文

关于正确会员财务流水的数据库设计(请提意见)

2012年10月13日 ⁄ 综合 ⁄ 共 1617字 ⁄ 字号 评论关闭

表设计:
财务流水表 ms
 /****** 对象:  Table [dbo].[ms]    脚本日期: 09/12/2010 14:25:47 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[ms](
    [fcid] [int] IDENTITY(1,1) NOT NULL,--自增长ID
    [m] [int] NULL CONSTRAINT [DF__member_money__m__0519C6AF]  DEFAULT ((0)),--发生金额,收入时为正值,消费时为负值
    [d] [datetime] NULL,--日期时间
    [des] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,--摘要
    [mid] [int] NULL,--会员ID
    [ye] [int] NULL,--余额
 CONSTRAINT [PK__member_money__0425A276] PRIMARY KEY CLUSTERED
(
    [fcid] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

--充值与消费的存储过程
create proc pro_fc(@mid int,@m int,@des varchar(50))
 as
  
  declare @d datetime
  set @d =getdate()
  insert into ms(mid,m,d,des) values (@mid,@m,@d,@des)

--执行充值/消费的语句,并没有实时计算出余额
exec pro_fc 1001,1,'充值'
exec pro_fc 1001,-1,'消费'

--查询消费明细的语句
 select top 10 mid as 会员ID,d as 时间,des as 摘要,m 金额,余额 = (select sum(m) from ms b where fcid <= a.fcid and mid=1001 ) from  ms a where mid=1001 order by d

--结果
会员     日期                                 摘要  金额 余额
1001    2010-09-12 13:13:48.967    充值    1    1
1001    2010-09-12 13:13:48.967    消费    -1    0
1001    2010-09-12 13:15:06.513    充值    1    1
1001    2010-09-12 13:15:06.513    消费    -1    0
1001    2010-09-12 13:15:06.653    充值    1    1
1001    2010-09-12 13:15:06.653    消费    -1    0
1001    2010-09-12 13:15:06.840    充值    1    1
1001    2010-09-12 13:15:06.840    消费    -1    0
1001    2010-09-12 13:15:06.980    充值    1    1
1001    2010-09-12 13:15:06.980    消费    -1    0

说明:执行充值/消费时我用同一个用户ID1001 用ASP.NET 写了一个一次执行10000次插入(有消费有充值)的语句的网页, 再用另一个容器页写200个IFRAME来引用这个执行页, 且这个容器页在多个窗口中打开,日地就是为了模拟多用户同时(并发)插入记录的情况(您有没有发现上面的记录有消费和充值同时进行)
以上的结果是正确的,我最大的目的就是要得行每一次发生充值或消费时的正确余额,各位看官,本为我在充值与消费的存储过程中就计算出余额,但经测试,在并发情况下,得到的余额是不正确的.
现在这个方案虽然可行,但我认为--查询消费明细的语句这种方法效率低下,您有好的方法吗?

抱歉!评论已关闭.