以下是以MySQL为例的电商商品SKU表设计方案及操作说明,采用结构化设计兼顾扩展性与性能: 一、核心表结构设计(范式化设计) 商品主表(product) CREATE TABLE product ( id BIGINT PRIMARY KEY AUTO_INCREMENT, spu_code VARCHAR(32) NOT NULL COMMENT '商品SPU编码', title VARCHAR(255) NOT NULL, category_id INT NOT NULL, description TEXT, is_deleted TINYINT DEFAULT 0, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, INDEX idx_spu_code(spu_code), INDEX idx_category(category_id) ); SKU表(product_sku) CREATE TABLE product_sku ( id BIGINT PRIMARY KEY AUTO_INCREMENT, product_id BIGINT NOT NULL, sku_code VARCHAR(64) UNIQUE NOT NULL COMMENT '唯一SKU编码', price DECIMAL(10,2) NOT NULL COMMENT '实际售价', original_price DECIMAL(10,2) COMMENT '原价', stock INT NOT NULL DEFAULT 0, spec_values JSON NOT NULL COMMENT '规格属性组合(冗余存储)', is_active TINYINT DEFAULT 1, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (product_id) REFERENCES product(id), INDEX idx_product(product_id), INDEX idx_sku_code(sku_code) ); 规格属性关联表(多对多关系) CREATE TABLE sku_spec_relation ( id BIGINT PRIMARY KEY AUTO_INCREMENT, sku_id BIGINT NOT NULL, spec_key VARCHAR(50) NOT NULL COMMENT '规格名称(如color)', spec_value VARCHAR(100) NOT NULL, FOREIGN KEY (sku_id) REFERENCES product_sku(id), INDEX idx_spec(spec_key, spec_value) ); 二、新增操作示例 新增商品SPU INSERT INTO product (spu_code, title, category_id) VALUES ('SPU_1001', '男士纯棉T恤', 5); 新增SKU(带事务) START TRANSACTION; -- 插入SKU主数据 INSERT INTO product_sku (product_id, sku_code, price, stock, spec_values) VALUES ( LAST_INSERT_ID(), 'SKU_2025030212', 99.00, 100, '{"color": "白色", "size": "XL"}' ); -- 插入规格关联数据 INSERT INTO sku_spec_relation (sku_id, spec_key, spec_value) VALUES (LAST_INSERT_ID(), 'color', '白色'), (LAST_INSERT_ID(), 'size', 'XL'); COMMIT; 三、查询场景实现 精确规格查询(JSON字段查询) SELECT * FROM product_sku WHERE spec_values->'$$.color' = '白色' AND spec_values->'$.size' = 'XL' AND product_id = 123; 动态规格组合查询(联表查询) SELECT s.* FROM product_sku s JOIN sku_spec_relation r1 ON s.id = r1.sku_id JOIN sku_spec_relation r2 ON s.id = r2.sku_id WHERE r1.spec_key = 'color' AND r1.spec_value = '白色' AND r2.spec_key = 'size' AND r2.spec_value = 'XL' AND s.product_id = 123; 四、设计要点说明 性能优化策略: 在spec_key和spec_value上建立联合索引 使用JSON字段冗余存储规格组合,提升读取效率 采用分库分表策略(按product_id哈希) 扩展性设计: 支持动态规格属性(新增规格无需修改表结构) 规格层级表可单独设计(如规格组、规格值表) 历史价格记录可单独建表 数据一致性保障: 使用事务保证SKU主数据与规格关系表的原子性 通过触发器或程序逻辑维护spec_values的JSON字段 定期校验JSON字段与关联表数据一致性 五、进阶设计建议 库存单独分表: CREATE TABLE sku_stock ( sku_id BIGINT PRIMARY KEY, available INT NOT NULL DEFAULT 0, locked INT NOT NULL DEFAULT 0, FOREIGN KEY (sku_id) REFERENCES product_sku(id) ); 价格版本控制: CREATE TABLE sku_price_history ( sku_id BIGINT, price DECIMAL(10,2), effective_date DATETIME, PRIMARY KEY (sku_id, effective_date) ); 索引优化建议: product表的spu_code使用唯一索引 sku表的(product_id, is_active)联合索引 规格关联表的(spec_key(10), spec_value(20))前缀索引 建议采用版本号字段(version)实现乐观锁控制库存扣减,同时配合Redis缓存热点SKU数据提升查询性能。对于超大规模电商系统,可考虑将规格属性组合编码成二进制位图进行存储优化。