数据库表结构

1.用户表:

 1 /*用户表*/
 2 /*
 3 CREATE TABLE user (
 4     id int(11) NOT NULL AUTO_INCREMENT COMMENT '用户表id',
 5     username varchar(50) NOT NULL COMMENT '用户名',
 6     password varchar(50) NOT NULL COMMENT '用户密码,MD5加密',
 7     email varchar(50) DEFAULT NULL,
 8     phone varchar(50) DEFAULT NULL,
 9     question varchar(100) DEFAULT NULL COMMENT '找回密码问题',
10     answer varchar(100) DEFAULT NULL COMMENT '找回密码答案',
11     role int(4) NOT NULL COMMENT '角色0-管理员,1-普通用户',
12     create_time datetime NOT NULL COMMENT '创建时间',
13     update_time datetime NOT NULL COMMENT '最后一次更新时间',
14     PRIMARY KEY(id),
15     UNIQUE KEY user_name_unique(username) USING BTREE
16 ) ENGINE = InnoDB AUTO_INCREMENT = 21 DEFAULT CHARSET = utf8
17 */
View Code

ps:将用户名在数据库层面锁定唯一性,可以避免在业务层面再进行加锁同步处理。

2.分类表:

 1 /*分类表*/
 2 /*
 3 CREATE TABLE category(
 4     id int(11) NOT NULL AUTO_INCREMENT COMMENT '类别id',
 5     parent_id int(11) DEFAULT NULL COMMENT '父类别id,当id=0时说明是根节点,一级类别',
 6     name varchar(50) DEFAULT NULL COMMENT '类别名称',
 7     status tinyint(1) DEFAULT '1' COMMENT '类别状态1-正常,2-已废弃',
 8     sort_order int(4) DEFAULT NULL COMMENT '排序编号,同类展示顺序,数值相等则自然排序',
 9     create_time datetime DEFAULT NULL COMMENT '创建时间',
10     update_time datetime DEFAULT NULL COMMENT '更新时间',
11     PRIMARY KEY(id)
12 ) ENGINE = InnoDB AUTO_INCREMENT = 100032 DEFAULT CHARSET = utf8
13 */
View Code

ps:parent_id作用:这个表需要考虑递归性,并且这个分类有可能是无限层级扩展,我们需要一个递归结束条件。所以这里我们添加一个parent_id属性,当parent_id=0时递归结束。

3.产品表:

 1 /*产品表*/
 2 /*
 3 CREATE TABLE product(
 4     id int(11) NOT NULL AUTO_INCREMENT COMMENT '商品id',
 5     category_id int(11) NOT NULL COMMENT '分类id,对应category表的主键',
 6     name varchar(100) NOT NULL COMMENT '商品名称',
 7     subtitle varchar(200) DEFAULT NULL COMMENT '商品副标题',
 8     main_image varchar(500) DEFAULT NULL COMMENT '产品主图,url相对地址',
 9     sub_images text COMMENT '图片地址,json格式,扩展用',
10     detail text COMMENT '商品详情',
11     price decimal(20,2) NOT NULL COMMENT '价格,单位-元,保留两位小数',
12     stock int(11) NOT NULL COMMENT '库存数量',
13     status int(6) DEFAULT '1' COMMENT '商品状态,1-在售,2-下架,3-删除',
14     create_time datetime DEFAULT NULL COMMENT '创建时间',
15     update_time datetime DEFAULT NULL COMMENT '更新时间',
16     PRIMARY KEY(id)
17 ) ENGINE = InnoDB AUTO_INCREMENT = 26 DEFAULT CHARSET = utf8
18 */
View Code

ps:为什么存url相对地址?业务层在获取主图的时候,我们把图片服务器的前缀拿到之后和main_image进行拼接,这样即使图片服务器迁移,或者域名修改,我们也只需要改代码里的配置文件。

