对“关于购物车的想法”

问题: 1.购物车中的数据是否应该存储在数据库中?

特别想知道在真正的项目中,那些真正的软件工程师是如何考虑这个问题的。在Google上一搜,搜到了一篇咱园子里一位网友的观点:购物车应该是个临时存
储数据的模块,他将其存放在Session对象中。这位网友说的很有道理,不过我并不喜欢这样的做法。如果大家都将其存储在Session对象中,成千上
万个用户一同购物的话,想必ASP.NET服务器必将承受巨大的负载。也许像我们国内的网站可能会好一些,但想Amazon这样的网站,怎么做的
呢?Amazon中国网站,也就是Joyo的网站,并不是将其存储在Session对象中,因为我如果这次放入购物车中的商品没有提交订单,下次登录后购
物车中还会有这些商品。因此,我想他们可能是将这些购物车中的数据放入了数据库中。

回复: 把购物车存放在Session中,这种做法似乎只存在于大学里的课程设计或者一些无人在意的实习项目中出现。事实上,基本所有的电子商务网站都把购物车数据存放到了数据库里。下面是一些解释和设计上需要注意的地方:
1、Session并不适合做大数据量的数据存放,当用户比较多的时候势必影响服务器性能,这是应该避免的。
2、Session存在意外丢失的问题,或者当用户不小心关闭浏览器,都会引起购物车内物品全部丢失,用户体验很不好
3、Cookies可以解决上面一条里Session的问题,但是Cookies的长度限制,以及使用Cookies时的通讯开销,还有安全性方面考虑,Cookies并不适合做购物车
4、比较好的用户体验是,无论用户登录与否,都可以在一定时间内记录购物车状态,这就要求数据库内购物车不能与用户捆绑太死
5、放到购物车里的商品,一般都是有购买意向的商品,但并不一定会成为真实的订单,这时候,保留这份数据,对数据挖掘、业务分析有至关重要的作用

问题: 2.关于并发?
原来我在开发自己的模拟网站的时候,曾经想到这样一个问题:
如果一个客户在网站将一些图书放入了购物车,那么这些数量的图书是否应该从库存中减去呢?当时我是这样做了。我将购物车中相应图书的数量从数据库中减去,
以防止此时其他用户看到”虚”的库存数量(如果没有减去,那么其他用户是可以购买的。例如:库存中图书的数量是10本,客户A将10本放入自己的购物车,
此时客户B也将10本放入自己的购物车,那么谁将购买到此书将成为一个矛盾)。不过我这样做的结果是,每当客户更新购物车的同时就会同数据库有一次交流,
加大了数据服务器的负担。Amazon.cn在这方面做的也不是很好,前些日子相信大家可能都遇到了当购买《深入理解操作系统》一书的时候,本来生成了订
单,但是却在第二天告知缺货的事情。这一事件确实非常影响Amazon.cn的信誉,不知道现在他们的系统是否已经解决这一问题,不过现在《深入理解操作
系统》一书的Joyo价已经今非昔比了。不知道各位高手是如何解决这一问题的,欢迎大家将自己的成功经验写在评论中。

回复:
首先说一下数据库服务器的负担,想一下每访问一个页面要对数据库进行多少次访问,然后想一下多次访问才能换来一次放购物车的操作(访问次数主要取决于网站
易用性的设计,这是另外一个话题),所以,虽然在这里修改设计可以减轻一些数据库压力,但是这里并不是瓶颈,不需要在这里太在意。

目前比较通用的做法,购物车的商品是不会立即扣减库存的,主要是为了防止有人通过购物车恶意
占用商品,另外一般都会给一个冗余量,因为大部分购物车里的商品不会进入最终的成功订单,不可以让购物车影响销量,这是必须做到的。库存一般在订单成功提
交的时候扣减库存,也就是用户在提交订单时,你还有一次机会提示用户没有库存了,所以更没有必须在放到购物车时就扣减库存。对于“成功订单”,并不是所有
用户提交的订单都算成功订单,这里有一个自动审单的过程,这个程序不好写,但确实很重要,根据以前的数据分析、用户行为、用户信誉等经验性的数据来由系统
在几分钟内自动对订单完成一次审核,审核力度与行业有关,这样可以杜绝大部分的假订单,其中一部分可能还要由自动审单系统转交人工审核。

