对“关于购物车的想法”的一些回复(2)
作者:丁学 来源:丁学博客 发布时间:2009-03-10 18:15:00
问题: 2.关于并发?
原来我在开发自己的模拟网站的时候,曾经想到这样一个问题:如果一个客户在网站将一些图书放入了购物车,那么这些数量的图书是否应该从库存中减去呢?当时我是这样做了。我将购物车中相应图书的数量从数据库中减去,以防止此时其他用户看到”虚”的库存数量(如果没有减去,那么其他用户是可以购买的。
例如:库存中图书的数量是10本,客户A将10本放入自己的购物车,此时客户B也将10本放入自己的购物车,那么谁将购买到此书将成为一个矛盾)。不过我这样做的结果是,每当客户更新购物车的同时就会同数据库有一次交流,加大了数据服务器的负担。
Amazon.cn在这方面做的也不是很好,前些日子相信大家可能都遇到了当购买《深入理解操作系统》一书的时候,本来生成了订单,但是却在第二天告知缺货的事情。这一事件确实非常影响Amazon.cn的信誉,不知道现在他们的系统是否已经解决这一问题,不过现在《深入理解操作系统》一书的Joyo价已经今非昔比了。不知道各位高手是如何解决这一问题的,欢迎大家将自己的成功经验写在评论中。
回复: 首先说一下数据库服务器的负担,想一下每访问一个页面要对数据库进行多少次访问,然后想一下多次访问才能换来一次放购物车的操作(访问次数主要取决于网站易用性的设计,这是另外一个话题),所以,虽然在这里修改设计可以减轻一些数据库压力,但是这里并不是瓶颈,丁学认为不需要在这里太在意。
目前比较通用的做法,购物车的商品是不会立即扣减库存的,主要是为了防止有人通过购物车恶意占用商品,另外一般都会给一个冗余量,因为大部分购物车里的商品不会进入最终的成功订单,不可以让购物车影响销量,这是必须做到的。库存一般在订单成功提交的时候扣减库存,也就是用户在提交订单时,你还有一次机会提示用户没有库存了,所以更没有必须在放到购物车时就扣减库存。对于“成功订单”,并不是所有用户提交的订单都算成功订单,这里有一个自动审单的过程,这个程序不好写,但确实很重要,根据以前的数据分析、用户行为、用户信誉等经验性的数据来由系统在几分钟内自动对订单完成一次审核,审核力度与行业有关,这样可以杜绝大部分的假订单,其中一部分可能还要由自动审单系统转交人工审核。
这里有一个特殊情况,有一些特殊商品比如演唱会门票,可能会存在在线选座的行为,这种时候放购物车后留座变得比较有用,现在的做法一般是放购物车后立即留座,但某一段时间未成为真实订单的话就自动释放,比如十分钟,虽然无法完全杜绝恶意占座,不过可以解决多数问题。现在票务方面的成功订单和大部分其他行业不太一样,票务行业的在线选座成功订单的判断标准为是否已经成功支付,就是说除非你给钱了,不然只能给你留十分钟。
问题: 3.订单和订单明细同购物车的关系
我想这个问题可能一直是此类网站的一个大问题吧!前两天,CSTP的陈老师还曾在电话中面试我这道题,我当时很紧张,问题答的不是很清楚。其实这个问题简单的想并不难:两个表订单和明细,订单表中每列指向明细表中的对应列。外键就是订单表中的订单号。
回复: 这个问题比较简单,一种是放购物车里就当是订单了,拿一个状态标识一下,这种状态下订单是可修改的,购物车合并进订单系统(注意处理用户登录与非登录状态);第二种是有单独的购物车表,当最终提交订单时,复制购物车内的信息进订单和订单明细表。后一种用得比较多一些,具体选择哪个取决于行业和商品属性。
问题: 4.明细表中订单号的生成?
这个问题继承第3个问题,我一直不知道应该如何解决此问题。我有两个解决方案,一个是使用触发器,另一个是编程。前者在客户每次放入购物车中一种商品的同时增加一个明细,确认购买后生成订单,将明细表中的购买状态更改以触发触发器将生成一个订单号(当然这个订单号既可以在触发器中编程也可以是让订单表订单号的一列设置为自动生成序号)。后者将判断订单号,然后将其加1以生成新的订单号。但是这两个方案我总是觉得非常不好,很想知道在商用网站中订单号是如何处理的。
回复: 首先我个人认为触发器的方案不可取,理由不多说,不然又是一大坨。这里也有两种做法,一种是订单表自动生成编号,生成订单时,先写入订单表,然后取回订单号再更新订单明细表;另一种是按业务规则生成订单号,当订单号已知后随便先生成订单记录还是明细记录都可以,但是要保证明细记录最终一定有订单记录,不然会有很多诡异的明细项。后一种办法又有两种做法,一是订单号由数据库生成,一般采用临时表,好处是可以全业务通用流水号,另一种是订单号由程序生成,程序生成时可以使用GUID,但更好的办法是使用订单时间加标识值,时间部分可以根据订单量来确定粒度大小,标识部分采用有序编号,时间粒度还要考虑防止别人大概统计你的业务量(汗~~~这个也是另外的问题,很多做法,看情况了,改天有空再写个有关订单号生成的文章吧,先回复这么多,大概信息也够了……)


