在电商、零售等业务系统中,商品是核心实体,但商品类型往往存在显著差异 —— 例如实物商品需记录重量、库存,虚拟商品需管理激活码、有效期,生鲜商品需追踪产地与保鲜条件。若采用单表存储所有商品,会导致 “空字段冗余”“表结构频繁修改” 等问题;若采用完全独立的多商品表,又会失去商品实体的统一性,增加跨类型查询复杂度。
“主表 + 子表” 设计方案通过 “共性字段集中存储、个性字段分类隔离”,平衡了 “数据规范性” 与 “业务灵活性”,成为解决多类型商品存储的最优选择之一。本文将详细拆解该方案的表结构设计、查询实现与优化策略。
一、“主表 + 子表” 设计方案核心:分层存储差异
1.1 表结构定义
“主表 + 子表” 的核心逻辑是:主表存储所有商品的共性字段,子表按商品类型存储专属个性字段。以下以 “实物商品” 与 “虚拟商品” 为例,定义完整表结构(基于 MySQL 语法)。
(1)主表:product(统一管理商品共性属性)
主表作为商品的 “统一入口”,包含所有商品共有的核心字段,确保商品实体的整体性。
| 字段名 |
数据类型 |
长度 / 精度 |
约束条件 |
说明 |
| product_id |
BIGINT |
- |
PRIMARY KEY |
商品唯一标识(推荐用雪花算法生成,确保全局唯一) |
| name |
VARCHAR |
255 |
NOT NULL |
商品名称(如 “iPhone 15 Pro”“腾讯视频年卡”) |
| price |
DECIMAL |
10,2 |
NOT NULL |
商品售价(如 9999.00 元、218.00 元) |
| category_id |
INT |
- |
NOT NULL |
商品分类 ID(关联分类表category,如 “手机”“虚拟充值”) |
| product_type |
TINYINT |
- |
NOT NULL |
商品类型(1 = 实物商品,2 = 虚拟商品,3 = 生鲜商品等,用于关联子表) |
| status |
TINYINT |
- |
NOT NULL DEFAULT 0 |
商品状态(0 = 下架,1 = 上架,2 = 预售,控制商品是否可售卖) |
| create_time |
DATETIME |
- |
NOT NULL DEFAULT NOW() |
商品创建时间(用于排序、统计) |
| update_time |
DATETIME |
- |
NOT NULL DEFAULT NOW() ON UPDATE NOW() |
商品更新时间(自动更新) |
(2)子表 1:product_physical(实物商品专属属性)
仅存储实物商品特有的字段,通过product_id与主表关联,避免对虚拟商品造成字段冗余。
| 字段名 |
数据类型 |
约束条件 |
说明 |
| i |

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



