一个订单系统分析的问题
由于购买的产品为域名,空间,推广等。所以涉及到续费的问题,
我原来的表中保存了订购人,产品,时间,
现在想加入订单续费及续费提示的功能,
我在订单表中加入一个字段表示过期时间,可以根据这个时间来进行提示要到期的订单,
可是续费的订单在处理上遇到了一些问题,
是和普通订单一样保存在订单表中,还是另放一张表中来做?
放在普通订单中,当订单续费一次后就有二条记录,那么续费提示的时候就很难找到正确的记录。
放在另外一张表中,查询的时候也比较麻烦,
有没有更好的解决办法?
问题点数:100、回复次数:23Top
1 楼sugarshop(SugarXu)回复于 2005-02-01 22:57:56 得分 2
再建一张表, 第二范式要求的Top
2 楼8988(晓月)回复于 2005-02-01 23:03:09 得分 10
在普通订单中加入一字段,默认值=空串,用来记录续费记录的ID,每续费一次,就加入一个ID,形成续费记录ID串表. 也便于查询是否续费和续费次数以及具体续费情况.
新建一个续费记录表,记录续费的具体情况,并将该记录的ID值在上面的字段中登记.Top
3 楼SuperBJack(我想飞翔)回复于 2005-02-01 23:08:22 得分 5
用开始时间和结束时间无法实现么?Top
4 楼zc1966()回复于 2005-02-02 08:57:28 得分 5
订单续费当然要放到订单表中,一个用户有若干个订单很正常,用户是否过期最好和订单分开,再建一用户表保存用户状态或有效期,每次一个用户有新订单发生,要对用户表中的有效期进行修正,这样比较规范!Top
5 楼ziyou_jo(Delphi_jo)回复于 2005-02-02 09:05:06 得分 5
赞同zc1966的说法Top
6 楼flyonet(人生如梦【★】梦如人生)回复于 2005-02-02 10:26:08 得分 10
再加一个续费字段不可以吗? 默认为0或者为空 这是第一次
1是第一次续费,2是第二次......Top
7 楼Cain(一苇渡江)回复于 2005-02-02 11:51:52 得分 10
比较赞同添加字段的想法,可以记录下续费次数和续费时间(字段内以‘|’分割每一次的续费记录),同时更新有效期。
如果拆分成两张表的话,数据量一上规模,在做统计分析的时候,可能会用到过多的联合查询,增加mysql负担...Top
8 楼ice_berg16(寻梦的稻草人)回复于 2005-02-02 12:29:17 得分 0
我也不想分成二张表,
一张表的话因为续费订单可能还有其它信息,比如去年域名为80元,今年涨到100元,
这样订单金额就会发生变化,这个变化记录应该还是要保存的,所以只标识是否续费还不行.Top
9 楼flyonet(人生如梦【★】梦如人生)回复于 2005-02-02 12:34:08 得分 0
我也不想分成二张表,
一张表的话因为续费订单可能还有其它信息,比如去年域名为80元,今年涨到100元,
这样订单金额就会发生变化,这个变化记录应该还是要保存的,所以只标识是否续费还不行.
---------------------------------------------------------------------------------------
订单金额?新的纪录如果是100,那么不就是标志着他的金额发生变化了吗?Top
10 楼ice_berg16(寻梦的稻草人)回复于 2005-02-02 17:13:38 得分 0
你的意思是续费的订单是做为一条独立的记录还是再原来记录上修改?
如果是原来的话,那么原来的信息不就丢失了吗?
新的话做续费提醒的时候要考虑取最新的一条记录信息才行Top
11 楼xuzuning(唠叨)回复于 2005-02-03 08:32:23 得分 30
定单续费等价于新定单,无另外用表保存的必要。
可在原表中增加表示定单状态的字段
如:
0 表示最初的定单,但现在已经过期
1 表示期间曾经生效,现在已经过期的定单
2 表示当前有效的定单
这样只需在查询时附加一个条件就可以了,其他无须改动
续费操作时与新增定单操作主要区别在于修改原定单的状态
Top
12 楼ice_berg16(寻梦的稻草人)回复于 2005-02-03 09:29:15 得分 0
保存定单有没有效的字段,我现在在考虑有没有什么用
我想可不可以这样,由于订单都保存了订购时间和过期时间
续费订单也一样,
那么我可以加一个字段代表这两个订单的附属关系 比如为order_id;
那么记录可能为如下格式
id product order_time expire_time money order_id
1 域名(xxx.com) 2004-01-01 2005-01-01 60.00 1
2 空间(100M) 2004-05-12 2005-05-12 500.00 2
3 域名(xxx.com) 2005-01-01 2006-01-01 60.00 1
........................
这样我在查询还有一个月到期的订单就可以这样
SELECT id, TO_DAYS(max(expire_time))-TO_DAYS(NOW()) AS left_days,
FROM `order`
GROUP BY order_id
HAVING left_days<30
不知这样可行否?Top
13 楼magicsnake(北极狐)回复于 2005-02-03 11:50:10 得分 0
附属ID的想法是好的,不过我想还要结合xuzuning(唠叨) 的方法,一共要增加两个字段
你现在的sql语句应该是不成立的,group by里的字段在select中不存在.所以要增加状态字段:
SELECT id, TO_DAYS(max(expire_time))-TO_DAYS(NOW()) AS left_days,
FROM order where status = '有效'
GROUP BY id
HAVING left_days<30
通过附属ID可以获得续费历史列表
select * from where order_id = '指定的订单' order by idTop
14 楼xuzuning(唠叨)回复于 2005-02-03 12:00:19 得分 0
通常对老用户都会用一些优惠的,所以保存历史情况是有用的
附加的字段应用于表示定单的有效性,过期的定单是无效的。
查询时不能使用group子句,该子句只在分组统计时有用,不能非统计字段的有效性。
Top
15 楼ice_berg16(寻梦的稻草人)回复于 2005-02-03 12:12:40 得分 0
我的SQL语句只能得到left_days的值,不能正确得到该值所对应的记录
要想正确得到组间最大值对应的记录,必须使用子查询或使用临时表的方法,
是这样吗?Top
16 楼magicsnake(北极狐)回复于 2005-02-03 14:16:17 得分 9
如果增加了状态字段,那么正常情况下,一个订单续单组只有一张是有效的.
所以只要这样查询:
select * from 'order' where status='有效' and (TO_DAYS(expire_time)-TO_DAYS(NOW())) < 30Top
17 楼xuzuning(唠叨)回复于 2005-02-03 14:25:28 得分 0
记录可能为如下格式
id product order_time expire_time money order_id
1 域名(xxx.com) 2004-01-01 2005-01-01 60.00 1
2 空间(100M) 2004-05-12 2005-05-12 500.00 2
3 域名(xxx.com) 2005-01-01 2006-01-01 60.00 2
........................
设order_id=2为有效定单
这样在查询还有一个月到期的订单就可以这样
SELECT id, TO_DAYS(max(expire_time))-TO_DAYS(NOW()) AS left_days,
FROM `order`
WHERE order_id=2
HAVING left_days<30
Top
18 楼ice_berg16(寻梦的稻草人)回复于 2005-02-03 15:25:44 得分 0
最后一个问题
关于有效和失效我觉得只有保存1,2就可以了, 0和1不都差不多吗?
Top
19 楼xuzuning(唠叨)回复于 2005-02-03 17:02:06 得分 0
取任何值都没有多大关系的。
不过既然有这个字段,何尝不用他来多保留些信息呢?
假定
0 表示最初的定单,但现在已经过期
1 表示期间曾经生效,现在已经过期的定单
2 表示当前有效的定单
那么想知道续费一次以上的用户,不就直接... WHERE order_id=0 就找到了吗?
宽度为1字节的数字型字段可存储10种状态
宽度为1字节的字符型字段可存储36种以上状态
利用一下有何不可?
Top
20 楼ice_berg16(寻梦的稻草人)回复于 2005-02-03 21:08:46 得分 0
to xuzuning(唠叨):
刚才看了一下你写的那个SQL
SELECT id, TO_DAYS(max(expire_time))-TO_DAYS(NOW()) AS left_days,
FROM `order`
WHERE order_id=2
HAVING left_days<30
既然不用GROUP我看不需要对expire_time求MAX吧,这样一来最多只能得到一条记录.Top
21 楼Meteorlet(http://smartdict.cn)回复于 2005-02-03 21:23:45 得分 8
我的建议,沿用以前的表,把续费当成另一条记录,通过order_id关联,另外再加一个字段表示续费次数,0表示没有续费,第一次交费,是否过期失效可以查expire_time字段Top
22 楼syre(神仙)回复于 2005-02-03 21:28:29 得分 6
虽然会有很多重复的字段,我还是觉得另开一个表比较好
Top
23 楼ice_berg16(寻梦的稻草人)回复于 2005-02-04 09:14:38 得分 0
反正都是要加两个字段的,一个用来关联,一个用来保存状态,
恩就这么定了Top




