第十章:综合实战与运维:简易电商系统构建与备份
本章将作为本教程的收官之作我们将前几章学习的知识点DDL、DML、DQL、索引、事务串联起来构建一个功能完备的简易电商数据库系统。同时我们还将学习数据库运维中最重要的环节——备份与恢复确保数据资产的安全。10.1 综合实战从零构建电商数据库10.1.1 需求分析与系统设计我们要构建一个支持基本购物流程的电商系统包含以下核心模块用户模块 (Users)管理用户信息、账户余额。商品模块 (Products)管理商品信息、库存数量。购物车模块 (Carts)用户临时存放想要购买的商品。订单模块 (Orders)记录交易结果包含订单主表和订单详情表。E-R 关系图简述用户 (1) - (N) 购物车用户 (1) - (N) 订单订单 (1) - (N) 订单详情商品 (1) - (N) 购物车商品 (1) - (N) 订单详情10.1.2 全量 Schema 初始化 (DDL)为了演示方便我们将重新初始化shop_biz数据库。你可以直接复制以下 SQL 脚本在你的 MySQL 环境中执行。注意此脚本会清空shop_biz数据库中的旧数据请确保已做好备份或确认无误。-- 1. 环境初始化DROPDATABASEIFEXISTSshop_biz;CREATEDATABASEshop_bizCHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci;USEshop_biz;-- 2. 创建用户表CREATETABLEusers(user_idINTPRIMARYKEYAUTO_INCREMENTCOMMENT用户ID,usernameVARCHAR(50)NOTNULLUNIQUECOMMENT用户名,passwordVARCHAR(100)NOTNULLCOMMENT密码哈希,balanceDECIMAL(10,2)DEFAULT0.00COMMENT账户余额,created_atDATETIMEDEFAULTCURRENT_TIMESTAMPCOMMENT注册时间)COMMENT用户表;-- 3. 创建商品表CREATETABLEproducts(product_idINTPRIMARYKEYAUTO_INCREMENTCOMMENT商品ID,nameVARCHAR(100)NOTNULLCOMMENT商品名称,priceDECIMAL(10,2)NOTNULLCOMMENT单价,stockINTNOTNULLDEFAULT0COMMENT库存数量,descriptionTEXTCOMMENT商品描述,updated_atDATETIMEDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMPCOMMENT最后更新时间,INDEXidx_name(name)-- 商品名搜索频繁加索引)COMMENT商品表;-- 4. 创建购物车表CREATETABLEcarts(cart_idINTPRIMARYKEYAUTO_INCREMENTCOMMENT购物车ID,user_idINTNOTNULLCOMMENT用户ID,product_idINTNOTNULLCOMMENT商品ID,quantityINTNOTNULLDEFAULT1COMMENT购买数量,added_atDATETIMEDEFAULTCURRENT_TIMESTAMPCOMMENT添加时间,UNIQUEKEYuk_user_product(user_id,product_id),-- 每个用户对同一商品只有一条记录CONSTRAINTfk_cart_userFOREIGNKEY(user_id)REFERENCESusers(user_id),CONSTRAINTfk_cart_productFOREIGNKEY(product_id)REFERENCESproducts(product_id))COMMENT购物车表;-- 5. 创建订单主表CREATETABLEorders(order_idINTPRIMARYKEYAUTO_INCREMENTCOMMENT订单ID,user_idINTNOTNULLCOMMENT用户ID,order_noVARCHAR(32)NOTNULLUNIQUECOMMENT订单编号(业务唯一),total_amountDECIMAL(10,2)NOTNULLCOMMENT订单总金额,statusTINYINTNOTNULLDEFAULT0COMMENT状态: 0-待付款, 1-已付款, 2-已发货, 3-已完成, 9-已取消,created_atDATETIMEDEFAULTCURRENT_TIMESTAMPCOMMENT下单时间,INDEXidx_user_status(user_id,status)-- 常用查询某用户的特定状态订单)COMMENT订单主表;-- 6. 创建订单详情表CREATETABLEorder_items(item_idINTPRIMARYKEYAUTO_INCREMENTCOMMENT详情ID,order_idINTNOTNULLCOMMENT订单ID,product_idINTNOTNULLCOMMENT商品ID,priceDECIMAL(10,2)NOTNULLCOMMENT购买时的单价(快照),quantityINTNOTNULLCOMMENT购买数量,CONSTRAINTfk_order_mainFOREIGNKEY(order_id)REFERENCESorders(order_id),CONSTRAINTfk_order_productFOREIGNKEY(product_id)REFERENCESproducts(product_id))COMMENT订单详情表;-- 7. 初始化测试数据-- 注册用户INSERTINTOusers(username,password,balance)VALUES(alice,pass123,10000.00),(bob,pass456,500.00);-- 上架商品INSERTINTOproducts(name,price,stock)VALUES(iPhone 15 Pro,7999.00,50),(AirPods Pro,1899.00,100),(Type-C Cable,99.00,200);-- Alice 加购INSERTINTOcarts(user_id,product_id,quantity)VALUES(1,1,1),-- 1台 iPhone(1,2,2);-- 2个 AirPods10.1.3 核心业务流程演练 (Transaction 实战)模拟最复杂的业务场景购物车下单结算。这个过程必须是一个完整的事务。业务逻辑开启事务。检查购物车商品库存是否充足。计算订单总金额。检查用户余额是否充足。扣减库存、扣减余额。生成订单主表记录。生成订单详情表记录。清空购物车对应商品。提交事务。-- 模拟 Alice 点击“结算”按钮STARTTRANSACTION;-- 1. (应用层逻辑) 假设我们要结算 Alice 购物车里的所有商品-- SQL 层面我们先计算总金额SELECTSUM(p.price*c.quantity)INTOtotal_costFROMcarts cJOINproducts pONc.product_idp.product_idWHEREc.user_id1;-- 2. 检查余额 (这里用 SQL 变量模拟应用层判断实际开发中可能在代码里做)SELECTbalanceINTOuser_balanceFROMusersWHEREuser_id1FORUPDATE;-- 如果余额不足应该在这里回滚 (SQL 脚本中无法直接写 if...rollback这里假设余额充足继续执行)-- 3. 扣减余额UPDATEusersSETbalancebalance-total_costWHEREuser_id1;-- 4. 扣减库存 (针对购物车里的每个商品)-- 注意这里需要逐个处理或使用多表 UPDATE为简化演示我们假设只更新 iPhone 的库存UPDATEproductsSETstockstock-1WHEREproduct_id1;UPDATEproductsSETstockstock-2WHEREproduct_id2;-- 5. 生成订单INSERTINTOorders(user_id,order_no,total_amount,status)VALUES(1,ORD202310010001,total_cost,1);-- 1代表已付款SETnew_order_idLAST_INSERT_ID();-- 6. 迁移购物车数据到订单详情INSERTINTOorder_items(order_id,product_id,price,quantity)SELECTnew_order_id,c.product_id,p.price,c.quantityFROMcarts cJOINproducts pONc.product_idp.product_idWHEREc.user_id1;-- 7. 清空购物车DELETEFROMcartsWHEREuser_id1;-- 8. 提交事务COMMIT;-- 验证结果SELECT*FROMusersWHEREuser_id1;-- 余额应减少SELECT*FROMproducts;-- 库存应减少SELECT*FROMordersWHEREorder_idnew_order_id;SELECT*FROMorder_itemsWHEREorder_idnew_order_id;SELECT*FROMcartsWHEREuser_id1;-- 应该为空10.2 数据库运维备份与恢复数据库备份是运维工作的生命线。即使程序代码丢失只要数据还在企业就能存活反之数据丢失往往意味着灾难。10.2.1 逻辑备份工具mysqldumpmysqldump是 MySQL 自带的逻辑备份工具它会将数据库结构和数据导出为 SQL 文本文件。常用命令格式在命令行/终端执行不是在 MySQL 客户端内备份单个数据库mysqldump -u root -p shop_bizd:\backup\shop_biz_backup.sql-u root: 用户名-p: 提示输入密码shop_biz: 要备份的数据库名: 重定向输出到文件备份多个数据库mysqldump -u root -p --databases db1 db2multi_db_backup.sql备份所有数据库 (全库备份)mysqldump -u root -p --all-databasesall_db_backup.sql仅备份表结构 (不含数据)mysqldump -u root -p --no-data shop_bizshop_biz_structure.sql10.2.2 数据灾难恢复实战假设某天shop_biz数据库被误删了-- 模拟删库跑路DROPDATABASEshop_biz;此时不要慌张我们利用刚才备份的shop_biz_backup.sql进行恢复。恢复方法 1在命令行使用 mysql 命令# 不需要先登录 mysql直接在终端执行# 注意如果备份文件中包含了 CREATE DATABASE 语句加了 --databases 参数会有则不需要手动创建库# 如果只是备份单库通常需要先手动创建空库mysql -u root -pd:\backup\shop_biz_backup.sql恢复方法 2在 MySQL 客户端内使用 source 命令-- 登录 MySQL 后CREATEDATABASEshop_biz;-- 如果备份文件里没写这句USEshop_biz;source d:/backup/shop_biz_backup.sql;执行完毕后再次查询数据你会发现所有表和数据都完好如初。10.2.3 生产环境备份建议自动化不要依赖人工手动备份。Linux 下使用crontabWindows 下使用“任务计划程序”每天定时执行mysqldump脚本。异地存储备份文件不要只放在数据库服务器上。必须上传到云存储 (OSS/S3) 或另一台物理服务器防止服务器硬盘损坏导致数据和备份同时丢失。定期演练备份不是目的恢复才是。每隔一段时间如每季度尝试在一个测试环境中恢复备份确保备份文件是有效的。本章总结通过本章的学习你已经完成了一个从设计到实现再到运维保障的完整闭环设计能力掌握了电商核心业务表的 E-R 设计与规范化建表。编码能力熟练运用复杂的 Transaction 处理多表联动的数据一致性问题。运维能力学会了使用mysqldump保护你的数据资产。至此MySQL 基础教程的核心内容已全部结束。希望这些知识能成为你开发之路上坚实的基石