4.购物车表:

 1 /*购物车表*/
 2 /*
 3 CREATE TABLE cart(
 4     id int(11) NOT NULL AUTO_INCREMENT,
 5     user_id int(11) NOT NULL,
 6     product_id int(11) DEFAULT NULL COMMENT '商品id',
 7     quantity int(11) DEFAULT NULL COMMENT '商品数量',
 8     checked int(11)  DEFAULT NULL COMMENT '是否选择,1-已勾选,0-未勾选',
 9     create_time datetime DEFAULT NULL COMMENT '创建时间',
10     update_time datetime DEFAULT NULL COMMENT '更新时间',
11     PRIMARY KEY(id),
12     KEY user_id_index(user_id) USING BTREE
13 ) ENGINE = InnoDB AUTO_INCREMENT = 121 DEFAULT CHARSET = utf8
14 */
View Code

ps:添加了user_id的索引,因为经常利用user_id来查询此表。

5.支付信息表:

 1 /*支付信息表*/
 2 /*
 3 CREATE TABLE pay_info(
 4     id int(11) NOT NULL AUTO_INCREMENT,
 5     user_id int(11) DEFAULT NULL COMMENT '用户id',
 6     order_no bigint(20) DEFAULT NULL COMMENT '订单号',
 7     pay_platform int(10) DEFAULT NULL COMMENT '支付平台:1-支付宝,2-微信',
 8     platform_number varchar(200) DEFAULT NULL COMMENT '支付宝支付流水号',
 9     platform_status varchar(20) DEFAULT NULL COMMENT '支付宝支付状态',
10     create_time datetime DEFAULT NULL COMMENT '创建时间',
11     update_time datetime DEFAULT NULL COMMENT '更新时间',
12     PRIMARY KEY(id)
13 ) ENGINE = InnoDB AUTO_INCREMENT = 53 DEFAULT CHARSET = utf8
14 */
View Code

ps:platform_number解释:生成订单发起支付请求后,会生成远程的支付宝流水号。

6.订单表:

 1 /*订单表*/
 2 /*
 3 CREATE TABLE mall_order(
 4     id int(11) NOT NULL AUTO_INCREMENT COMMENT '订单id',
 5     order_no bigint(20) DEFAULT NULL COMMENT '订单号',
 6     user_id int(11) DEFAULT NULL COMMENT '用户id',
 7     shipping_id int(11) DEFAULT NULL,
 8     payment decimal(20,2) DEFAULT NULL COMMENT '实际付款金额,单位是元,保留两位小数,整数部分为18位',
 9     payment_type int(4) DEFAULT NULL COMMENT '支付类型,1-在线支付',
10     postage int(10) DEFAULT NULL COMMENT '运费,但会是元',
11     status int(10) DEFAULT NULL COMMENT '订单状态:0-已取消,10-未付款,20-已付款,40-已发货,50-交易成功,60-交易关闭',
12     payment_time datetime DEFAULT NULL COMMENT '支付时间',
13     send_time datetime DEFAULT NULL COMMENT '发货时间',
14     end_time datetime DEFAULT NULL COMMENT '交易完成时间',
15     close_time datetime DEFAULT NULL COMMENT '交易关闭时间',
16     create_time datetime DEFAULT NULL COMMENT '创建时间',
17     update_time datetime DEFAULT NULL COMMENT '更新时间',
18     PRIMARY KEY(id),
19     UNIQUE KEY order_no_index(order_no) USING BTREE
20 ) ENGINE = InnoDB AUTO_INCREMENT = 103 DEFAULT CHARSET = utf8
21 */
View Code

ps:对订单号添加了唯一索引。

