电子商城数据库的开发需要结合业务场景梳理核心数据实体,再设计合理的表结构保证数据的一致性和查询效率,MySQL凭借稳定的性能和易用性成为这类场景的首选数据库。

一、电子商城数据库核心需求分析
电子商城的核心业务包含用户管理、商品管理、订单管理、购物车管理、支付管理等模块,对应的数据库需要存储以下核心数据:
- 用户基础信息,包括账号、密码、联系方式、收货地址等
- 商品信息,包括商品名称、价格、库存、分类、描述等
- 订单信息,包括订单编号、下单用户、商品明细、订单状态、支付金额等
- 购物车信息,记录用户临时选中的商品和数量
- 商品分类信息,用于商品的归类展示
二、核心表结构设计
根据需求分析,我们设计以下6张核心表,表结构如下:
1. 用户表 user
| 字段名 | 类型 | 说明 | 约束 |
|---|---|---|---|
| id | int | 用户ID | 主键、自增 |
| username | varchar(50) | 用户名 | 唯一、非空 |
| password | varchar(100) | 加密密码 | 非空 |
| phone | varchar(20) | 手机号 | 唯一 |
| address | varchar(200) | 默认收货地址 | 可空 |
| create_time | datetime | 注册时间 | 非空 |
2. 商品分类表 category
| 字段名 | 类型 | 说明 | 约束 |
|---|---|---|---|
| id | int | 分类ID | 主键、自增 |
| name | varchar(50) | 分类名称 | 非空 |
| parent_id | int | 父分类ID | 可空,默认0表示一级分类 |
3. 商品表 product
| 字段名 | 类型 | 说明 | 约束 |
|---|---|---|---|
| id | int | 商品ID | 主键、自增 |
| name | varchar(100) | 商品名称 | 非空 |
| price | decimal(10,2) | 商品单价 | 非空 |
| stock | int | 库存数量 | 非空,默认0 |
| category_id | int | 所属分类ID | 外键关联category.id |
| description | text | 商品描述 | 可空 |
| create_time | datetime | 上架时间 | 非空 |
4. 购物车表 cart
| 字段名 | 类型 | 说明 | 约束 |
|---|---|---|---|
| id | int | 购物车ID | 主键、自增 |
| user_id | int | 用户ID | 外键关联user.id |
| product_id | int | 商品ID | 外键关联product.id |
| quantity | int | 商品数量 | 非空,默认1 |
| create_time | datetime | 加入购物车时间 | 非空 |
5. 订单表 order
| 字段名 | 类型 | 说明 | 约束 |
|---|---|---|---|
| id | int | 订单ID | 主键、自增 |
| order_no | varchar(50) | 订单编号 | 唯一、非空 |
| user_id | int | 下单用户ID | 外键关联user.id |
| total_amount | decimal(10,2) | 订单总金额 | 非空 |
| status | tinyint | 订单状态 | 非空,0待支付 1已支付 2已发货 3已完成 4已取消 |
| create_time | datetime | 下单时间 | 非空 |
6. 订单明细表 order_item
| 字段名 | 类型 | 说明 | 约束 |
|---|---|---|---|
| id | int | 明细ID | 主键、自增 |
| order_id | int | 订单ID | 外键关联order.id |
| product_id | int | 商品ID | 外键关联product.id |
| quantity | int | 购买数量 | 非空 |
| price | decimal(10,2) | 购买时的商品单价 | 非空 |
三、建表SQL语句
以下是所有核心表的创建语句,可直接在MySQL中执行:
-- 创建用户表 CREATE TABLE IF NOT EXISTS `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL COMMENT '用户名', `password` varchar(100) NOT NULL COMMENT '加密密码', `phone` varchar(20) DEFAULT NULL COMMENT '手机号', `address` varchar(200) DEFAULT NULL COMMENT '默认收货地址', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间', PRIMARY KEY (`id`), UNIQUE KEY `idx_username` (`username`), UNIQUE KEY `idx_phone` (`phone`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; -- 创建商品分类表 CREATE TABLE IF NOT EXISTS `category` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL COMMENT '分类名称', `parent_id` int(11) NOT NULL DEFAULT '0' COMMENT '父分类ID,0表示一级分类', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品分类表'; -- 创建商品表 CREATE TABLE IF NOT EXISTS `product` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL COMMENT '商品名称', `price` decimal(10,2) NOT NULL COMMENT '商品单价', `stock` int(11) NOT NULL DEFAULT '0' COMMENT '库存数量', `category_id` int(11) NOT NULL COMMENT '所属分类ID', `description` text COMMENT '商品描述', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '上架时间', PRIMARY KEY (`id`), KEY `idx_category_id` (`category_id`), CONSTRAINT `fk_product_category` FOREIGN KEY (`category_id`) REFERENCES `category` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品表'; -- 创建购物车表 CREATE TABLE IF NOT EXISTS `cart` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL COMMENT '用户ID', `product_id` int(11) NOT NULL COMMENT '商品ID', `quantity` int(11) NOT NULL DEFAULT '1' COMMENT '商品数量', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '加入购物车时间', PRIMARY KEY (`id`), KEY `idx_user_id` (`user_id`), KEY `idx_product_id` (`product_id`), CONSTRAINT `fk_cart_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`), CONSTRAINT `fk_cart_product` FOREIGN KEY (`product_id`) REFERENCES `product` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='购物车表'; -- 创建订单表 CREATE TABLE IF NOT EXISTS `order` ( `id` int(11) NOT NULL AUTO_INCREMENT, `order_no` varchar(50) NOT NULL COMMENT '订单编号', `user_id` int(11) NOT NULL COMMENT '下单用户ID', `total_amount` decimal(10,2) NOT NULL COMMENT '订单总金额', `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '订单状态 0待支付 1已支付 2已发货 3已完成 4已取消', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '下单时间', PRIMARY KEY (`id`), UNIQUE KEY `idx_order_no` (`order_no`), KEY `idx_user_id` (`user_id`), CONSTRAINT `fk_order_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表'; -- 创建订单明细表 CREATE TABLE IF NOT EXISTS `order_item` ( `id` int(11) NOT NULL AUTO_INCREMENT, `order_id` int(11) NOT NULL COMMENT '订单ID', `product_id` int(11) NOT NULL COMMENT '商品ID', `quantity` int(11) NOT NULL COMMENT '购买数量', `price` decimal(10,2) NOT NULL COMMENT '购买时的商品单价', PRIMARY KEY (`id`), KEY `idx_order_id` (`order_id`), KEY `idx_product_id` (`product_id`), CONSTRAINT `fk_order_item_order` FOREIGN KEY (`order_id`) REFERENCES `order` (`id`), CONSTRAINT `fk_order_item_product` FOREIGN KEY (`product_id`) REFERENCES `product` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单明细表';
四、核心业务SQL示例
1. 查询用户购物车商品列表
需要关联用户表、购物车表、商品表,获取用户购物车中所有商品的详细信息:
SELECT c.id AS cart_id, p.id AS product_id, p.name AS product_name, p.price AS product_price, c.quantity AS cart_quantity, p.stock AS product_stock, (p.price * c.quantity) AS subtotal FROM cart c INNER JOIN product p ON c.product_id = p.id WHERE c.user_id = 1; -- 查询用户ID为1的购物车
2. 创建订单并扣减库存
创建订单需要同时操作订单表、订单明细表,还要扣减对应商品的库存,建议使用事务保证数据一致性:
START TRANSACTION; -- 生成订单编号,这里用时间戳加随机数简单模拟,实际可自定义规则 SET @order_no = CONCAT(UNIX_TIMESTAMP(NOW()), FLOOR(RAND()*1000)); SET @user_id = 1; SET @total_amount = 299.97; -- 订单总金额,实际可从购物车计算 -- 插入订单主表 INSERT INTO `order` (order_no, user_id, total_amount, status) VALUES (@order_no, @user_id, @total_amount, 0); -- 获取生成的订单ID SET @order_id = LAST_INSERT_ID(); -- 插入订单明细,这里模拟购买3件商品,实际可从购物车数据获取 INSERT INTO order_item (order_id, product_id, quantity, price) VALUES (@order_id, 1, 2, 99.99), (@order_id, 2, 1, 99.99); -- 扣减商品库存 UPDATE product SET stock = stock - 2 WHERE id = 1; UPDATE product SET stock = stock - 1 WHERE id = 2; -- 清空用户购物车对应商品 DELETE FROM cart WHERE user_id = @user_id AND product_id IN (1,2); COMMIT;
3. 查询用户订单列表及明细
关联订单表、订单明细表、商品表,获取用户的完整订单信息:
SELECT o.order_no, o.total_amount, o.status, o.create_time, p.name AS product_name, oi.quantity, oi.price AS buy_price FROM `order` o INNER JOIN order_item oi ON o.id = oi.order_id INNER JOIN product p ON oi.product_id = p.id WHERE o.user_id = 1 ORDER BY o.create_time DESC;
五、数据库优化建议
随着商城业务数据量增长,可以做以下优化提升数据库性能:
- 对常用查询字段添加索引,比如商品表的分类ID、订单表的用户ID和订单状态
- 对商品描述等长文本字段可以考虑拆分到单独的表,减少主表查询压力
- 对历史订单数据可以做归档处理,定期迁移到历史表,减少主表数据量
- 用户密码存储不要明文,建议使用MD5加盐或者bcrypt等加密算法处理