本系列记录了我以电商秒杀系统为载体学习ssm框架整合的学习记录。如果能帮助到你,我不胜荣幸!
首先介绍一下这次要做的项目,是一个电商平台的秒杀系统。主要包括的功能是给定商品信息和秒杀时间段,用户可以以较低价格“秒杀“到这个产品(一人一次机会)。如果重复秒杀或库存为零或时间不正确,都将提示无法秒杀。目前前端页面还在开发中故无法贴图。等到最后会在这里补上项目效果图。
web开发中首先也是最重要的一环是数据表结构的设计。这次的秒杀系统的数据表设计比较简单(因为只是一个小功能,并不是一个完整的web项目),需要两张表。首先建立数据库:
CREATE DATABASE seckill;
USE seckill;
第一张表,秒杀商品信息表:
CREATE TABLE seckill(
`seckill_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '商品库存id',
`name` VARCHAR(120) NOT NULL COMMENT '商品名称',
`number` INT NOT NULL COMMENT '库存数量',
`start_time` TIMESTAMP NOT NULL COMMENT '秒杀开始时间',
`end_time` TIMESTAMP NOT NULL COMMENT '秒杀结束时间',
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (seckill_id),
KEY idx_start_time (start_time),
KEY idx_end_time (end_time),
KEY idx_create_time (create_time)
)ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8 COMMENT='秒杀库存表';
TIMESTAMP 和时区相关,更能反映当前时间。当插入日期时,会先转换为本地时区后再存放;当查询日期时,会将日期转换为本地时区后再显示。所以不同时区的人看到的同一时间是不一样的。其中默认值CURRENT_TIMESTAMP是本机时间。给三列时间创建索引的目的是为了加速查询速度。
第二张表,秒杀成功信息记录表:
CREATE TABLE success_killed(
`seckill_id` BIGINT NOT NULL COMMENT '秒杀商品id',
`user_phone` BIGINT NOT NULL COMMENT '用户手机号',
`state` TINYINT NOT NULL DEFAULT -1 COMMENT '状态标识:-1无效,0成功,1已付款',
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '秒杀成功时间',
PRIMARY KEY (seckill_id, user_phone), /*联合主键,防止重复秒杀*/
KEY idx_create_time (create_time)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='秒杀成功明细表';
这里需要注意的是,使用了产品id加用户手机号两列作为联合主键,这样可以确保秒杀记录的唯一性,可以杜绝重复秒杀行为。