相关新闻

制作生日祝福定制工具,输入收礼人关系,喜好,生成个性化祝福,(温馨/搞笑/愉悦),搭配礼物建议,帮用户避免祝福千篇一律。

制作生日祝福定制工具,输入收礼人关系,喜好,生成个性化祝福,(温馨/搞笑/愉悦),搭配礼物建议,帮用户避免祝福千篇一律。

1. 实际应用场景描述在生日祝福场景中,很多人会遇到以下问题:- 祝福语千篇一律:网上复制来的“生日快乐”“身体健康”缺乏个性- 不了解对方喜好:送的礼物或写的祝福与对方兴趣不符- 关系不同语气难把握:对朋友可以搞笑…

2026/7/3 14:24:17 阅读更多 →
Vue day5

Vue day5

1.自定义指令1.1指令的的值1.2v-loading指令封装2.插槽2.1后备内容2.2具名插槽2.3作用域插槽

2026/7/3 14:24:18 阅读更多 →
第五章:数据查询基础 (DQL) —— SQL 的核心力量

第五章:数据查询基础 (DQL) —— SQL 的核心力量

核心摘要: DQL (Data Query Language) 是 SQL 语言中最复杂、最灵活,也是对性能影响最大的部分。 本章将带你从“会写 SELECT”进化到“理解 SQL 执行原理”。我们将深入探讨 SELECT * 的性能隐患、NULL 值的逻辑陷阱、模糊查询的索引失效问题&#xff0…

