# 设计订单表

一张订单中可以包含多个商品记录,可不可以用 JSON 存储这些商品信息?不适合

因为 :MySQL 5.7+ 引入的 JSON 字段适合存储数据,不适合检索数据。这里存储的数据只是用来页面展示,而 不用来做搜索条件,在前面设计的表中,很少对字符串的字段做索引。也是如此。

所以需要两张表来保存订单数据

# 创建订单表

image-20200606204651069

  • code:订单流水号;规则可自定义

    流水号尾部以字母 A 结尾表示液体,B 结尾表示易碎品,等。还可以包含订单的日期、和时间,消费小票打印出来后,阅读流水号可以知道是哪一类的商品、什么时候生成的订单、是否加急发货等。这些规则由业务人员去制定。

  • type:订单类型

    如为 1:表示线下销售商品,为 2 为线上销售的商品

  • shop_id:店铺ID

    如果线上卖出的,可以为空

  • customer_id:客户ID

    主要用来关联会员等级等。如果用户在线下购买的商品,不是会员可以为空

  • amount:订单的总价格

  • payment_type:订单的支付类型

    比如是借记卡付款、信用卡、微信支付、现今支付等等

  • status:订单状态

    如:未付款、已付款、已发货、已签收等

  • postage:邮费

  • weight:订单总重量,单位为 克

    比如京东超过多少重量加收运费,数据库这里不用管这个逻辑,这个是程序的问题。这里只需要留出字段

  • voucher_id:购物卷ID

    通常情况下,一个订单只能使用一张购物卷。

  • create_time:订单创建的时间

字段前面有菱形标识的,这里是需要创建索引的。

create table t_order
(
    id           int unsigned primary key auto_increment comment '主键',
    `code`       varchar(200)            not null comment '流水号',
    type         tinyint unsigned        not null comment '订单类型:1实体销售,2网络销售',
    shop_id      int unsigned comment '零售店ID',
    customer_id  int unsigned comment '会员ID',
    amount       decimal(10, 2) unsigned not null comment '总金额',
    payment_type tinyint unsigned        not null comment '支付方式:1借记卡、2信用卡、3微信、4支付宝、5现金',
    `status`     tinyint unsigned        not null comment '状态:1未付款、2已付款、3已发货、4已签收',
    postage      decimal(10, 2) unsigned comment '邮费',
    weight       int unsigned comment '重量:单位克',
    voucher_id   int unsigned comment '购物券ID',
    create_time  timestamp               not null default now(),
    index idx_code (`code`),
    index idx_customer_id (customer_id),
    index idx_status (`status`),
    index idx_create_time (create_time),
    index idx_type (type),
    index idx_shop_id (shop_id),
    unique unq_code (`code`)
) comment '订单表';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

插入一些测试数据

INSERT INTO neti.t_order (id, code, type, shop_id, customer_id, amount, payment_type, status, postage, weight, voucher_id, create_time) VALUES (1, 'CX0000000120160522', 1, 3, 1, 2999.00, 5, 2, null, null, null, '2020-05-19 23:14:10');
1

流水号按你的实际业务,这里不是强制的

# 订单详情表

image-20200606210946028

此表将订单与商品关联在一起的关联表。

  • order_id 和 sku_id :复合主键

    一个订单中不会出现两个相同的商品,可以用数量去记录多件

  • price:商品原价

  • actual_price:购买商品的实际价格

  • num:购买商品的实际数量

create table t_order_detail
(
    order_id     int unsigned            not null comment '订单ID',
    sku_id       int unsigned            not null comment '商品ID',
    price        decimal(10, 2) unsigned not null comment '原价格',
    actual_price decimal(10, 2) unsigned not null comment '实际购买价格',
    num          int unsigned            not null comment '购买数量',
    primary key (order_id, sku_id)
) comment '订单详情表'
1
2
3
4
5
6
7
8
9

插入一点测试数据

INSERT INTO neti.t_order_detail (order_id, sku_id, price, actual_price, num) VALUES (1, 3, 2999.00, 2999.00, 1);
1