订单以及相关周边表设计思路(经过公司多年的经验总结);

Posted yangxiaohui227

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了订单以及相关周边表设计思路(经过公司多年的经验总结);相关的知识,希望对你有一定的参考价值。

技术图片

 

技术图片

//商城订单表和订单项表的设计;先解释下订单项:比如我在淘宝买了3件商品.当打开订单详情时,可以看到商品的详细信息,每个商品就是一条记录
,每条记录都会有商品的标题,数量,单价,总价,当然赠品也属于商品,也是订单项的一员,因此订单项需要一个类型,指明该项是主商品还是赠品,
赠品需要记录它的主商品是谁的,下面的订单表的创建是经过生产实践的,支持了订单拆单,优惠券,积分使用,奖励金的使用,
一般在公司都不会用自增的主键作为业务编号,理由是防止别人遍历你主键取出所有的数据
下单库存扣减时机:下单扣redis中的库存,发货扣实际库存(表的库存,也叫物理库存)
redis中的商品库存(可购买的库存)=商品物理库存-待付款的商品数量-待发货商品数量
订单取消后库存需要回滚,最简单做法是删除redis的该商品库存,等下次有人下单,发现redis中商品库存拿不到,就会走如下路径:
商品库存(可购买的库存)=商品物理库存-待付款的商品数量-待发货商品数量,然后存该库存到redis中
CREATE TABLE order (
  `cod_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键,
  `cod_order_id` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 订单编号,
  `txt_order_title` varchar(512) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 订单标题,
  `cod_cust_id` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 客户编号,
  `dat_order_delivery` datetime DEFAULT NULL COMMENT 发货时间,
  `dat_order_finish` datetime DEFAULT NULL COMMENT 完成时间,
  `dat_order_submit` datetime DEFAULT CURRENT_TIMESTAMP COMMENT 下单时间,
  `amt_order_total` decimal(16,2) DEFAULT NULL COMMENT 订单总额,
  `amt_order_express` decimal(16,2) DEFAULT NULL COMMENT 快递费用,
  `cod_score_total` int(11) DEFAULT NULL COMMENT 积分数量,
  `amt_score` decimal(16,2) DEFAULT NULL COMMENT 积分抵扣金额,
  `amt_order_payment` decimal(16,2) DEFAULT NULL COMMENT 应支付金额,
  `cod_cust_invoice` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 发票信息编号,
  `cod_ccy` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 币种,
  `cod_addr_id` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 收货地址编号,
  `flg_status_order` int(11) DEFAULT NULL COMMENT 订单状态 订单状态0代表删除 1已取消 2待付款  8待发货 16待收货 32完成‘‘(只允许1 2 32的可以变为0),
  `flg_payment_method` int(11) DEFAULT NULL COMMENT 付款方式 1货到付款,2银联支付,3支付宝,4微信,
  `flg_status_payment` int(11) DEFAULT NULL COMMENT 付款状态,1待支付 2支付中 4支付成功 8支付失败,
  `cod_expect_time` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 期望配送时间(如周一到周五配送),
  `cod_coupon_no` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 优惠券编号 一个订单只能使用一张优惠券,
  `txt_coupon_title` varchar(256) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 优惠券标题(根据需要冗余该字段),
  `dat_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间,
  `cod_create_user` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 创建人员,
  `dat_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 维护时间,
  `cod_modify_user` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 维护人员,
  `ctr_update_srlno` int(11) DEFAULT 0 COMMENT 维护序号,
  `flg_is_comment` varchar(1) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 是否可评论,y代表可评论,n代表不可评论(用于实现待评论列表),
  `txt_onlinepay_failed` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 支付失败原因,
  `cod_onlinepay_id` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 在线支付编号,
  `cod_onlinepay_launch` datetime DEFAULT NULL COMMENT 在线实付发起时,
  `cod_onlinepay_finish` datetime DEFAULT NULL COMMENT 在线支付完成时间,
  `cod_address_country` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 所在地区-国家,
  `cod_address_prov` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 所在地区-省(如果省市区做数据字典,这里可以存字典编号,也可以存名字,如果做多语言就存编号),
  `cod_address_city` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 所在地区-市,
  `cod_address_district` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 所在地区-区,
  `cod_address_street` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 客户地区-街道,
  `txt_address_door` varchar(256) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 客户地区-门牌,取代街道作为地址详情,
  `txt_address_post` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 客户地区-邮编,
  `cod_phone` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 电话,
  `txt_name` varchar(256) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 收货人姓名,
  `cod_terminal` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 终端类型(pc:电脑PC端   ios  android),
  `amt_coupon_total` decimal(16,2) DEFAULT NULL COMMENT 优惠券抵扣总金额,
  `amt_balance_discount` decimal(16,2) DEFAULT NULL COMMENT 将立即抵扣金额,,
  `cod_merchant_no` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 商家编号,
  `txt_merchant_name` varchar(512) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 商家名称,
  `cod_order_parent_id` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 父订单编号,
  `flg_is_parent` varchar(2) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 是否父订单(n:子单[n或空]    y:父单),
  `cod_order_type` int(11) DEFAULT NULL COMMENT 订单类型(1:普通单 2.分期订单(根据需要来决定)),
  PRIMARY KEY (`cod_id`),
  UNIQUE KEY `in_shop_order_mast_1` (`cod_order_id`),
  KEY `in_shop_order_mast_2` (`cod_cust_id`) USING BTREE,
  KEY `in_shop_order_mast_4` (`flg_status_payment`) USING BTREE,
  KEY `in_shop_order_mast_5` (`flg_status_order`) USING BTREE,
  KEY `in_shop_order_mast_6` (`cod_order_parent_id`) USING BTREE,
  KEY `in_shop_order_mast_8` (`flg_payment_method`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=365173 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT=订单-订单主表;

//订单表的设计思路:这里存了收获地址编号,为何还要存详细的收货地址呢,原因是,如果只存收货地址编号,如果收货地址被删除或者
修改后,就找不到,也有些人会弄个单独表来存每个订单对应的收货地址信息,个人觉得这是没必要的
订单实际支付金额=商品总额+运费-优惠券优惠金额-积分抵扣金额-现金奖励金额
拆单一般都是按照商家进行拆单,不管拆成多个订单还是一个订单,都需要创建一个父订单,子订单的父订单编号是null的
订单对优惠的使用是有顺序的:先使用优惠券,然后加上运费,之后使用积分抵扣金额,最后使用奖励金抵扣

//订单项目表的设计思路:因为售后可以针对单个商品发起,所以对于一个订单使用了积分抵扣金额,奖励金抵扣金额这些,需要分摊
到每个主商品(赠品是没有的,因为赠品金额为零),优惠券其实是对商品来说的,一个订单买了多个商品,可能只有其中几个进行能参与
使用优惠券,所以优惠券是不会对所有商品进行拆分的,只对参与的商品间拆
拆分积分和现金奖励是按照订单项商品金额与订单总额的比率进行拆分
优惠券在退货的时候是不会退还的,现金奖励和积分就会退还

CREATE TABLE `order_item` (
  `cod_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键,
  `cod_order_item_id` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 订单项编号,
  `cod_order_id` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 订单编号,
  `flg_item_type` int(11) DEFAULT NULL COMMENT 商品类型 1普通 2赠品,
  `cod_market_id` varchar(256) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 活动编号标记该商品参加了什么活动,如秒杀,特惠,
  `cod_item_id` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 商品编号,
  `cod_item_id_main` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 主商品编码(如果该订单项是赠品,那么就必须要有主商品),
  `txt_name` varchar(256) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 商品名称,
  `cod_item_quantity` int(11) DEFAULT NULL COMMENT 商品数量,
  `amt_item_price ` decimal(16,2) DEFAULT NULL COMMENT 商品单价,
  `cod_score_total` int(11) DEFAULT NULL COMMENT 积分数量,
  `amt_score` decimal(16,2) DEFAULT NULL COMMENT 积分抵扣金额,
  `amt_charge` decimal(16,2) DEFAULT NULL COMMENT 实付金额,
  `amt_balance_discount` decimal(16,2) DEFAULT NULL COMMENT 奖励金抵扣金额,
  `amt_payment_total` decimal(16,2) DEFAULT NULL COMMENT 应付总金额,
  `amt_coupon_total` decimal(16,2) DEFAULT NULL COMMENT 优惠券抵扣总金额,
  `cod_order_parent_id` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 父订单编号,
  `cod_merchant_no` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 商家编号,
  `dat_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间,
  `cod_create_user` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 创建人员,
  `dat_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 维护时间,
  `cod_modify_user` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 维护人员,
  `ctr_update_srlno` int(11) DEFAULT 0 COMMENT 维护序号,
  PRIMARY KEY (`cod_id`),
  UNIQUE KEY `in_shop_order_item_1` (`cod_order_item_id`),
  KEY `FK_shop_order_item_1` (`cod_order_id`),
  KEY `in_shop_order_item_2` (`cod_item_id`) USING BTREE,
  KEY `in_shop_order_item_3` (`cod_order_parent_id`) USING BTREE,
  CONSTRAINT `shop_order_item_ibfk_1` FOREIGN KEY (`cod_order_id`) REFERENCES `shop_order_mast` (`cod_order_id`)
) ENGINE=InnoDB AUTO_INCREMENT=584910 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT=订单-购物清单;

