zxtceq

MySQL常用命令
数据表结构设计
1. 系统功能
2. 表
2.1 用户表mmall_user
2.2 收货地址表mmall_shipping
2.3 商品表mmall_product
2.4 商品类别表mmall_category
2.5 购物车表mmall_cart
2.6 订单表 mmall_order
`2.7 订单明细表 mmall_order_item`
2.8 ~~账户表~~ `支付信息表mmall_pay_info`
1. 系统功能
用户管理、收货地址、商品管理、分类管理、购物车、订单管理、支付管理

2. 表
每张表都存了create_time和update_time,方便出现业务问题的时候定位问题的发生时间。当然一般日志中也会记录时间。

2.1 用户表mmall_user
id

username

password

email

phone

question 找回密码的问题

answer 问题答案

role 角色,0-管理员,1-普通用户 为啥role不是tinyint类型呢?

last_login

create_time

update_time

CREATE TABLE `mmall_user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT \'用户表id\',
`username` varchar(50) NOT NULL COMMENT \'用户名\',
`password` varchar(50) NOT NULL COMMENT \'用户密码,MD5加密\',
`email` varchar(50) DEFAULT NULL,
`phone` varchar(20) DEFAULT NULL,
`question` varchar(100) DEFAULT NULL COMMENT \'找回密码问题\',
`answer` varchar(100) DEFAULT NULL COMMENT \'找回密码答案\',
`role` int(4) NOT NULL COMMENT \'角色0-管理员,1-普通用户\',
`create_time` datetime NOT NULL COMMENT \'创建时间\',
`update_time` datetime NOT NULL COMMENT \'最后一次更新时间\',
PRIMARY KEY (`id`),
UNIQUE KEY `user_name_unique` (`username`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8;

AUTO_INCREMENT=22:从数字22后自增id,也就是说第一个id为23
UNIQUE KEY `user_name_unique` (`username`) USING BTREE:为username列创建唯一索引

2.2 收货地址表mmall_shipping
id
user_id
receiver_name 收货姓名
receiver_phone
receiver_mobile
country
province receiver_province
city receiver_city
street receiver_district 区/县
detail_adress receiver_address
receiver_zip 邮编
create_time
update_time
CREATE TABLE `mmall_shipping` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL COMMENT \'用户id\',
`receiver_name` varchar(20) DEFAULT NULL COMMENT \'收货姓名\',
`receiver_phone` varchar(20) DEFAULT NULL COMMENT \'收货固定电话\',
`receiver_mobile` varchar(20) DEFAULT NULL COMMENT \'收货移动电话\',
`receiver_province` varchar(20) DEFAULT NULL COMMENT \'省份\',
`receiver_city` varchar(20) DEFAULT NULL COMMENT \'城市\',
`receiver_district` varchar(20) DEFAULT NULL COMMENT \'区/县\',
`receiver_address` varchar(200) DEFAULT NULL COMMENT \'详细地址\',
`receiver_zip` varchar(6) DEFAULT NULL COMMENT \'邮编\',
`create_time` datetime DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8;

2.3 商品表mmall_product
id
category_ids category_id : 不考虑一个商品有可能同时属于多个类别的情况?
name
subtile 副标题
main_image 产品主图
images sub_images 产品其他图
detail
price
stock
status 商品状态,1-在售 2-下架 3-删除
create_time
update_time
CREATE TABLE `mmall_product` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT \'商品id\',
`category_id` int(11) NOT NULL COMMENT \'分类id,对应mmall_category表的主键\',
`name` varchar(100) NOT NULL COMMENT \'商品名称\',
`subtitle` varchar(200) DEFAULT NULL COMMENT \'商品副标题\',
`main_image` varchar(500) DEFAULT NULL COMMENT \'产品主图,url相对地址\',
`sub_images` text COMMENT \'图片地址,json格式,扩展用\',
`detail` text COMMENT \'商品详情\',
`price` decimal(20,2) NOT NULL COMMENT \'价格,单位-元保留两位小数\',
`stock` int(11) NOT NULL COMMENT \'库存数量\',
`status` int(6) DEFAULT \'1\' COMMENT \'商品状态.1-在售 2-下架 3-删除\',
`create_time` datetime DEFAULT NULL COMMENT \'创建时间\',
`update_time` datetime DEFAULT NULL COMMENT \'更新时间\',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8;

decimal(20,2) :最多18位整数位,保留两位小数

2.4 商品类别表mmall_category
id
parent_id 父类别id当id=0时说明是根节点,一级类别
name
status 类别状态1-正常,2-已废弃
sort_order \'排序编号,同类展示顺序,数值相等则自然排序
create_time
update_time
CREATE TABLE `mmall_category` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT \'类别Id\',
`parent_id` int(11) DEFAULT NULL COMMENT \'父类别id当id=0时说明是根节点,一级类别\',
`name` varchar(50) DEFAULT NULL COMMENT \'类别名称\',
`status` tinyint(1) DEFAULT \'1\' COMMENT \'类别状态1-正常,2-已废弃\',
`sort_order` int(4) DEFAULT NULL COMMENT \'排序编号,同类展示顺序,数值相等则自然排序\',
`create_time` datetime DEFAULT NULL COMMENT \'创建时间\',
`update_time` datetime DEFAULT NULL COMMENT \'更新时间\',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=100032 DEFAULT CHARSET=utf8;

商品类别是个树状结构,有可能会无限地扩展层级,遍历时递归结束条件是parent_id=0

2.5 购物车表mmall_cart
id
user_id
goods_list(List<GoodsVo>类型) product_id :可是一个用户的购物车有可能会有很多商品啊?所以这个购物车不是整个购物车,只是购物车中的某种商品。可另外创建Cartvo对象来放置多个mmall_cart。所以这个表不该叫购物车,应该叫购物车明细更贴切。
quantity 数量
checked 是否选择,1=已勾选,0=未勾选
create_time
update_time
CREATE TABLE `mmall_cart` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`product_id` int(11) DEFAULT NULL COMMENT \'商品id\',
`quantity` int(11) DEFAULT NULL COMMENT \'数量\',
`checked` int(11) DEFAULT NULL COMMENT \'是否选择,1=已勾选,0=未勾选\',
`create_time` datetime DEFAULT NULL COMMENT \'创建时间\',
`update_time` datetime DEFAULT NULL COMMENT \'更新时间\',
PRIMARY KEY (`id`),
KEY `user_id_index` (`user_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=146 DEFAULT CHARSET=utf8;

