电商大伙每天都在用,类似某猫,某狗等。 电商系统设计看似复杂又很简单,看似简单又很复杂 本章适合初级工程师及中级工程师细看,大佬请随意

前言

商品系统与订单系统(交易系统)是相铺相成的,当买家购买商品后将经历一个过程

商品系统->交易系统->订单系统->物流系统->售后系统

完成上述流程则是完成了一笔交易,经常网上购物的童鞋都懂这个。今天我们讲下从商品系统到交易系统和订单系统的存储过程及其设计上的应该注意的“坑”。

存储

前俩篇文章讲解的商品系统的SKU与SPU的设计过程

  • SPU(Standard Product Unit)标准化产品单元
  • SKU(Stock Keeping Unit)库存量单元

现在我们已经清楚商品系统数据表的设计并且清楚为什么要这样设计。

现在抛出了一个问题

用户购买的商品如何存储到订单/交易系统中?

关联问题

现在有这么一个场景

小明在某宝买了一部爱疯手机,颜色是红色,存储是32G,他选择使用某宝支付.

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。

数据表

order 订单表

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;
复制代码

order_detail 订单详情

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;
复制代码

order_logistics 订单物流

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;
复制代码

order_returns 订单退换货

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;
复制代码

order_returns_apply 售后申请

退换货申请

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;
复制代码

致谢

感谢你看完这篇文章,接下来会继续出一些电商相关的文章,例如交易系统的设计、订单系统的设计等等。感谢近期来关注我的童鞋们。作为一个程序员,我很荣幸能把我知道的分享给大家。

代码多变,初心不变

电商系统设计之商品 (下)相关推荐

  1. 电商系统设计之商品(下)

    电商大伙每天都在用,类似某猫,某狗等. 电商系统设计看似复杂又很简单,看似简单又很复杂 本章适合初级工程师及中级工程师细看,大佬请随意 1. 前言 商品系统与订单系统(交易系统)是相铺相成的,当买家购 ...

  2. 电商系统设计之商品(上)

    电商大伙每天都在用,类似某猫,某狗等. 电商系统设计看似复杂又很简单,看似简单又很复杂.本章适合初级工程师及中级工程师细看,大佬请随意 1. 前言 商品的设计在电商系统中占据重要地位,如何设计出高扩展 ...

  3. 电商系统设计之商品上架

    近期根据客户的不同需求,定制开发了好几款电商系统,在这整个开发过程中,积攒了一些开发经验和心得,后期我会写一系列文章,来记录我对开发电商系统的理解,这其中会包含一些后台逻辑设计.数据库设计.小程序设计 ...

  4. PHP电商运费模板,电商系统设计之运费模板(下)

    电商大伙每天都在用,类似某猫,某狗等. 电商系统设计看似复杂又很简单,看似简单又很复杂 本章适合初中级工程师细看,大佬请随意 前言 在订单系统中,运费模板是其中一个重要组成部分,看似简单的一个设置,在 ...

  5. java运费模板设计_电商系统设计之运费模板(下)

    电商大伙每天都在用,类似某猫,某狗等. 电商系统设计看似复杂又很简单,看似简单又很复杂 本章适合初中级工程师细看,大佬请随意 前言 在订单系统中,运费模板是其中一个重要组成部分,看似简单的一个设置,在 ...

  6. HH SaaS电商系统的商品系统设计

    文章目录 商品信息结构 商品信息总结构 商品信息结构图 发布商品 商品类型 虚拟商品 服务商品 为什么服务商品要分类 前端根据服务商品类型来设计不同的界面和交互 订单状态和服务类型有关 商品档案上下架 ...

  7. 商品详细信息的代码html_电商网站的商品详情页系统架构

    小型电商网站的商品详情页系统架构 小型电商网站的页面展示采用页面全量静态化的思想.数据库中存放了所有的商品信息,页面静态化系统,将数据填充进静态模板中,形成静态化页面,推入 Nginx 服务器.用户浏 ...

  8. java电商快递费收取_电商系统设计之运费模板(上)

    电商大伙每天都在用,类似某猫,某狗等. 电商系统设计看似复杂又很简单,看似简单又很复杂 本章适合初中级工程师细看,大佬请随意 前言 在订单系统中,运费模板是其中一个重要组成部分,看似简单的一个设置,在 ...

  9. java运费模板设计_电商系统设计之运费模板(上)

    电商大伙每天都在用,类似某猫,某狗等. 电商系统设计看似复杂又很简单,看似简单又很复杂 本章适合初中级工程师细看,大佬请随意 前言 在订单系统中,运费模板是其中一个重要组成部分,看似简单的一个设置,在 ...

最新文章

  1. 设计Optaplanner下实时规划服务的失败经历
  2. 看一家公司发展得如何就看这家公司的财务部门
  3. Python—UnicodeEncodeError: 'ascii' codec can't encode/decode characters
  4. byte转换int时为何与0xff进行与运算
  5. Android之单复选框及Spinner实现二级联动
  6. IOS开发基础之核心动画 基础动画、关键帧、组动画案例
  7. S5PV210的启动过程:三星推荐的启动方式和uboot的实现方式不同
  8. C# 定义了 7 种变量类别:静态变量、实例变量、数组元素、值参数、引用参数、输出参数和局部变量
  9. firebug js版
  10. 硅谷经历 7 场面试,我是如何最终进入 Facebook 的
  11. python 重命名文件出现乱码_下载的文件名总是「乱码」?这里有各平台的解决方法...
  12. mini_magick
  13. python字典包含指定键_筛选python字典中键包含特定字符串的项
  14. 算法实现: 在二叉树中找到两个节点的最近公共祖先
  15. 什么是消费者需求研究
  16. Python之禅——个人翻译
  17. 我国知识共享数学生态圈的发端历程
  18. 配置windows 静态IP地址
  19. 常见排序算法及其对应的时间复杂度、空间复杂度
  20. android p2p 连接服务器上,当通过Wi-Fi P2P使用网络服务发现时无法连接到Android设备每个人都可以使用网络服务发现...

热门文章

  1. CCIE学习(31)—— RIP知识回顾
  2. vue实践06-项目实践
  3. 重磅消息:全球首个光量子计算机诞生!
  4. Asp.net MVC验证哪些事(2)-- 验证规则总结以及使用
  5. python之event【事件】
  6. 使用日程安排自动化测试来更好地管理时间与资源
  7. Android源码设计模式解析与实战(四)
  8. 查看有哪些表被锁住 如何杀死oracle死锁进程
  9. 艾伟:自己实现memcached客户端库
  10. 关于 IE 模态对话框的两个问题