这里有一个特殊情况,有一些特殊商品比如演唱会门票,可能会存在在线选座的行为,这种时候放
购物车后留座变得比较有用,现在的做法一般是放购物车后立即留座,但某一段时间未成为真实订单的话就自动释放,比如十分钟,虽然无法完全杜绝恶意占座,不
过可以解决多数问题。现在票务方面的成功订单和大部分其他行业不太一样,票务行业的在线选座成功订单的判断标准为是否已经成功支付,就是说除非你给钱了,
不然只能给你留十分钟。

问题: 3.订单和订单明细同购物车的关系
我想这个问题可能一直是此类网站的一个大问题吧!前两天,CSTP的陈老师还曾在电话中面试我这道题,我当时很紧张,问题答的不是很清楚。其实这个问题简单的想并不难:两个表订单和明细,订单表中每列指向明细表中的对应列。外键就是订单表中的订单号。

回复:
这个问题比较简单,一种是放购物车里就当是订单了,拿一个状态标识一下,这种状态下订单是可修改的,购物车合并进订单系统(注意处理用户登录与非登录状
态);第二种是有单独的购物车表,当最终提交订单时,复制购物车内的信息进订单和订单明细表。后一种用得比较多一些,具体选择哪个取决于行业和商品属性。

问题: 4.明细表中订单号的生成?
这个问题继承第3个问题,我一直不知道应该如
何解决此问题。我有两个解决方案,一个是使用触发器,另一个是编程。前者在客户每次放入购物车中一种商品的同时增加一个明细,确认购买后生成订单,将明细
表中的购买状态更改以触发触发器将生成一个订单号(当然这个订单号既可以在触发器中编程也可以是让订单表订单号的一列设置为自动生成序号)。后者将判断订
单号,然后将其加1以生成新的订单号。但是这两个方案我总是觉得非常不好,很想知道在商用网站中订单号是如何处理的。

回复:
首先我个人认为触发器的方案不可取,理由不多说,不然又是一大坨。这里也有两种做法,一种是订单表自动生成编号,生成订单时,先写入订单表,然后取回订单
号再更新订单明细表;另一种是按业务规则生成订单号,当订单号已知后随便先生成订单记录还是明细记录都可以,但是要保证明细记录最终一定有订单记录,不然
会有很多诡异的明细项。后一种办法又有两种做法,一是订单号由数据库生成,一般采用临时表,好处是可以全业务通用流水号,另一种是订单号由程序生成,程序
生成时可以使用GUID,但更好的办法是使用订单时间加标识值,时间部分可以根据订单量来确定粒度大小,标识部分采用有序编号,时间粒度还要考虑防止别人
大概统计你的业务量(汗~~~这个也是另外的问题,很多做法,看情况了,改天有空再写个有关订单号生成的文章吧,先回复这么多,大概信息也够了……)

时间: 2024-10-06 14:16:09

对“关于购物车的想法”的相关文章

关于电商网站购物车功能如何与登录账号相关联的一点想法

最近在试着做电商网站,自然也需要涉及到实现购物车的功能.然后就想到去用cookie来完成购物车的功能. 实现过程是新建一个cookie,把购物车实体类的list放进去,每次给购物车新增商品和删除商品的时候就new一个新的cookie,把key设置成一样的就可以覆盖掉之前的cookie内容了,这样就可以实现每次实现更改购物车内容之后,更新cookie的功能了. 但是完成之后遇到了一个问题,就是如何把这个存在本地客户端的cookie购物车和登录的账号关联起来呢?总不能每个登录用户都共享同一个购物车吧

在WebForm中实现购物车思路

