订单表设计思路

订单表通常采用的结构是订单主表与订单明细表一对多关系结构,比如:在电商系统中,一个订单购买的多件不同的商品,设计订单表和订单明细表:

(1)订单表:记录订单编号、用户信息、订单状态、总金额等信息。

(2)订单明细表:订单号、记录该订单每个商品的信息,包括:商品名称、单价、数量、总价等。

如果系统需求是一个订单只包括一种商品,此时无须记录订单明细,将购买商品的详细信息记录在订单表即可,设计字段包括:订单编号、用户信息、订单状态、总金额、商品名称、单价、数量、总价等。

1. 订单表与订单明细表的关系

在电商系统中,通常采用订单主表与订单明细表一对多的关系:

  • 订单表(Order):存储订单的总体信息,如订单编号、用户信息、订单状态、总金额等。
  • 订单明细表(Order Item):存储订单中每个商品的详细信息,如商品名称、单价、数量、总价等。

这种设计方式可以更好地管理订单和商品之间的关系,支持一个订单包含多个商品的情况。

2. 订单表(Order)的设计

2.1 基础信息

  • 订单ID(order_id):主键,唯一标识一个订单,通常使用自增ID或UUID。
  • 订单编号(order_number):对用户可见的订单编号,通常具有一定的规则,方便用户查询。
  • 用户ID(user_id):下单用户的唯一标识,关联用户表。
  • 订单状态(order_status):表示订单的当前状态,如待支付、已支付、已发货、已完成、已取消等。

2.2 价格信息

  • 订单总金额(total_amount):所有商品的总金额,未扣除优惠。
  • 优惠金额(discount_amount):订单享受的总优惠金额。
  • 应付金额(payable_amount):订单实际需要支付的金额,等于总金额减去优惠金额。

2.3 支付信息

  • 支付方式(payment_method):如微信支付、支付宝、信用卡等。
  • 支付状态(payment_status):未支付、已支付、退款中、已退款等。
  • 支付时间(payment_time):订单完成支付的时间。

2.4 物流信息

  • 收货人姓名(receiver_name):收货人的姓名。
  • 收货人电话(receiver_phone):收货人的联系电话。
  • 收货地址(receiver_address):详细的收货地址。
  • 物流公司(shipping_company):承运的物流公司名称。
  • 物流单号(tracking_number):物流公司的运单号。
  • 发货时间(shipping_time):订单发货的时间。
  • 收货时间(delivery_time):用户确认收货的时间。

2.5 时间信息

  • 创建时间(create_time):订单创建的时间。
  • 更新时间(update_time):订单信息最近一次更新的时间。

2.6 其他信息

  • 订单备注(order_note):用户下单时填写的备注信息。
  • 订单来源(order_source):订单的来源渠道,如APP、小程序、网页等。
  • 是否删除(is_deleted):逻辑删除标记,0表示未删除,1表示已删除。

3. 订单明细表(Order Item)的设计

3.1 基础信息

  • 订单明细ID(order_item_id):主键,唯一标识一条订单明细记录。
  • 订单ID(order_id):外键,关联到订单表的订单ID。
  • 商品ID(product_id):外键,关联到商品表的商品ID。
  • 商品名称(product_name):商品的名称,冗余字段,防止商品信息变化影响订单记录。
  • 商品图片(product_image):商品的主图URL,方便展示。

3.2 价格和数量

  • 商品单价(unit_price):商品的销售单价。
  • 购买数量(quantity):购买的商品数量。
  • 小计金额(subtotal_amount):商品单价乘以数量,等于该商品的总价。

3.3 服务信息(适用于服务类商品)

  • 服务类型名称(service_type_name):如果是服务类商品,记录服务的类型名称。
  • 服务项名称(service_item_name):具体的服务项名称。
  • 服务单价(service_unit_price):服务的单价。
  • 价格单位(price_unit):如次、小时、天等。
  • 购买数量(service_quantity):购买的服务数量。

