mysql如何设计商品表结构_mysql电商项目入门
发布时间 - 2026-02-03 00:00:00 点击率:次商品基础字段应精简:仅保留id、name、category_id、price(DECIMAL)、cost_price、status、created_at、updated_at;规格拆至product_spec和product_sku表;图片和详情分离存储;状态管理用publish_status+published_at;删除改用is_deleted软删。
商品基础字段怎么定:别一上来就加几十个字段
商品表最怕“想太多”,比如提前加 sku_weight、warehouse_code 这类后期才用的字段。初期只保留强依赖字段:id、name、category_id、price、cost_price、status(0下架/1上架)、created_at、updated_at。其中 price 用 DECIMAL(10,2),不是 FLOAT——浮点数会导致价格计算偏差,比如 0.1 + 0.2 ≠ 0.3。
常见错误是把所有属性塞进一张表:颜色、尺寸、

product_spec 表存规格项,product_sku 表存具体 SKU,主表只管“商品本体”。
SKU 和规格怎么关联:避免用字符串拼接做组合键
很多新手用 CONCAT(color, '-', size) 当 SKU 编码,再存在 product_sku 表里当主键。问题来了:查询某颜色所有尺码时得用 LIKE 'red-%',没法走索引;改规格名还得批量更新字符串。
更稳的做法是:
-
product_spec表存独立规格项:id、spec_key(如 'color')、spec_value(如 'red') -
product_spec_value表记录商品与规格值的多对多关系:product_id、spec_value_id -
product_sku表用自增id主键,通过JSON或关联表存规格组合(推荐后者,便于约束和查询)
MySQL 5.7+ 支持 JSON_CONTAINS,但复杂查询性能差,别依赖它做核心筛选逻辑。
图片和详情怎么存:别把大字段塞进主表
product 主表里加 detail_html 或 images_json 字段,看着省事,实际会拖慢所有 SELECT * 查询,还影响备份速度和主从同步延迟。
建议分离:
- 图片地址统一存
product_image表,字段:product_id、url、sort_order、is_primary - 富文本详情存
product_detail表,用MEDIUMTEXT,按需 JOIN - 如果要用全文检索,
name和brief单独建FULLTEXT索引,别对detail_html建
另外,图片 URL 别存相对路径或本地文件路径,必须是可直接访问的绝对 URL,否则前端渲染就报 404。
状态和上下架逻辑:别只靠 status 字段硬控制
单纯用 status 字段区分“上架/下架”,上线后很快会遇到新需求:定时上架、草稿态、审核中、库存为 0 时自动下架……这时候光靠一个字段撑不住。
更可持续的设计是:
- 加
publish_status(draft/pending/published/failed)管发布流程 - 加
published_at时间戳,配合定时任务检查是否到时间自动切状态 - 库存相关下架逻辑放到应用层或触发器里判断,不要在 SELECT 商品列表时动态算
stock > 0——容易误判,尤其高并发减库存场景
还有一个隐形坑:商品删除。永远别用 DELETE FROM product,而是加 is_deleted TINYINT DEFAULT 0,否则订单、评价、日志里的外键全断,历史数据就废了。
# mysql
# html
# js
# 前端
# json
# go
# 编码
# ai
# cos
# red
# Float
# select
# 字符串
# delete
# 并发
# default
# 下架
# 上架
# 塞进
# 主键
# 看着
# 来了
# 太多
# 这类
# 要用
# 还有一个
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】
如何在Windows虚拟主机上快速搭建网站?
如何用狗爹虚拟主机快速搭建网站?
Win11怎样安装网易有道词典_Win11安装词典教程【步骤】
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
微信小程序制作网站有哪些,微信小程序需要做网站吗?
Laravel如何实现一对一模型关联?(Eloquent示例)
Laravel如何实现数据库事务?(DB Facade示例)
免费视频制作网站,更新又快又好的免费电影网站?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
Laravel如何与Pusher实现实时通信?(WebSocket示例)
js实现获取鼠标当前的位置
制作企业网站建设方案,怎样建设一个公司网站?
Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门
Laravel如何升级到最新版本?(升级指南和步骤)
大连网站制作公司哪家好一点,大连买房网站哪个好?
C++用Dijkstra(迪杰斯特拉)算法求最短路径
Laravel定时任务怎么设置_Laravel Crontab调度器配置
Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践
北京的网站制作公司有哪些,哪个视频网站最好?
如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)
佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】
浅谈Javascript中的Label语句
网站页面设计需要考虑到这些问题
Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】
如何生成腾讯云建站专用兑换码?
如何正确选择百度移动适配建站域名?
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
Java类加载基本过程详细介绍
如何快速搭建高效WAP手机网站吸引移动用户?
iOS中将个别页面强制横屏其他页面竖屏
JS去除重复并统计数量的实现方法
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
网站制作软件有哪些,制图软件有哪些?
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
Python3.6正式版新特性预览
Linux后台任务运行方法_nohup与&使用技巧【技巧】
济南网站建设制作公司,室内设计网站一般都有哪些功能?
Laravel Admin后台管理框架推荐_Laravel快速开发后台工具
Linux系统命令中tree命令详解
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】
如何在万网主机上快速搭建网站?
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
如何在阿里云虚拟服务器快速搭建网站?
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置