KEY `user_id_index` (`user_id`) USING BTREE:因为购物车一般都是通过user_id查询,所以为user_id创建索引,可提高查询效率。

一个POJO(普通Java对象)持久化以后就是PO
用作服务层需要接收返回的数据就是DTO
用作展示层需要显示的数据就是VO

2.6 订单表 mmall_order
id
order_no 订单号
user_id
address_id shipping_id 收货地址ID
goods_list(List<GoodsVo>类型) 订单表中不存商品信息,商品信息放到订单明细表中
total_price payment 应该是total_price减去优惠券啥的之后的实际付款金额,单位是元,保留两位小数,
payment_type 支付类型,1-在线支付
postage 运费,单位是元
status 订单状态:0-已取消,10-未付款,20-已付款,40-已发货,50-交易成功,60-交易关闭
payment_time 支付时间
send_time 发货时间
end_time 交易完成时间
close_time 交易关闭时间
create_time
update_time
CREATE TABLE `mmall_order` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT \'订单id\',
`order_no` bigint(20) DEFAULT NULL COMMENT \'订单号\',
`user_id` int(11) DEFAULT NULL COMMENT \'用户id\',
`shipping_id` int(11) DEFAULT NULL,
`payment` decimal(20,2) DEFAULT NULL COMMENT \'实际付款金额,单位是元,保留两位小数\',
`payment_type` int(4) DEFAULT NULL COMMENT \'支付类型,1-在线支付\',
`postage` int(10) DEFAULT NULL COMMENT \'运费,单位是元\',
`status` int(10) DEFAULT NULL COMMENT \'订单状态:0-已取消,10-未付款,20-已付款,40-已发货,50-交易成功,60-交易关闭\',
`payment_time` datetime DEFAULT NULL COMMENT \'支付时间\',
`send_time` datetime DEFAULT NULL COMMENT \'发货时间\',
`end_time` datetime DEFAULT NULL COMMENT \'交易完成时间\',
`close_time` datetime DEFAULT NULL COMMENT \'交易关闭时间\',
`create_time` datetime DEFAULT NULL COMMENT \'创建时间\',
`update_time` datetime DEFAULT NULL COMMENT \'更新时间\',
PRIMARY KEY (`id`),
UNIQUE KEY `order_no_index` (`order_no`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=118 DEFAULT CHARSET=utf8;


UNIQUE KEY `order_no_index` (`order_no`) USING BTREE:为订单号order_no创建唯一索引,订单号不能重复

2.7 订单明细表 mmall_order_item
id
user_id
order_no 一个订单明细只属于一个订单,但一个订单可能包含多个订单明细
product_id 一个订单明细记录一种商品
product_name 商品名应存储生成订单当时的商品名,后续不能通过商品ID来查询,因为可能会变更
product_image 商品主图片,也应存储当时的,后续可能会变更
current_unit_price 当时的单价,也可能会变更
quantity
total_price 单价*数量
create_time
update_time
CREATE TABLE `mmall_order_item` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT \'订单子表id\',
`user_id` int(11) DEFAULT NULL,
`order_no` bigint(20) DEFAULT NULL,
`product_id` int(11) DEFAULT NULL COMMENT \'商品id\',
`product_name` varchar(100) DEFAULT NULL COMMENT \'商品名称\',
`product_image` varchar(500) DEFAULT NULL COMMENT \'商品图片地址\',
`current_unit_price` decimal(20,2) DEFAULT NULL COMMENT \'生成订单时的商品单价,单位是元,保留两位小数\',
`quantity` int(10) DEFAULT NULL COMMENT \'商品数量\',
`total_price` decimal(20,2) DEFAULT NULL COMMENT \'商品总价,单位是元,保留两位小数\',
`create_time` datetime DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `order_no_index` (`order_no`) USING BTREE,
KEY `order_no_user_id_index` (`user_id`,`order_no`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=135 DEFAULT CHARSET=utf8;


为订单号order_no创建索引,方便通过订单号查询
为user_id和order_no创建联合索引,方便通过用户ID和订单号进行组合查询
订单明细表不能只作为vo对象,因为需要将它存储起来作为交易快照,方便之后查询。
而总购物车只是作为展示作用,无需存储到数据库中,故可以只将总购物车的每种商品明细存入数据库,而总购物车中的总价等信息存在内存中即可。

2.8 账户表 支付信息表mmall_pay_info
id
user_id
balance order_no 订单号
pay_password pay_platform 支付平台:1-支付宝,2-微信
platform_number 支付流水号
platform_status 支付状态
create_time
update_time
CREATE TABLE `mmall_pay_info` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL COMMENT \'用户id\',
`order_no` bigint(20) DEFAULT NULL COMMENT \'订单号\',
`pay_platform` int(10) DEFAULT NULL COMMENT \'支付平台:1-支付宝,2-微信\',
`platform_number` varchar(200) DEFAULT NULL COMMENT \'支付流水号\',
`platform_status` varchar(20) DEFAULT NULL COMMENT \'支付状态\',
`create_time` datetime DEFAULT NULL COMMENT \'创建时间\',
`update_time` datetime DEFAULT NULL COMMENT \'更新时间\',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=61 DEFAULT CHARSET=utf8;


支付信息需单独一张表,用于后续对账、退款等操作

分类:

技术点:

相关文章:

  • 2021-12-29
  • 2021-10-04
  • 2021-11-13
  • 2021-11-29
  • 2021-06-29
  • 2021-10-28
  • 2021-11-23
猜你喜欢
  • 2021-04-12
  • 2021-10-17
  • 2021-12-29
  • 2021-10-26
  • 2022-02-09
  • 2021-12-29
  • 2021-12-07
相关资源
相似解决方案