3.4 其他信息

  • 售后状态(after_sale_status):该商品的售后状态,如未申请、退货中、已退货等。
  • 是否评价(is_commented):标记该商品是否已被用户评价。

4. 设计考虑

4.1 冗余存储

  • 商品信息冗余:在订单明细表中存储商品的名称、图片、单价等信息,防止商品信息修改后影响历史订单记录。
  • 用户信息冗余:在订单表中存储下单时的用户联系信息,防止用户修改联系方式后影响历史订单。

4.2 状态设计

  • 订单状态码:使用枚举或常量定义订单状态,方便维护和扩展。
  • 支付状态码:同样使用枚举或常量定义支付状态。

4.3 金额精度

  • 金额类型:建议使用 decimal(12, 2),可以精确存储金额,支持大多数场景。

这里decimal(12, 2)表示总共可以存储12位数字,其中2位用于小数部分,适合表示较大金额的场景。

4.4 扩展性

  • 优惠信息:预留字段或关联优惠券表,记录订单使用的优惠信息。
  • 多币种支持:如果有需要,添加币种字段,支持不同的货币类型。

4.5 性能优化

  • 索引设计:为经常查询的字段(如订单号、用户ID、订单状态)建立索引,提高查询性能。
  • 分库分表:对于大规模订单数据,可以考虑按照时间、用户ID等进行分库分表。

5. 示例表结构

5.1 订单表(order)

CREATE TABLE `order` (
  `order_id` bigint NOT NULL AUTO_INCREMENT COMMENT '订单ID',
  `order_number` varchar(32) NOT NULL COMMENT '订单编号',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `order_status` tinyint NOT NULL COMMENT '订单状态',
  `total_amount` decimal(12, 2) NOT NULL COMMENT '订单总金额',
  `discount_amount` decimal(12, 2) DEFAULT 0 COMMENT '优惠金额',
  `payable_amount` decimal(12, 2) NOT NULL COMMENT '应付金额',
  `payment_method` tinyint DEFAULT NULL COMMENT '支付方式',
  `payment_status` tinyint DEFAULT NULL COMMENT '支付状态',
  `payment_time` datetime DEFAULT NULL COMMENT '支付时间',
  `shipping_company` varchar(64) DEFAULT NULL COMMENT '物流公司',
  `tracking_number` varchar(64) DEFAULT NULL COMMENT '物流单号',
  `shipping_time` datetime DEFAULT NULL COMMENT '发货时间',
  `delivery_time` datetime DEFAULT NULL COMMENT '收货时间',
  `receiver_name` varchar(32) NOT NULL COMMENT '收货人姓名',
  `receiver_phone` varchar(20) NOT NULL COMMENT '收货人电话',
  `receiver_address` varchar(256) NOT NULL COMMENT '收货地址',
  `order_note` varchar(256) DEFAULT NULL COMMENT '订单备注',
  `order_source` tinyint DEFAULT NULL COMMENT '订单来源',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `is_deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否删除',
  PRIMARY KEY (`order_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_order_number` (`order_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';

5.2 订单明细表(order_item)

CREATE TABLE `order_item` (
  `order_item_id` bigint NOT NULL AUTO_INCREMENT COMMENT '订单明细ID',
  `order_id` bigint NOT NULL COMMENT '订单ID',
  `product_id` bigint NOT NULL COMMENT '商品ID',
  `product_name` varchar(128) NOT NULL COMMENT '商品名称',
  `product_image` varchar(256) DEFAULT NULL COMMENT '商品图片',
  `unit_price` decimal(12, 2) NOT NULL COMMENT '商品单价',
  `quantity` int NOT NULL COMMENT '购买数量',
  `subtotal_amount` decimal(12, 2) NOT NULL COMMENT '小计金额',
  `after_sale_status` tinyint DEFAULT NULL COMMENT '售后状态',
  PRIMARY KEY (`order_item_id`),
  KEY `idx_order_id` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单明细表';
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cyt涛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值