//订单备注的设计:下单时,我们也经常会给卖家留言,买家也可以给用户或者物流留言,它跟订单关系就是多对一了
//注意点是:对于需要拆单的订单,如果是按照商家拆单的话,下单时是可以针对每个商家都有一个留言的

CREATE TABLE `order_memo` (
  `cod_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键,
  `cod_memo_id` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 备注编号,
  `cod_order_id` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 订单编号,
  `typ_memo` int(11) NOT NULL COMMENT 信息类型 1客户备注 2.客服备注,
  `txt_memo` varchar(512) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 信息内容,
  `dat_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间,
  `cod_create_user` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 创建人员,
  `dat_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 维护时间,
  `cod_modify_user` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 维护人员,
  `ctr_update_srlno` int(11) DEFAULT 0 COMMENT 维护序号,
  PRIMARY KEY (`cod_id`),
  UNIQUE KEY `in_shop_order_additional_1` (`cod_memo_id`),
  KEY `FK_shop_order_additional_1` (`cod_order_id`),
  CONSTRAINT `shop_order_memo_ibfk_1` FOREIGN KEY (`cod_order_id`) REFERENCES `shop_order_mast` (`cod_order_id`)
) ENGINE=InnoDB AUTO_INCREMENT=19041 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT=订单-其他信息;

//收货地址的设计:用户的收货地址最明显的一个特征就是用户能够选择该地址是否默认地址


CREATE TABLE `customer_address` (
  `cod_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键,
  `cod_cust_address` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 地址编号,
  `cod_cust_id` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 客户编号,
  `bol_default` char(1) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 是否默认地址,
  `cod_address_country` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 所在地区-国家,
  `cod_address_prov` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 所在地区-省,
  `cod_address_city` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 所在地区-市,
  `cod_address_district` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 所在地区-区,
  `cod_address_street` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 客户地区-街道,
  `txt_address_door` varchar(256) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 客户地区-门牌,取代街道作为地址详情,
  `cod_phone` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 电话,
  `txt_name` varchar(256) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 收货人姓名,
  `dat_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间,
  `cod_create_user` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 创建人员,
  `dat_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 维护时间,
  `cod_modify_user` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 维护人员,
  `ctr_update_srlno` int(11) DEFAULT 0 COMMENT 维护序号,
  PRIMARY KEY (`cod_id`),
  UNIQUE KEY `in_shop_cust_address_1` (`cod_cust_address`),
  KEY `FK_shop_cust_address_1` (`cod_cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=63229 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT=客户-收货地址;

//发货单表设计
CREATE TABLE `order_ship` (
  `cod_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键,
  `cod_order_ship_id` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 发货单编号,
  `cod_order_id` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 订单编号,
  `flg_status_shipping` int(11) DEFAULT NULL COMMENT 发货单状态 1采购中 2捡货中 4已出库 8已送达,
  `cod_express_id` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 物流公司编号,
  `txt_express_name` varchar(512) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 快递公司名称,
  `cod_ship_no` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 快递单号,
  `dat_ship_begin` datetime DEFAULT NULL COMMENT 发货时间,
  `dat_ship_finish` datetime DEFAULT NULL COMMENT 收货时间,
  `cod_file_id` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 签收图片文件id,
  `txt_ship_memo` varchar(256) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 备注,
  `dat_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间,
  `cod_create_user` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 创建人员,
  `dat_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 维护时间,
  `cod_modify_user` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 维护人员,
  `cod_modify_org` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 维护机构,
  `ctr_update_srlno` int(11) DEFAULT 0 COMMENT 维护序号,
  PRIMARY KEY (`cod_id`),
  UNIQUE KEY `in_shop_order_ship_1` (`cod_order_ship_id`),
  KEY `FK_shop_order_ship_1` (`cod_order_item_id`),
  CONSTRAINT `shop_order_ship_ibfk_1` FOREIGN KEY (`cod_order_item_id`) REFERENCES `shop_order_item` (`cod_order_item_id`)
) ENGINE=InnoDB AUTO_INCREMENT=162873 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT=订单-发货单;
//发货单表设计另一种思路:针对订单项来发货,也就是可以分开发货,物流单号相同代表同一个物流单

CREATE TABLE `shop_order_ship` (
  `cod_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键,
  `cod_order_ship_id` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 发货单编号,
  `cod_order_item_id` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 订单项编号,
  `flg_status_shipping` int(11) DEFAULT NULL COMMENT 发货单状态 1采购中 2捡货中 4已出库 8已送达,
  `cod_warehouse_id` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 仓库编号(这里可以记录到不同的仓库),
  `cod_express_id` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 物流公司编号,
  `txt_express_name` varchar(512) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 快递公司名称,
  `cod_ship_no` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 快递单号,
  `dat_ship_begin` datetime DEFAULT NULL COMMENT 发货时间,
  `dat_ship_finish` datetime DEFAULT NULL COMMENT 收货时间,
  `cod_file_id` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 签收图片文件id,
  `txt_ship_memo` varchar(256) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 备注,
  `dat_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间,
  `cod_create_user` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 创建人员,
  `cod_create_org` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 创建机构,
  `dat_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 维护时间,
  `cod_modify_user` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 维护人员,
  `cod_modify_org` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 维护机构,
  `ctr_update_srlno` int(11) DEFAULT 0 COMMENT 维护序号,
  PRIMARY KEY (`cod_id`),
  UNIQUE KEY `in_shop_order_ship_1` (`cod_order_ship_id`),
  KEY `FK_shop_order_ship_1` (`cod_order_item_id`),
  CONSTRAINT `shop_order_ship_ibfk_1` FOREIGN KEY (`cod_order_item_id`) REFERENCES `shop_order_item` (`cod_order_item_id`)
) ENGINE=InnoDB AUTO_INCREMENT=162873 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT=订单-发货单;

 

以上是关于订单以及相关周边表设计思路(经过公司多年的经验总结);的主要内容,如果未能解决你的问题,请参考以下文章

每一个程序员都应该知道的高并发处理技巧创业公司如何解决高并发问题互联网高并发问题解决思路caoz大神多年经验总结分享

给Java新手的一些建议

测试用例编写思路

项目管理案例总结:形成闭环的关键(上)

Java的21个核心技术点,你知道吗?

数据库存储选型经验总结