数据库设计问题,请有经验的指点

clyin 2003-10-18 09:45:09
数据库我现在做电信的应用,以前没有做过类似的应用,所有有许多困惑,请高人指点,分不是问题。
由于保密原因,我不便说明系统的具体需求,而是举一个类似的例子:
手机用户在系统中注册,收费分为两种:基本月租费和业务使用费。基本月租费按包月计算,不足一个月按一个月计,业务使用费按业务次数计。系统中建立两个表:用户表和业务表。在每个月月初统计上个月的费用。
用户表字段: 手机号码(PK),注册日期,注销日期,标志
业务表字段: 手机号码(FK),业务时间,标志
现有以下疑问:
1、用户从系统中注销后,由于系统还没有完成该月的计费,我不能把该用户从
用户表中简单删除,该用户关联的业务记录也不能删除。我的想法是修改用户表
的标志字段;但这带来一个问题,用户再次注册时会失败,因为该记录仍然存在。
这种情况最好的解决办法是什么?
2、计费应该如何操作?因为用户数量和业务数量巨大,直接统计会很耗时,我的想
法是建立一个统计表,每天夜里自动统计当天的业务并插入到统计表中,计费时直接从
统计表中进行统计。请问有没有更好的方法?
...全文
121 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
寒若辰 2003-11-04
  • 打赏
  • 举报
回复
另外再加一张表,这样一个号码在不同的时段可以有不同的用户。
可以这样设计:

手机号码 现在使用的记录号()

在你的用户表中加一个记录号字段,标记不同时期该号码的使用记录(和手机号一起作为主键)
同时业务表也加一个这样的记录号字段,和手机号码、记录号、月份一起作为主键。

我以前做过的我们这儿的联通就是这样的。
dreamworld 2003-11-01
  • 打赏
  • 举报
回复

" 第一个问题,把用户移到“注销用户表”,如何使业务表中的数据与之关联?业务表与"在线用户表"应该有外键约束的。"

数据关连是通过“手机号码”或“身份证号码”或“用户id”(有时还要有时间),只要保证用户表信息和业务表信息中有相同的字段,就可在任何情况下保证数据的关连。即使出现同一手机号码先后备多个人使用,同样可以保证数据关连的准确可靠。
业务表与用户表用外键约束不如通过TRIGGER保证数据的一致性。

另一个方法: “在线用户表”可以是我上面说的情况——是当前的“未注销用户”,还可以把“在线用户表”和“注销用户表”合并成一个“用户表”,同时再建立一个“在线用户表”。这样“在线用户表”就是“用户表”的一个子集,他们可通过TRIGGER保证一致性。

---------------------------------------
“第二个问题,业务数据是要查询的,统计完之后也不能删除”

没有删除数据。中间表(未统计记录表)保存的是当天的数据,已统计记录表保存的是所有已经统计的数据。所有业务记录是两个表的和。
smallcrocodile 2003-10-22
  • 打赏
  • 举报
回复
支持
北极星2013 2003-10-21
  • 打赏
  • 举报
回复
对于问题2,现在不都是实时计费吗?
我认为应该另外建表,生成计费数据,实时结果insert 即可。必要的时候
还要对计费数据进行分区,以提高性能。汇总的数据应该继续建表。
这样各种数据都有中间结果,也相当于记了日志,一旦发生数据丢失,
也都能找回来。
wuli81234 2003-10-21
  • 打赏
  • 举报
回复
对于第一个问题,我觉得应该做一个 触发器(trigger),当有相同ID注册的时候,就自动检查状态,然后把状态刷新就可以了吧~~~


对于第二个问题,我觉得应该这样做,业务表里面增加一个字段--“用户每项业务的统计”,然后分别为每一项业务建立一个业务表,这样不但方便统计,日后用户打印明细帐单的时候也很方便~

clyin 2003-10-21
  • 打赏
  • 举报