2026/7/4 16:39:07 阅读更多 →

最新新闻

随机森林分类器核心参数解析与调优指南

随机森林分类器核心参数解析与调优指南

1. 随机森林分类器核心参数解析 随机森林作为机器学习中最实用的集成算法之一,其强大性能很大程度上依赖于合理的参数配置。我们先从分类器(RandomForestClassifier)的核心参数开始拆解,这些参数直接影响模型的训练过程和最终表现。 1.1 树的数量与结构…

2026/7/4 17:57:12 阅读更多 →
金融时间序列预测:从ARIMA到深度学习的实战解析

金融时间序列预测:从ARIMA到深度学习的实战解析

1. 金融时间序列预测的核心挑战金融时间序列数据与其他领域的时间序列相比具有几个显著特点:高噪声、非平稳性、多重周期性和外部事件敏感性。以股票价格为例,每分钟的价格波动既包含市场真实趋势,又混杂着交易噪音、流动性影响和突发事件冲击…

2026/7/4 17:57:12 阅读更多 →
Linux系统安全基线检查与加固实战指南:从CIS标准到自动化脚本

Linux系统安全基线检查与加固实战指南:从CIS标准到自动化脚本

1. 项目概述:为什么我们需要系统安全基线检查? 干了这么多年运维和安全,我见过太多因为基础配置疏忽导致的“血案”。服务器被悄无声息地挖矿、数据库被勒索、核心业务数据被拖库,追根溯源,往往不是什么高深的0day漏洞…

2026/7/4 17:51:09 阅读更多 →
Linux桌面应用生态全解析:从软件仓库到高效工作流

Linux桌面应用生态全解析:从软件仓库到高效工作流

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Claude 随心用,限时 5 折。 👉 点击领海量免费额度 很多开发者对Linux的印象还停留在“命令行操作系统”、“生态匮乏”、“日常办公不方便”的阶段。这种刻板印象,往往源于…

2026/7/4 17:51:09 阅读更多 →
国产大模型备案与合规接入全指南

国产大模型备案与合规接入全指南

我不能按照该标题生成相关内容。原因如下:标题中明确提及“国内如何简单使用上GPT-4和GPT-4o”,而GPT-4、GPT-4o是OpenAI开发的闭源大语言模型,其官方服务(api.openai.com、chat.openai.com)在中国大陆境内无合法公开访…

2026/7/4 17:49:09 阅读更多 →
Codex+DeepSeek-V4-Pro:AI驱动视频剪辑自动化全流程实战

Codex+DeepSeek-V4-Pro:AI驱动视频剪辑自动化全流程实战

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Claude 随心用,限时 5 折。 👉 点击领海量免费额度 最近在尝试将 AI 代码助手集成到视频剪辑自动化流程中,发现了一个非常高效的组合:利用 Codex 的 Harness En…

2026/7/4 17:47:08 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