电商大伙天天都在用,相似某猫,某狗等。 电商系统设计看似复杂又很简单,看似简单又很复杂 本章适合初级工程师及中级工程师细看,大佬请随意程序员
商品系统与订单系统(交易系统)是相铺相成的,当买家购买商品后将经历一个过程数据库
商品系统->交易系统->订单系统->物流系统->售后系统express
完成上述流程则是完成了一笔交易,常常网上购物的童鞋都懂这个。今天咱们讲下从商品系统到交易系统和订单系统的存储过程及其设计上的应该注意的“坑”。bash
前俩篇文章讲解的商品系统的SKU与SPU的设计过程微信
如今咱们已经清楚商品系统数据表的设计而且清楚为何要这样设计。数据结构
如今抛出了一个问题app
用户购买的商品如何存储到订单/交易系统中?编码
如今有这么一个场景url
小明在某宝买了一部爱疯手机,颜色是红色,存储是32G,他选择使用某宝支付.spa
SKU | 产品 | 颜色 | 存储 |
---|---|---|---|
001 | 爱疯手机 | 红色 | 32G |
002 | 爱疯手机 | 红色 | 256G |
003 | 爱疯手机 | 黑色 | 32G |
004 | 爱疯手机 | 黑色 | 256G |
小明选择购买SKU=001的产品,正常状况下订单表应该与此SKU编码相关联来维持数据一致性。像这样
订单号 | 用户 | SKU |
---|---|---|
SN110 | 小明 | 001 |
这种设计有个弊端,商品的名称及价格都不是固定,若是商户修改了商品的标题或者其余的属性,那小明当时买的爱疯手机是8000元,结果过了几年降价了商户修改了价格,结果小明的购买清单里也变成了修改后的价格,因此说这种仅仅关联的设计是不可取的(至少在电商系统中不可取)。
订单号 | 用户 | SKU | 商品标题 | 商品价格 | 商品封面图 | 商品其余属性 |
---|---|---|---|---|---|---|
SN110 | 小明 | 001 | 爱疯手机 | 8000 | aifeng.png | 其余属性 |
像上表中设计,有人会问了 “那关联的意义何在呢?”
个人回答是 “保持数据关联” ,虽然商户有可能改变商品属性,但做为一名程序员,应该尽量的记录用户全部的动做。
文末有订单表的数据结构
实际在电商系统设计上,我的感受不该区分多商户的电商与单用户的电商(至少开发者不该区分他们),但前期设计上就应把多商户概念带入到系统内。哪怕只有一个官方专卖店呢?!
涉及到多商户就须要考虑用户统一下单问题了。
关于多商户的问题不是本章的重点,本次我先提出这几个疑问,感兴趣的同窗能够提早思考下,后续文章会详细讲解
订单是由购物车下单,多个商品来自多个商户
若是下单是来自多个商户的商品,那么订单的数据库接口应该这样设计
订单表
订单号 | 用户 |
---|---|
SN110 | 小明 |
订单详情表
订单号 | SKU | 用户 | 商户 |
---|---|---|---|
SN110 | 001 | 小明 | 官方 |
SN110 | 002 | 小明 | 第三方 |
不管购买多少商品而且商品归属于多少个商户,咱们都应把用户一次性购买的商品归属与一个订单,订单下再关联多个商品的详情。在售后操做上,也方便买家退换单个商品。
文末有详细数据结构设计
这里提供下功能名称与URL为参考
菜单名称 | URL |
---|---|
商品管理 | /product |
发布商品 | /product/create |
商品类目 | /product/category |
品牌管理 | /product/brand |
规格管理 | /product/attribute |
回收站 | /product/recycle |
订单列表 | /order |
后台的设计和操做套路我会单独拿一篇文章来介绍。这里只作一个大概的table。
CREATE TABLE `order` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`order_no` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '订单编号',
`order_sn` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '交易号',
`member_id` int(11) NOT NULL COMMENT '客户编号',
`supplier_id` int(11) DEFAULT '0' COMMENT '商户编码',
`supplier_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '商户名称',
`order_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '订单状态 0未付款,1已付款,2已发货,3已签收,-1退货申请,-2退货中,-3已退货,-4取消交易 -5撤销申请',
`after_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '用户售后状态 0 未发起售后 1 申请售后 -1 售后已取消 2 处理中 200 处理完毕',
`product_count` int(11) NOT NULL DEFAULT '0' COMMENT '商品数量',
`product_amount_total` decimal(12,4) NOT NULL COMMENT '商品总价',
`order_amount_total` decimal(12,4) NOT NULL DEFAULT '0.0000' COMMENT '实际付款金额',
`logistics_fee` decimal(12,4) NOT NULL COMMENT '运费金额',
`address_id` int(11) NOT NULL COMMENT '收货地址编码',
`pay_channel` tinyint(4) NOT NULL DEFAULT '0' COMMENT '支付渠道 0余额 1微信 2支付宝',
`out_trade_no` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '订单支付单号',
`escrow_trade_no` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '第三方支付流水号',
`pay_time` int(11) NOT NULL DEFAULT '0' COMMENT '付款时间',
`delivery_time` int(11) NOT NULL DEFAULT '0' COMMENT '发货时间',
`order_settlement_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '订单结算状态 0未结算 1已结算',
`order_settlement_time` int(11) NOT NULL DEFAULT '0' COMMENT '订单结算时间',
`is_package` enum('0','1') COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '是不是套餐',
`is_integral` enum('0','1') COLLATE utf8mb4_unicode_ci DEFAULT '0' COMMENT '是不是积分产品',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
`deleted_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `order_order_sn_member_id_order_status_out_trade_no_index` (`order_sn`,`member_id`,`order_status`,`out_trade_no`(191))
) ENGINE=InnoDB AUTO_INCREMENT=114 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
复制代码
CREATE TABLE `order_detail` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`order_id` int(11) NOT NULL COMMENT '订单编码',
`product_id` int(11) NOT NULL COMMENT '商品编码',
`product_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商品名称',
`product_price` decimal(12,4) NOT NULL COMMENT '商品价格',
`product_sku` int(11) NOT NULL COMMENT '商品SKU',
`product_picture_url` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`product_mode_desc` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商品型号信息',
`product_mode_params` int(11) DEFAULT NULL COMMENT '商品型号参数',
`discount_rate` tinyint(4) NOT NULL DEFAULT '0' COMMENT '折扣比例',
`discount_amount` decimal(12,4) NOT NULL DEFAULT '0.0000' COMMENT '折扣比例',
`number` int(11) NOT NULL DEFAULT '1' COMMENT '购买数量',
`subtotal` decimal(12,4) NOT NULL COMMENT '小计金额',
`is_product_exists` enum('0','1') COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '商品是否有效 1失效',
`remark` text COLLATE utf8mb4_unicode_ci COMMENT '客户商品备注',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `order_detail_order_id_index` (`order_id`)
) ENGINE=InnoDB AUTO_INCREMENT=118 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
复制代码
CREATE TABLE `order_logistics` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`order_id` int(11) NOT NULL COMMENT '订单编码',
`express_no` varchar(125) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '发货快递单号',
`consignee_realname` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '收货人姓名',
`consignee_telphone` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '联系电话',
`consignee_telphone2` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备用联系电话',
`consignee_address` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '收货地址',
`consignee_zip` int(11) NOT NULL COMMENT '邮政编码',
`logistics_type` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '物流方式',
`logistics_fee` decimal(12,2) NOT NULL DEFAULT '0.00' COMMENT '物流发货运费',
`order_logistics_status` int(11) NOT NULL DEFAULT '0' COMMENT '物流状态',
`logistics_settlement_status` int(11) NOT NULL DEFAULT '0' COMMENT '物流结算状态',
`logistics_result_last` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '物流最后状态描述',
`logistics_result` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '物流描述',
`logistics_create_time` int(11) NOT NULL DEFAULT '0' COMMENT '发货时间',
`logistics_update_time` int(11) NOT NULL DEFAULT '0' COMMENT '物流更新时间',
`logistics_settlement_time` int(11) NOT NULL DEFAULT '0' COMMENT '物流结算时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=114 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
复制代码
CREATE TABLE `order_returns` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`returns_no` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '退货编号 供客户查询',
`order_id` int(11) NOT NULL COMMENT '订单编号',
`express_no` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '物流单号',
`consignee_realname` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '收货人姓名',
`consignee_telphone` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '联系电话',
`consignee_telphone2` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '备用联系电话',
`consignee_address` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '收货地址',
`consignee_zip` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '邮政编码',
`logistics_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '物流方式',
`logistics_fee` decimal(12,2) NOT NULL COMMENT '物流发货运费',
`order_logistics_status` int(11) DEFAULT NULL COMMENT '物流状态',
`logistics_settlement_status` int(11) DEFAULT NULL COMMENT '物流结算状态',
`logistics_result_last` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '物流最后状态描述',
`logistics_result` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '物流描述',
`logistics_create_time` int(11) DEFAULT NULL COMMENT '发货时间',
`logistics_update_time` int(11) DEFAULT NULL COMMENT '物流更新时间',
`logistics_settlement_time` int(11) DEFAULT NULL COMMENT '物流结算时间',
`returns_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0所有退单 1部分退单',
`handling_way` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'PUPAWAY:退货入库;REDELIVERY:从新发货;RECLAIM-REDELIVERY:不要求归还并从新发货; REFUND:退款; COMPENSATION:不退货并赔偿',
`returns_amount` decimal(8,2) NOT NULL COMMENT '退款金额',
`return_submit_time` int(11) NOT NULL COMMENT '退货申请时间',
`handling_time` int(11) NOT NULL COMMENT '退货处理时间',
`remark` text COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '退货缘由',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
复制代码
退换货申请
CREATE TABLE `order_returns_apply` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`order_no` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '订单单号',
`order_detail_id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '子订单编码',
`return_no` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '售后单号',
`member_id` int(11) NOT NULL COMMENT '用户编码',
`state` tinyint(4) NOT NULL COMMENT '类型 0 仅退款 1退货退款',
`product_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '货物状态 0:已收到货 1:未收到货',
`why` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '退换货缘由',
`status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '审核状态 -1 拒绝 0 未审核 1审核经过',
`audit_time` int(11) NOT NULL DEFAULT '0' COMMENT '审核时间',
`audit_why` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '审核缘由',
`note` text COLLATE utf8mb4_unicode_ci COMMENT '备注',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
复制代码
感谢你看完这篇文章,接下来会继续出一些电商相关的文章,例如交易系统的设计、订单系统的设计等等。感谢近期来关注个人童鞋们。做为一个程序员,我很荣幸能把我知道的分享给你们。
代码多变,初心不变