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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
数据流向:
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进行写入)
注意:没有用外键和触发器,数据库扩展时很麻烦。