猜你喜欢
- 问题:我想每日从数据库里导出一些数据,内容基本上都是一样的,只是时间不同,比如导出一张表wjzcreate table wjz(id int
- 今日大致浏览了一下《High Performance Web Sites》。本书的中文版是《高性能网站建设指南》。本书另有对其中个别问题深入
- 通常说到外键,只会提到“外键的目的是确定资料的参考完整性(referential integrity)。”,但是外键具体包含哪些动作和含义呢
- 在网页设计中有一些通用的交互设计模式。网站导航各种各样的通用和大家熟知的设计模式,可以用来作为为网站创建有效地信息架构的基础。这篇指南涵盖了
- { hide_text } CSS文字隐藏总结报告最近整理的一份CSS文字隐藏的demo,总结了几种方法,希望得出一种最完美的方案放进自己的
- 长期以来一直以为iframe跟div一样都是块级元素,直到今天在一个群中看到一位朋友问到iframe怎么居中的时候,测试了下发现原来我一直对
- Howdy, 大家好,又是我~ 上一次我们简单的谈了一下font set和一些要注意的基本问题。今天我们继续字体这一话题,深入讲讲上次提到
- 请问如何实现复合查询?我们用下面的代码来实现动态生成查询条件,动态显示结果的复合查询。set database to databasenam
- newstudent.asp<script LANGUAGE=″vbscript″ RUNAT=″Server″&
- 记得当时我们要跟网友天下合作,需要这样的一个鼠标划过放大的列表效果,就写了一个效果截图:演示代码:<!DOCTYPE html PUB
- 综述:本文讨论了VBScript和 JScript之间的区别,以及它们的使用场合。推荐:Vbscript5.5中文语言参考手册chm格式下载
- 前段时间跟这suggest项目走,没想到这么一个小小的输入框居然会带来那么多的问题。首先来比较一下几个主流的搜索引擎的suggest效果。为
- 很多人可能认为门户网站首页设计只是把一些导航、资讯内容和广告堆积起来摆放得好看就可以了,虽然这个观点也并不是完全错误的,确实门户网站首页是由
- 如果要问做什么事是最有吸引力,那就是创建Web应用。Web设计者们对设计交互式的Web没有什么更好的办法,却对我们做桌面软件的同事投去少许羡
- 代码如下:set fso=server.createobject("scripting.filesystemobject"
- parent.html 中的代码为:<iframe marginwidth="0"
- 如: 0.625 取 1 2.1 取3 3.6 取4 <% if fix(a)>a then b=fix(a) else b=f
- 数据库系统是管理信息系统的核心,基于数据库的联机事务处理(OLTP)以及联机分析处理(OLAP)是银行、企业、政府等部门最为重要的计算机应用
- 在使用SQL Server 的过程,中由于经常需要从多个不同地点将数据集中起来或向多个地点复制数据,所以数据的导出,导入是极为常见的操作.我
- 研究网页编码很长时间了,因为最近要设计一个友情链接检测的VBS脚本,而与你链接的人的页面很可能是各种编码,以前采取的方法是:如果用GB231