回复
to dreamworld:
第一个问题,把用户移到“注销用户表”,如何使业务表中的数据与之关联?业务表与"在线用户表"应该有外键约束的。

第二个问题,业务数据是要查询的,统计完之后也不能删除。

to xsh77830:
不想这样做是考虑性能问题,与被注销用户关联的业务数据量是很大的,如果在触发器或存储过程中这样做,会是一个相当耗时的操作
xsh7783 2003-10-21
  • 打赏
  • 举报
回复
对于第一个问题,看能不能再建个表,存每个月内消号用户的业务。当用户一消号时,就把此用户的信息另存到一个表上。同时把原表内此号的信息删除。
dreamworld 2003-10-21
  • 打赏
  • 举报
回复
考虑到计费系统的特点,要求数据可以追溯,所以删除数据要尽量小心,以免造成在日后查账时出现问题。
同时,考虑到效率的要求,对数据应该尽可能精简。虽然索引可以提高效率,但是索引设计需要考虑的问题很多(一个表会被太多的SQL使用,而且还有用户的需求变化),不是所有时候都能达到理想状态,有时甚至有负面效应。

根据以上两点,对于第一个问题,可以建立两个表,在线用户表和注销用户表(注销用户表主键可以考虑用自动增加)。用户注销后,从在线用户表中删除,同时在注销用户表中添加一条记录,并将记录标注为“未结帐”,结帐后,再将标志改为“已结帐”。这样既可以保证数据的完整性,又精简了在线用户表的记录数量。

第二个问题,你的方法可以,在你现有思路的基础上,可以设置两个表,未统计记录表和已统计记录表。所有发生的记录首先插入未统计记录表,每日对上一日发生的记录进行统计,统计后,将数据复制到已统计记录表中,而后删除。——这样相当于建立了一个中间表,中间表中的数据很少,统计运算都很快。而已统计记录表则存放历史数据,一般不再使用。但是统计结果需要保存在同一表中。
这样,中间表几乎总在内存中,统计时,会减少磁盘操作,极大的提高效率。
mosaic 2003-10-19
  • 打赏
  • 举报
回复
增加一个针对号码的流水号字段,对每个号码可以有多条记录,每次该号码的记录增加时流水号加1,如一开始为:
1308182818 1 有效

注销时标志位改为注销
1308182818 1 注销

再次注册时增加一条记录
1308182818 2 有效

并将号码和流水号字段作为主键。
jiez 2003-10-19
  • 打赏
  • 举报
回复
一。必须增加一个主键,可以将用户名(或用户ID)与手机号码同时作为用户表和业务表中的主键。
当某个用户注销手机时,将用户表中的标志置为“注销”,未结帐前所有信息均保留在数据库中。此时如果有另外一个用户来注册时,需要进行如下操作:
1、获得注册的用户名、手机号
2、如果按用户名、手机号在用户表中查询的得到存在的记录且标志为“注销”则说明该用户已经将手机号注销了,则可以直接将标志位中的“注销”信息删除,可以重新使用
3、按手机号查询用户表是否有存在的记录且标志是否为“注销”的记录,如果存在则该手机号可用,可以在用户表及业务表中插入相应的记录,否则手机号不能被注册
从而限制了手机号只能被一个用户一次性使用。

二。你的方法可行

Nickle_Final 2003-10-19
  • 打赏
  • 举报
回复
对于第一个问题,建议还是另外增加一个自增字段作为主键,业务表和该字段关联。
对于第二个问题,建议对表进行分区
chanet 2003-10-18
  • 打赏
  • 举报
回复
1. 可以结完帐之后,再删除记录.
或,分开表来处理.

2. 用临时表会快点
blackest 2003-10-18
  • 打赏
  • 举报
回复
1。把标志位作为标的主键。进行业务操作的时候判断标志位是否相同。
(建议把用户的注册业务的信息同用户的基本信息剥离,建立新的表)
2。所用的方法基本可行。

17,082

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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