关于网站购物车的实现的思考 写在前面的话:刚来公司的的时候,老大安排了一个任务,企业站,但是需要实现购物车的功能,以前没做过,所有就向周围的人请教了一下如何实现购物车,自己也在网上搜了一下,有了些自己的认识,于是写了下来 1.实现思路: 在网上查了一下资料,以及向身边请教之后发现,对于网站购物车的实现大体分为三种方法:Session实现.Cookie实现.数据库实现,其实这三种实现,指的只是如何跟踪用户的操作,即用户购买物品,加入购物车,加入了什么物品,加入了多少物品等信息的暂时保存. 这三种方

常见B2C网站购物车的设计

对于大部分B2C网站来说,购物车是网站的咽喉之地,订单是白花花的银子,所有银子都必然流经购物车,购物车不能有失.优秀的购物车设计至少需要完成两项使命:一是方便用户多买货多掏银子:二是帮用户保管好待购的货品,方便下次接着掏银子. 购物车是个较复杂的系统,一般会跟订单.商品.库存.会员和促销等模块有暧昧关系,也算是牵一发而动全身.所以,在不了解购物车前,不宜轻易的指挥你的程序员修改购物车. 说了这么多,进入正题.本文较长,请耐心观看. 什么叫购物车,有何作用? 传统的购物车一般指超市中顾客去结算前暂

微信 小程序组件 加入购物车全套 one js

// pages/shop/shop.js Page({ /** * 页面的初始数据 */ data: { carts: [ { teaname: '冠军乌龙茶-150g', image: '../../imgs/car/shopping_pic_1.png', num: '1', price: '1200.00', sum: '1200.0', selected: true, cid: 1001, }, { teaname: '18年老茶-150g', image: '../../imgs/c

微信 小程序组件 加入购物车全套 one wxml

<!--pages/shop/shop.wxml--> <view wx:if="{{hasList}}"> <view class="container carts-list"> <view wx:key="isshop" wx:for="{{carts}}" class="carts-item" > <view class="carts-c

一个配置表优化的想法

今天下班在班车上想了一个关于配置表存储的小优化,起因是早上的时候发现了一个bug,这个bug是由于在运行时动态更改了一个列表配置导致的. 其实关于这种运行时"偷偷"改配置的问题我之前也有考虑过,这种应该是一不小心就会写出的,这不终于都出了一个. 至于如何预防这种问题,我认为在python里面似乎也没有什么好的解决方法,因为它不像c++有const语义,但有一个稍尽人事的预防措施就是把列表型的配置读成元组(tuple).而由此衍生出的一个想法便是:把配置表中所有的列表型配置都读成共享的元

看死亡笔记后的想法(一)

最近在看Death Note,特别是逮捕火口的前后几集,很精彩,也有了自己的一些看法. 逮捕火口之前,八人会议中的三位高管聚到一起商议,他们八人中到底谁是基拉,他们都认为是火口,看来公司高管没有一个是简单的呢 他们认为是火口的原因之一是他看起来对名利毫不在意,我的想法是 一个人表现出对什么东西越是装作不在意,就可能越是在意. 对一些东西,比如钱,或者地位,大家都想要的东西,某个人对它并不在意,这是否如他所说,就值得怀疑 并且,如果这个人的身份跟他的话矛盾,比如是公司高管,但天天说自己不在意地位和

easymall项目的商品删除,前台商品分页,商品详情,购物车模块

简单的挑选一下昨天所学的重点知识模块,以备后续的复习 一.购物车模块1.1购物车两种实现的区别:!!!!!!!! 用session保存  缺点:浏览器关闭,session失效时保存在session中购物信息将会消失  后续优化,将购买的信息除了保存在session中以外,还要将购物的信息保存在cookie中,这样  就解决了浏览器关闭购买商品信息丢失的问题(但是解决不了跟换电脑信息丢失的问题)  优点:不用操作数据库,可以减少数据库访问压力 数据库中:  缺点:只用登录的用户才能添加购物车   

java web 开发 购物车功能的实现

为了方便自己以后复习,所以写的比较仔细,记录下自己的成长..... 既然是做购物车,那么前提条件是首先需要一系列商品,也就是要建一个实体,这里建了一个商品表. 通过查询在浏览器上显示 基本显示已经做好了,现在进入我们的重头戏,Servlet 点击放入购物车时,将访问Servlet 购物车代码 1 package com.servlet; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 import java.util