7.订单明细表:

 1 /*订单明细表*/
 2 /*
 3 CREATE TABLE order_item(
 4     id int(11) NOT NULL AUTO_INCREMENT COMMENT '订单子表id',
 5     user_id int(11) DEFAULT NULL,
 6     order_no bigint(20) DEFAULT NULL,
 7     product_id int(11) DEFAULT NULL COMMENT '商品id',
 8     product_name varchar(100) DEFAULT NULL COMMENT '商品名称',
 9     product_image varchar(500) DEFAULT NULL COMMENT '商品图片地址',
10     current_unit_price decimal(20,2) DEFAULT NULL COMMENT '生成订单时的商品单价,单位是元,保留两位小数',
11     quantity int(10) DEFAULT NULL COMMENT '商品数量',
12     total_price decimal(20,2) DEFAULT NULL COMMENT '商品总价,单位是元,保留两位小数',
13     create_time datetime DEFAULT NULL,
14     update_time datetime DEFAULT NULL,
15     PRIMARY KEY(id),
16     KEY order_no_index(order_no) USING BTREE,
17     KEY order_no_user_id_index(user_id, order_no) USING BTREE
18 ) ENGINE = InnoDB AUTO_INCREMENT = 113 DEFAULT CHARSET = utf8
19 */
View Code

ps:

1)这里的user_id其实是一个冗余属性,这里本可以通过order_no连表mall_order,然后查询到user_id,但是这里直接建立user_id属性,可以在查询的时候不用进行关联查询,直接单表查询可以节省查询时间。

2)这里product_name和product_image可以理解为商品详情的快照,本来可以通过商品id关联product表来查询商品名称和图片,但是这里直接将其存下来,是防止在用户下单后,店家更改该商品的属性,导致用户再次来查看已购订单时商品不一致问题。比如我买的时候是一双手套,过了几天店家将其改成了袜子等。

3)total_price属性解释:本来可以在查表之后利用业务逻辑来计算其订单总价,这里在其生成订单的时候直接计算将其持久化,方便存取。(为啥我觉得在业务层处理也是可以的。。。)

4)这里对user_id和order_no添加了组合索引

8.收货地址表:

 1 /*收货地址*/
 2 /*
 3 CREATE TABLE shipping(
 4     id int(11) NOT NULL AUTO_INCREMENT,
 5     user_id int(11) DEFAULT NULL COMMENT '用户id',
 6     receiver_name varchar(20) DEFAULT NULL COMMENT '收货姓名',
 7     receiver_phone varchar(20) DEFAULT NULL COMMENT '收货固定电话',
 8     receiver_mobile varchar(20) DEFAULT NULL COMMENT '收获移动电话',
 9     receiver_province varchar(20) DEFAULT NULL COMMENT '省份',
10     receiver_city varchar(20) DEFAULT NULL COMMENT '城市',
11     receiver_district varchar(20) DEFAULT NULL COMMENT '区/县',
12     receiver_address varchar(200) DEFAULT NULL COMMENT '详细地址',
13     receiver_zip varchar(6) DEFAULT NULL COMMENT '邮编',
14     create_time datetime DEFAULT NULL,
15     create_tiem datetime DEFAULT NULL,
16     PRIMARY KEY(id)
17 ) ENGINE = InnoDB AUTO_INCREMENT = 32 DEFAULT CHARSET = utf8
18 */
View Code

 

数据流向:

1.注册(存入user表)->登录(根据user表进行验证)。

2.搜索产品(根据关键字或category_id),如果category_id级别较高,会对category分类表进行递归查询,然后将符合该分类的和关键字的product商品集合返回。

3.将产品添加购物车(将product_id以及user_id同时存入cart表,并将产品数量和是否勾选持久化)。

4.勾选购物车中商品生成订单(对shipping收货地址表进行管理->mall_order生成order_no存入,shipping_id从shipping表获取,payment会对product表进行计算然后存入)。

5.支付(接到支付宝的回调,将信息存入pay_info表中,对回调状态进行判断,如果支付成功,对mall_order表的payment_type进行写入)

注意:没有用外键和触发器,数据库扩展时很麻烦。

 

posted on 2017-11-07 16:20  二十年后20  阅读(497)  评论(0编辑  收藏  举报

导航