大数据-241 离线数仓 - 实战:电商核心交易数据模型与 MySQL 源表设计(订单/商品/品类/店铺/支付)
业务需求
电商系统业务中最关键的业务,电商的运营活动都是围绕这个主题展开。 选取的指标包括:订单数、商品数、支付金额,对这些指标按销售区域、商品类型分析。
需求板块
电商平台的核心交易可以分为以下几个主要环节:
- 商品浏览:用户浏览商品的行为数据
- 加入购物车:用户将商品添加到购物车中的行为
- 下单:用户在电商平台上完成的订单生成行为
- 支付:支付是交易中至关重要的环节
- 发货:商品发货数据记录了商家发货的时间、物流公司、物流单号等信息
- 收货和评价:用户收到商品后的评价、退换货行为等
核心业务流程
- 商品浏览
- 加入购物车
- 下单
- 支付
- 发货
- 收货和评价
业务数据库表结构
1. 交易订单表 (wzk_trade_orders)
CREATE TABLE `wzk_trade_orders` (
`orderId` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '订单ID',
`orderNo` varchar(20) NOT NULL COMMENT '订单编号',
`userId` bigint(11) NOT NULL COMMENT '用户ID',
`status` tinyint(4) NOT NULL DEFAULT '-2' COMMENT '订单状态',
`productMoney` decimal(11,2) NOT NULL COMMENT '商品金额',
`totalMoney` decimal(11,2) NOT NULL COMMENT '订单金额(包括运费)',
`payMethod` tinyint(4) NOT NULL DEFAULT '0' COMMENT '支付方式',
`isPay` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否支付',
`areaId` int(11) NOT NULL COMMENT '区域最低一级',
`createTime` varchar(25) NOT NULL COMMENT '下单时间',
`payTime` varchar(25) DEFAULT NULL COMMENT '支付时间',
PRIMARY KEY (`orderId`)
) ENGINE=InnoDB AUTO_INCREMENT=355 DEFAULT CHARSET=utf8;
2. 订单产品表 (wzk_order_product)
CREATE TABLE `wzk_order_product` (
`id` BIGINT(11) NOT NULL AUTO_INCREMENT,
`orderId` BIGINT(11) NOT NULL COMMENT '订单ID',
`productId` BIGINT(11) NOT NULL COMMENT '商品ID',
`productNum` BIGINT(11) NOT NULL DEFAULT '0' COMMENT '商品数量',
`productPrice` DECIMAL(11,2) NOT NULL DEFAULT '0.00' COMMENT '商品价格',
`money` DECIMAL(11,2) DEFAULT '0.00' COMMENT '付款金额',
PRIMARY KEY (`id`),
KEY `orderId` (`orderId`),
KEY `goodsId` (`productId`)
) ENGINE=InnoDB AUTO_INCREMENT=1260 DEFAULT CHARSET=utf8;
3. 产品信息表 (wzk_product_info)
CREATE TABLE `wzk_product_info` (
`productId` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '商品ID',
`productName` varchar(200) NOT NULL COMMENT '商品名称',
`shopId` bigint(11) NOT NULL COMMENT '门店ID',
`price` decimal(11,2) NOT NULL DEFAULT '0.00' COMMENT '门店价格',
`isSale` tinyint(4) NOT NULL DEFAULT '1' COMMENT '是否上架',
`status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否新品',
`categoryId` int(11) NOT NULL COMMENT '最后一级商品分类ID',
`createTime` varchar(25) NOT NULL COMMENT '创建时间',
PRIMARY KEY (`productId`),
KEY `shopId` (`shopId`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=115909 DEFAULT CHARSET=utf8;
4. 产品分类表 (wzk_product_category)
- 产品分类表共分3个级别(level 1/2/3)
- 通过 parentId 实现层级关联
5. 商家店铺表 (wzk_shops)
CREATE TABLE `wzk_shops` (
`shopId` int(11) NOT NULL AUTO_INCREMENT COMMENT '商铺ID',
`userId` int(11) NOT NULL COMMENT '商铺联系人ID',
`areaId` int(11) DEFAULT '0' COMMENT '区域ID',
`shopName` varchar(100) DEFAULT '' COMMENT '商铺名称',
`shopLevel` tinyint(4) NOT NULL DEFAULT '1' COMMENT '店铺等级',
`status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '商铺状态',
PRIMARY KEY (`shopId`)
) ENGINE=InnoDB AUTO_INCREMENT=105317 DEFAULT CHARSET=utf8;
6. 商家地域组织表 (wzk_shop_admin_org)
- 记录店铺所属区域组织架构
7. 支付方式表 (wzk_payments)
- 记录支付方式(支付宝、微信、现金等)
错误速查(常见问题与解决方案)
| 症状 | 根因定位 | 修复方案 |
|---|---|---|
| 订单数被放大 | 用订单表 join 明细表后直接 count(*) | 使用 count(distinct o.orderId) |
| 商品数口径混乱 | productNum(件数)与 distinct(productId)(SKU数)混用 | 明确:商品件数=sum(productNum);商品SKU数=count(distinct productId) |
| 支付金额对不上 | totalMoney、productMoney、明细 money 三套金额字段口径不同 | 固定口径:优先使用支付成功后的订单金额字段 |
| ”已支付订单”过滤后仍包含未付款 | 仅用 isPay=1 或仅用 status 判断 | 联合判断:isPay=1 AND payTime is not null |
| 品类分析结果只到”最后一级” | 仅有 categoryId=最后一级,未做 parentId 回溯 | 用自连接回溯三级分类 |
| 区域维度结果不可解释 | 缺少 areaId 对应名称/层级的维表 | 增加区域维表 |