非淡泊无以明志,非宁静无以致远。这篇文章主要讲述电商平台数据表设计相关的知识,希望能为你提供帮助。
上级目录:??电商平台设计??
1. 表结构设计1.1. 用户表
- sql
-- ----------------------------
--Table structure for `mmall_user`
-- ----------------------------
DROP TABLE IF EXISTS `mmall_user`;
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;
- 模型
- 注意:
- 用户名使用唯一性索引,避免用户名重复
- 密码使用非对称性加密,无法在数据库看到对应用户密码,可以使用BCrypt或者MD5不可逆加密
- 主键为用户ID,且自增长值为22
- 角色直接使用字段,用户表与角色表符合多对一.
- sql
-- ----------------------------
--Table structure for `mmall_category`
-- ----------------------------
DROP TABLE IF EXISTS `mmall_category`;
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;
- 模型
- 注意:
- 考虑分类树状的递归条件,假设父类别为0时为根节点,那么这就是停止递归的条件
- 增加类别状态,默认为1即正常
- 增加展示顺序,按照数值大小排序
- 主键为分类ID,自增长值为100032
- sql
-- ----------------------------
--Table structure for `mmall_product`
-- ----------------------------
DROP TABLE IF EXISTS `mmall_product`;
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;
- 模型
- 注意:
- 添加分类id,产品表与分类表符合多对一的特性,所以直接在表内加一个字段
- 产品主图可能用不上
- 添加图片地址,使用JSON格式确实是很方便存储多张图片,使用文件服务器或者OSS保存链接即可
- 添加商品详情,直接使用富文本对文件详情进行编辑
- 添加库存数量,实时更新
- 添加商品状态,默认1即在售
- 添加主键为产品ID
- 添加商品价格,使用decimal(20,2)类型,即18整数2小数的高精度类型
- sql
-- ----------------------------
--Table structure for `mmall_cart`
-- ----------------------------
DROP TABLE IF EXISTS `mmall_cart`;
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;
- 模型
- 注意:
- 增加用户ID,持久化购物车所属用户
- 增加商品ID
- 增加是否勾选项,默认为1,即已勾选
- 增加选购商品数量,不能为空
- 添加用户ID索引,提高查询效率
- 主键为购物车ID
- sql
-- ----------------------------
--Table structure for `mmall_pay_info`
-- ----------------------------
DROP TABLE IF EXISTS `mmall_pay_info`;
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;
- 项目
- 注意:
- 增加用户ID,可查看该用户所有类型支付信息
- 增加订单号,可以查看订单的支付信息
- 增加支付平台,支付宝与微信
- 增加支付宝支付流水号,由支付宝提供信息
- 增加支付宝支付状态.有支付宝提供信息
- 主键为支付信息ID
- sql
-- ----------------------------
--Table structure for `mmall_order`
-- ----------------------------
DROP TABLE IF EXISTS `mmall_order`;
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;
- 模型
- 注意:
- 添加订单号,唯一性约束
- 添加用户ID,查看用户所有i订单
- shpping_id,对应下单接受地址
- 增加实际付款金额,不能与产品金额联动
- 增加支付类型,只有在线支付
- 增加运费,包邮,单位为元
- 增加订单状态,包括已取消,已付款,已发货,交易成功,交易关闭,通过数字大小判断
- 增加支付时间,在支付宝完成支付之后,由支付宝回调
- 增加发货时间,商家确认付款后,自己选择发货
- 增加交易完成时间,即收货时
- 增加交易关闭时间,一般半小时未支付,取消订单
- 主键为订单ID
- sql
-- ----------------------------
--Table structure for `mmall_order_item`
-- ----------------------------
DROP TABLE IF EXISTS `mmall_order_item`;
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;
- 模型
- 注意:
- 增加用户ID,一个冗余字段,可以提高关于用户的查询效率并且避免表之间的关联
- 增加订单号,订单与订单明细一对多的关系,直接插入字段
- 增加商品ID,这里一个订单根据商品种类会有多个订单明细
- 增加商品图片地址,使用一张图即可,或许这就是主图的用处
- 增加商品名称,不能联动
- 增加商品单价,不能与商品实时单价联动,使用decimal(20,2)高精度类型
- 增加商品数量
- 增加商品总价,是商品单价与商品数量的乘积,使用decimal(20,2)高精度类型
- 使用订单号索引,提高搜索效率
- 使用订单号与用户组合索引,提高搜索效率
- 主键为订单明细ID
- sql
-- ----------------------------
--Table structure for `mmall_shipping`
-- ----------------------------
DROP TABLE IF EXISTS `mmall_shipping`;
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;
- 模型
- 增加用户ID.提高查询效率
- 其他基本都是详细地址
注册:存入用户表
- 登录:读取用户表
- 获取分类树
- 根据分类表中递归最下等该分类获取产品
- 与分类表是多对一的关系
- 用户ID,产品ID分别与用户表,产品表对应
- 使用用户ID获取对应用户的购物车详情
- 使用产品ID获取对应的产品信息
- 提交购物车后,生成订单
- 使用收获地址ID,拿到具体的收获地址
- 使用用户ID,查询对应用户订单
- 使用产品ID获取对应产品单价
- 根据具体订单号,获取多个订单详情
- 使用与订单相同的用户ID
- 与订单表是多对一的关系
- 使用订单号获取具体的订单支付详情
- 使用用户ID,获取对应用户的所有收货地址
- 与用户是多对一的关系
- 唯一索引
- 组合索引
- 时间戳
推荐阅读
- 更深层次的深度测试(由混合所引出)
- 生信实验记录(part1)--为Jupyter指定虚拟环境的Python解释器
- 微服务持续集成与部署-搭建
- 截止20220708日靠谱的k8s环境部署流程
- Spring Cloud OpenFeign文档
- 算法4-1.1.7分别给出以下代码段打印的值
- 官方推荐(6种Pandas读取Excel的方法,正确答案都写在源代码里了~太方便了)
- 第一次用到的触发器写法与使用链接
- R语言观察日志(part25)--将某列设置为行名