0

0

mysql搭建一个简单的在线商城项目数据库结构设计

P粉602998670

P粉602998670

发布时间:2026-01-22 10:32:38

|

610人浏览过

|

来源于php中文网

原创

users表需设email唯一索引和password_hash加密字段;categories与products须分离并支持无限级分类;orders与order_items必须拆分以保障事务一致性;所有外键列及常用查询字段须建索引。

mysql搭建一个简单的在线商城项目数据库结构设计

用户表 users 必须包含邮箱唯一性与密码加密字段

在线商城中,users 表是登录、订单归属和权限控制的基础。不能只存用户名和明文密码——这在现代开发中属于严重安全漏洞。

实操建议:

  • email 字段设为 UNIQUE,并加索引,避免重复注册;不要用 username 做主登录凭证,邮箱更稳定、可验证
  • password_hash 字段类型用 VARCHAR(255)(足够存 bcrypt 或 Argon2 哈希值),严禁 password 字段
  • status 枚举字段(如 'active', 'disabled', 'pending_email_verify'),方便后续做账号生命周期管理
  • 别忘了 created_atupdated_at,用 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
CREATE TABLE users (
  id INT PRIMARY KEY AUTO_INCREMENT,
  email VARCHAR(255) NOT NULL UNIQUE,
  password_hash VARCHAR(255) NOT NULL,
  nickname VARCHAR(50),
  status ENUM('active', 'disabled', 'pending_email_verify') DEFAULT 'pending_email_verify',
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  INDEX idx_email (email)
);

商品与分类需分离为 categoriesproducts 两张表

哪怕初期只有“手机”“配件”两个类目,也别把分类名直接写死在 products 表里——否则后期改名、多级分类、统计类目销量时全得硬编码修数据。

实操建议:

  • categories 表保留 parent_id 字段(允许为 NULL),支持无限级分类(如 “手机 > iPhone > iPhone 15”)
  • products 表不存完整分类路径,只存 category_id 外键,靠 JOIN 查层级
  • priceDECIMAL(10,2),不是 FLOAT —— 避免浮点数精度问题导致价格显示为 2999.99999999
  • stock 字段并设默认值 0,配合下单逻辑做库存扣减判断
CREATE TABLE categories (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(100) NOT NULL,
  parent_id INT NULL,
  is_active TINYINT(1) DEFAULT 1,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (parent_id) REFERENCES categories(id)
);

CREATE TABLE products (
  id INT PRIMARY KEY AUTO_INCREMENT,
  category_id INT NOT NULL,
  name VARCHAR(255) NOT NULL,
  description TEXT,
  price DECIMAL(10,2) NOT NULL,
  stock INT NOT NULL DEFAULT 0,
  is_on_sale TINYINT(1) DEFAULT 1,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (category_id) REFERENCES categories(id)
);

订单表 orders 必须拆出 order_items 子表

一个订单买三件商品,如果把商品 ID、数量、单价全塞进 orders 表的 JSON 字段或逗号分隔字符串里,等于主动放弃数据库的约束能力、查询能力和事务一致性。

风易在线销售系统
风易在线销售系统

《风易在线销售系统》是一套为企业电子商务项目量身设计打造的在线商业销售系统,本系统将商品管理、客户管理、订单管理、信息管理、界面管理、系统管理等功能无缝融合,并且提供简单易用的后台管理平台,独家首创的模版内核系统,以及诸多实用的辅助模块。为客户提供了一个低成本,高效率,专业化的在线销售建设方案。 【新增】新增后台选择每页显示数据数量。 【新增】新增一个单客服模式功能。 【新增】新增根据一级分类显示

下载

实操建议:

  • orders 表只存买家 user_id、总金额 total_amount、状态 status(如 'pending', 'paid', 'shipped')、收货信息等全局字段
  • order_items 表每行对应一个商品项,含 order_idproduct_idquantityunit_price(下单时快照价,防止商品改价影响历史订单)
  • order_items 上建联合索引 (order_id, product_id),查某订单所有商品或某商品被哪些订单买过都快
  • 外键务必设 ON DELETE RESTRICT,防止误删订单主记录导致子项孤立
CREATE TABLE orders (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  user_id INT NOT NULL,
  total_amount DECIMAL(10,2) NOT NULL,
  status ENUM('pending', 'paid', 'shipped', 'cancelled') DEFAULT 'pending',
  shipping_name VARCHAR(100),
  shipping_phone VARCHAR(20),
  shipping_address TEXT,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (user_id) REFERENCES users(id)
);

CREATE TABLE order_items (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  order_id BIGINT NOT NULL,
  product_id INT NOT NULL,
  quantity INT NOT NULL,
  unit_price DECIMAL(10,2) NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE RESTRICT,
  FOREIGN KEY (product_id) REFERENCES products(id),
  INDEX idx_order_product (order_id, product_id)
);

上线前必须检查的三个外键与索引盲点

结构设计再合理,没加对索引或漏设外键约束,上线后查订单慢、删分类报错、连表 JOIN 超时,问题都出在细节。

容易被忽略但关键的点:

  • 所有外键列(如 orders.user_idorder_items.product_id)必须单独建索引,MySQL 不会自动为外键列建索引
  • products.category_idcategories.parent_id 都要加索引,否则按分类查商品或递归查子类目时性能断崖式下跌
  • 如果计划支持搜索商品名,products.name 别只依赖普通 B-Tree 索引——考虑加 FULLTEXT 索引,或后续接入 Elasticsearch
实际跑通最小闭环:能注册用户 → 添加商品 → 下单 → 查该用户所有订单 → 查某订单明细。其余如购物车、优惠券、评价等,都是在这个骨架上长出来的,不是一开始就要堆满的。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

665

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

247

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

281

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

515

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

255

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

386

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

531

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

600

2023.08.14

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

0

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.9万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 805人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号