当前位置: 首页 > article >正文

【MySQL】项目实践

在这里插入图片描述

个人主页:Guiat
归属专栏:MySQL

在这里插入图片描述

文章目录

  • 1. 项目实践概述
    • 1.1 项目实践的重要性
    • 1.2 项目中MySQL的典型应用场景
  • 2. 数据库设计流程
    • 2.1 需求分析与规划
    • 2.2 设计过程示例
    • 2.3 数据库设计工具
  • 3. 电子商务平台实践案例
    • 3.1 系统架构
    • 3.2 数据库Schema设计
    • 3.3 数据访问模式分析
    • 3.4 性能优化策略
  • 4. 社交媒体平台实践案例
    • 4.1 数据模型设计
    • 4.2 分区策略
    • 4.3 高并发处理方案
    • 4.4 数据库扩展方案
  • 5. 内容管理系统实践案例
    • 5.1 数据库Schema设计
    • 5.2 内容类型与字段设计
    • 5.3 内容权限管理
    • 5.4 查询优化与索引策略
  • 6. 物联网数据管理实践案例
    • 6.1 系统架构
    • 6.2 数据库Schema设计
    • 6.3 时序数据处理
    • 6.4 数据聚合与压缩策略
  • 7. 金融系统实践案例
    • 7.1 交易数据模型
    • 7.2 事务一致性实现
    • 7.3 账户转账实现示例

正文

1. 项目实践概述

MySQL在实际项目中发挥着至关重要的作用,良好的数据库设计是项目成功的基础。本文将展示MySQL在各类项目中的应用实践与最佳实践。

1.1 项目实践的重要性

  • 理论与实践相结合的必要性
  • 数据库设计决定了应用性能上限
  • 预先规划避免后期重构成本
  • 从真实案例中学习最佳实践

1.2 项目中MySQL的典型应用场景

MySQL项目应用场景
Web应用后端
电子商务平台
内容管理系统
数据分析系统
IoT数据存储
企业管理系统
社交媒体平台

2. 数据库设计流程

2.1 需求分析与规划

  • 识别系统的实体和关系
  • 确定数据流和访问模式
  • 评估数据量和增长预期
  • 定义业务规则和约束条件

2.2 设计过程示例

物理模型
逻辑模型
概念模型
数据类型选择
索引策略
存储规划
定义表结构
规范化检查
定义键和约束
识别实体
定义关系
创建ER图
需求收集
概念设计
逻辑设计
物理设计
优化设计
实施与测试
维护与演进

2.3 数据库设计工具

  • MySQL Workbench
  • dbdiagram.io
  • ERDPlus
  • Lucidchart
  • Vertabelo
  • Visual Paradigm

3. 电子商务平台实践案例

3.1 系统架构

电子商务平台
前端展示层
应用服务层
数据存储层
商品展示
购物车
订单管理
用户中心
商品服务
订单服务
支付服务
用户服务
库存服务
MySQL主从
Redis缓存
搜索引擎
文件存储
主库写入
从库读取

3.2 数据库Schema设计

-- 用户及账户相关表
CREATE TABLE users (user_id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(50) NOT NULL UNIQUE,email VARCHAR(100) NOT NULL UNIQUE,password_hash VARCHAR(255) NOT NULL,phone VARCHAR(20) UNIQUE,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,last_login TIMESTAMP NULL,status ENUM('active', 'inactive', 'suspended') DEFAULT 'active',INDEX idx_email (email),INDEX idx_username (username)
);CREATE TABLE user_addresses (address_id INT PRIMARY KEY AUTO_INCREMENT,user_id INT NOT NULL,address_type ENUM('shipping', 'billing', 'both') DEFAULT 'both',recipient_name VARCHAR(100) NOT NULL,street_address VARCHAR(255) NOT NULL,city VARCHAR(100) NOT NULL,state VARCHAR(100) NOT NULL,postal_code VARCHAR(20) NOT NULL,country VARCHAR(100) NOT NULL,phone VARCHAR(20) NOT NULL,is_default BOOLEAN DEFAULT FALSE,FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE,INDEX idx_user_id (user_id)
);-- 产品相关表
CREATE TABLE categories (category_id INT PRIMARY KEY AUTO_INCREMENT,parent_id INT NULL,name VARCHAR(100) NOT NULL,slug VARCHAR(100) NOT NULL UNIQUE,description TEXT,image_url VARCHAR(255),is_active BOOLEAN DEFAULT TRUE,display_order INT DEFAULT 0,FOREIGN KEY (parent_id) REFERENCES categories(category_id) ON DELETE SET NULL,INDEX idx_parent_id (parent_id),INDEX idx_slug (slug)
);CREATE TABLE products (product_id INT PRIMARY KEY AUTO_INCREMENT,sku VARCHAR(50) NOT NULL UNIQUE,name VARCHAR(255) NOT NULL,slug VARCHAR(255) NOT NULL UNIQUE,description TEXT,short_description VARCHAR(500),regular_price DECIMAL(10, 2) NOT NULL,sale_price DECIMAL(10, 2),cost DECIMAL(10, 2),stock_quantity INT NOT NULL DEFAULT 0,is_featured BOOLEAN DEFAULT FALSE,is_digital BOOLEAN DEFAULT FALSE,status ENUM('draft', 'published', 'archived') DEFAULT 'draft',created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,INDEX idx_sku (sku),INDEX idx_slug (slug),INDEX idx_status (status),INDEX idx_is_featured (is_featured)
);CREATE TABLE product_categories (product_id INT NOT NULL,category_id INT NOT NULL,PRIMARY KEY (product_id, category_id),FOREIGN KEY (product_id) REFERENCES products(product_id) ON DELETE CASCADE,FOREIGN KEY (category_id) REFERENCES categories(category_id) ON DELETE CASCADE
);CREATE TABLE product_images (image_id INT PRIMARY KEY AUTO_INCREMENT,product_id INT NOT NULL,image_url VARCHAR(255) NOT NULL,alt_text VARCHAR(255),is_primary BOOLEAN DEFAULT FALSE,display_order INT DEFAULT 0,FOREIGN KEY (product_id) REFERENCES products(product_id) ON DELETE CASCADE,INDEX idx_product_id (product_id)
);CREATE TABLE product_attributes (attribute_id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100) NOT NULL UNIQUE,display_name VARCHAR(100) NOT NULL,type ENUM('text', 'number', 'boolean', 'select') NOT NULL DEFAULT 'text'
);CREATE TABLE product_attribute_values (value_id INT PRIMARY KEY AUTO_INCREMENT,product_id INT NOT NULL,attribute_id INT NOT NULL,value TEXT NOT NULL,FOREIGN KEY (product_id) REFERENCES products(product_id) ON DELETE CASCADE,FOREIGN KEY (attribute_id) REFERENCES product_attributes(attribute_id) ON DELETE CASCADE,UNIQUE KEY (product_id, attribute_id),INDEX idx_product_id (product_id),INDEX idx_attribute_id (attribute_id)
);-- 订单相关表
CREATE TABLE carts (cart_id INT PRIMARY KEY AUTO_INCREMENT,user_id INT NULL,session_id VARCHAR(100) NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE SET NULL,INDEX idx_user_id (user_id),INDEX idx_session_id (session_id)
);CREATE TABLE cart_items (item_id INT PRIMARY KEY AUTO_INCREMENT,cart_id INT NOT NULL,product_id INT NOT NULL,quantity INT NOT NULL DEFAULT 1,added_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (cart_id) REFERENCES carts(cart_id) ON DELETE CASCADE,FOREIGN KEY (product_id) REFERENCES products(product_id) ON DELETE CASCADE,UNIQUE KEY (cart_id, product_id),INDEX idx_cart_id (cart_id)
);CREATE TABLE orders (order_id INT PRIMARY KEY AUTO_INCREMENT,user_id INT NOT NULL,order_number VARCHAR(50) NOT NULL UNIQUE,status ENUM('pending', 'processing', 'shipped', 'delivered', 'cancelled', 'refunded') DEFAULT 'pending',total_amount DECIMAL(10, 2) NOT NULL,tax_amount DECIMAL(10, 2) NOT NULL DEFAULT 0,shipping_amount DECIMAL(10, 2) NOT NULL DEFAULT 0,discount_amount DECIMAL(10, 2) NOT NULL DEFAULT 0,shipping_address_id INT NOT NULL,billing_address_id INT NOT NULL,payment_method VARCHAR(50) NOT NULL,shipping_method VARCHAR(50) NOT NULL,notes TEXT,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE RESTRICT,FOREIGN KEY (shipping_address_id) REFERENCES user_addresses(address_id) ON DELETE RESTRICT,FOREIGN KEY (billing_address_id) REFERENCES user_addresses(address_id) ON DELETE RESTRICT,INDEX idx_user_id (user_id),INDEX idx_order_number (order_number),INDEX idx_status (status),INDEX idx_created_at (created_at)
);CREATE TABLE order_items (item_id INT PRIMARY KEY AUTO_INCREMENT,order_id INT NOT NULL,product_id INT NOT NULL,quantity INT NOT NULL,unit_price DECIMAL(10, 2) NOT NULL,subtotal DECIMAL(10, 2) NOT NULL,FOREIGN KEY (order_id) REFERENCES orders(order_id) ON DELETE CASCADE,FOREIGN KEY (product_id) REFERENCES products(product_id) ON DELETE RESTRICT,INDEX idx_order_id (order_id),INDEX idx_product_id (product_id)
);CREATE TABLE payments (payment_id INT PRIMARY KEY AUTO_INCREMENT,order_id INT NOT NULL,amount DECIMAL(10, 2) NOT NULL,payment_method VARCHAR(50) NOT NULL,transaction_id VARCHAR(100) UNIQUE,status ENUM('pending', 'completed', 'failed', 'refunded') DEFAULT 'pending',payment_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (order_id) REFERENCES orders(order_id) ON DELETE CASCADE,INDEX idx_order_id (order_id),INDEX idx_transaction_id (transaction_id)
);

3.3 数据访问模式分析

数据访问模式
读多写少
写多读少
混合模式
产品目录
用户评论
商品搜索
用户活动日志
库存变动
订单状态更新
购物车操作
用户账户
交易记录

3.4 性能优化策略

性能优化策略
数据库层优化
应用层优化
架构层优化
索引优化
查询优化
表结构优化
配置调优
合理设计索引
避免过多索引
监控低效索引
优化SQL语句
使用EXPLAIN分析
避免全表扫描
合理的数据类型
表分区
垂直拆分
查询缓存
连接池管理
批量处理
合理分页
读写分离
分库分表
引入缓存层
异步处理

4. 社交媒体平台实践案例

4.1 数据模型设计

-- 用户系统
CREATE TABLE users (user_id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(50) NOT NULL UNIQUE,email VARCHAR(100) NOT NULL UNIQUE,password_hash VARCHAR(255) NOT NULL,full_name VARCHAR(100) NOT NULL,bio TEXT,profile_image VARCHAR(255),cover_image VARCHAR(255),website VARCHAR(255),location VARCHAR(100),is_verified BOOLEAN DEFAULT FALSE,is_private BOOLEAN DEFAULT FALSE,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,last_active TIMESTAMP,status ENUM('active', 'inactive', 'suspended') DEFAULT 'active',INDEX idx_username (username),INDEX idx_email (email),INDEX idx_status (status)
);-- 关注关系
CREATE TABLE follows (follow_id INT PRIMARY KEY AUTO_INCREMENT,follower_id INT NOT NULL,following_id INT NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,status ENUM('pending', 'accepted', 'rejected', 'blocked') DEFAULT 'accepted',FOREIGN KEY (follower_id) REFERENCES users(user_id) ON DELETE CASCADE,FOREIGN KEY (following_id) REFERENCES users(user_id) ON DELETE CASCADE,UNIQUE KEY (follower_id, following_id),INDEX idx_follower_id (follower_id),INDEX idx_following_id (following_id),INDEX idx_status (status)
);-- 内容发布
CREATE TABLE posts (post_id INT PRIMARY KEY AUTO_INCREMENT,user_id INT NOT NULL,content TEXT,has_media BOOLEAN DEFAULT FALSE,location VARCHAR(255),privacy ENUM('public', 'followers', 'private') DEFAULT 'public',created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,is_edited BOOLEAN DEFAULT FALSE,is_archived BOOLEAN DEFAULT FALSE,FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE,INDEX idx_user_id (user_id),INDEX idx_created_at (created_at),INDEX idx_privacy (privacy)
);CREATE TABLE post_media (media_id INT PRIMARY KEY AUTO_INCREMENT,post_id INT NOT NULL,media_type ENUM('image', 'video', 'audio', 'document') NOT NULL,media_url VARCHAR(255) NOT NULL,thumbnail_url VARCHAR(255),alt_text VARCHAR(255),width INT,height INT,duration INT,display_order INT DEFAULT 0,FOREIGN KEY (post_id) REFERENCES posts(post_id) ON DELETE CASCADE,INDEX idx_post_id (post_id),INDEX idx_media_type (media_type)
);-- 互动功能
CREATE TABLE comments (comment_id INT PRIMARY KEY AUTO_INCREMENT,post_id INT NOT NULL,user_id INT NOT NULL,parent_comment_id INT,content TEXT NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,is_edited BOOLEAN DEFAULT FALSE,FOREIGN KEY (post_id) REFERENCES posts(post_id) ON DELETE CASCADE,FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE,FOREIGN KEY (parent_comment_id) REFERENCES comments(comment_id) ON DELETE SET NULL,INDEX idx_post_id (post_id),INDEX idx_user_id (user_id),INDEX idx_parent_comment_id (parent_comment_id)
);CREATE TABLE likes (like_id INT PRIMARY KEY AUTO_INCREMENT,user_id INT NOT NULL,likeable_type ENUM('post', 'comment') NOT NULL,likeable_id INT NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE,UNIQUE KEY (user_id, likeable_type, likeable_id),INDEX idx_user_id (user_id),INDEX idx_likeable (likeable_type, likeable_id)
);-- 消息系统
CREATE TABLE conversations (conversation_id INT PRIMARY KEY AUTO_INCREMENT,type ENUM('direct', 'group') NOT NULL DEFAULT 'direct',title VARCHAR(255),created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,INDEX idx_type (type)
);CREATE TABLE conversation_participants (participant_id INT PRIMARY KEY AUTO_INCREMENT,conversation_id INT NOT NULL,user_id INT NOT NULL,joined_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,is_admin BOOLEAN DEFAULT FALSE,last_read_at TIMESTAMP,status ENUM('active', 'left', 'removed') DEFAULT 'active',FOREIGN KEY (conversation_id) REFERENCES conversations(conversation_id) ON DELETE CASCADE,FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE,UNIQUE KEY (conversation_id, user_id),INDEX idx_conversation_id (conversation_id),INDEX idx_user_id (user_id)
);CREATE TABLE messages (message_id INT PRIMARY KEY AUTO_INCREMENT,conversation_id INT NOT NULL,sender_id INT NOT NULL,message_type ENUM('text', 'image', 'video', 'audio', 'file', 'location', 'system') NOT NULL DEFAULT 'text',content TEXT,media_url VARCHAR(255),sent_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,is_edited BOOLEAN DEFAULT FALSE,edited_at TIMESTAMP,FOREIGN KEY (conversation_id) REFERENCES conversations(conversation_id) ON DELETE CASCADE,FOREIGN KEY (sender_id) REFERENCES users(user_id) ON DELETE CASCADE,INDEX idx_conversation_id (conversation_id),INDEX idx_sender_id (sender_id),INDEX idx_sent_at (sent_at)
);

4.2 分区策略

分区策略
RANGE分区
LIST分区
HASH分区
KEY分区
时间范围分区
ID范围分区
地理位置分区
类别分区
负载均衡分区
并行处理优化
posts_2022
posts_2023
posts_2024

4.3 高并发处理方案

高并发处理
数据库层面
中间件层面
应用层面
主从复制
读写分离
分库分表
Redis缓存
消息队列
连接池
异步处理
服务降级
限流策略

4.4 数据库扩展方案

-- 分区表示例 - 按创建时间分区的消息表
CREATE TABLE messages_partitioned (message_id INT NOT NULL,conversation_id INT NOT NULL,sender_id INT NOT NULL,message_type ENUM('text', 'image', 'video', 'audio', 'file', 'location', 'system') NOT NULL DEFAULT 'text',content TEXT,media_url VARCHAR(255),sent_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,is_edited BOOLEAN DEFAULT FALSE,edited_at TIMESTAMP,PRIMARY KEY (message_id, sent_at),INDEX idx_conversation_id (conversation_id),INDEX idx_sender_id (sender_id)
) PARTITION BY RANGE (UNIX_TIMESTAMP(sent_at)) (PARTITION p_2022_01 VALUES LESS THAN (UNIX_TIMESTAMP('2022-02-01 00:00:00')),PARTITION p_2022_02 VALUES LESS THAN (UNIX_TIMESTAMP('2022-03-01 00:00:00')),PARTITION p_2022_03 VALUES LESS THAN (UNIX_TIMESTAMP('2022-04-01 00:00:00')),-- ... 更多分区PARTITION p_future VALUES LESS THAN MAXVALUE
);-- 分区维护 - 添加新分区
ALTER TABLE messages_partitioned ADD PARTITION (PARTITION p_2022_04 VALUES LESS THAN (UNIX_TIMESTAMP('2022-05-01 00:00:00'))
);-- 水平分表 - 按用户ID Hash分片的示例
-- 在用户表中增加分片键
ALTER TABLE users ADD COLUMN shard_key INT GENERATED ALWAYS AS (user_id % 4) STORED;-- 创建分片表
CREATE TABLE posts_shard_0 LIKE posts;
CREATE TABLE posts_shard_1 LIKE posts;
CREATE TABLE posts_shard_2 LIKE posts;
CREATE TABLE posts_shard_3 LIKE posts;-- 分片路由视图
CREATE VIEW posts_view ASSELECT * FROM posts_shard_0UNION ALLSELECT * FROM posts_shard_1UNION ALLSELECT * FROM posts_shard_2UNION ALLSELECT * FROM posts_shard_3;

5. 内容管理系统实践案例

5.1 数据库Schema设计

-- 用户和权限系统
CREATE TABLE users (user_id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(50) NOT NULL UNIQUE,email VARCHAR(100) NOT NULL UNIQUE,password_hash VARCHAR(255) NOT NULL,first_name VARCHAR(50) NOT NULL,last_name VARCHAR(50) NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,last_login TIMESTAMP NULL,status ENUM('active', 'inactive', 'suspended') DEFAULT 'active',INDEX idx_username (username),INDEX idx_email (email),INDEX idx_status (status)
);CREATE TABLE roles (role_id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL UNIQUE,description TEXT
);CREATE TABLE permissions (permission_id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL UNIQUE,description TEXT
);CREATE TABLE role_permissions (role_id INT NOT NULL,permission_id INT NOT NULL,PRIMARY KEY (role_id, permission_id),FOREIGN KEY (role_id) REFERENCES roles(role_id) ON DELETE CASCADE,FOREIGN KEY (permission_id) REFERENCES permissions(permission_id) ON DELETE CASCADE
);CREATE TABLE user_roles (user_id INT NOT NULL,role_id INT NOT NULL,PRIMARY KEY (user_id, role_id),FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE,FOREIGN KEY (role_id) REFERENCES roles(role_id) ON DELETE CASCADE
);-- 内容结构
CREATE TABLE content_types (content_type_id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL UNIQUE,slug VARCHAR(50) NOT NULL UNIQUE,description TEXT,is_active BOOLEAN DEFAULT TRUE
);CREATE TABLE content_fields (field_id INT PRIMARY KEY AUTO_INCREMENT,content_type_id INT NOT NULL,name VARCHAR(50) NOT NULL,field_type ENUM('text', 'longtext', 'number', 'date', 'boolean', 'image', 'file', 'relation') NOT NULL,is_required BOOLEAN DEFAULT FALSE,default_value TEXT,display_order INT DEFAULT 0,FOREIGN KEY (content_type_id) REFERENCES content_types(content_type_id) ON DELETE CASCADE,UNIQUE KEY (content_type_id, name),INDEX idx_content_type_id (content_type_id)
);CREATE TABLE categories (category_id INT PRIMARY KEY AUTO_INCREMENT,parent_id INT NULL,name VARCHAR(100) NOT NULL,slug VARCHAR(100) NOT NULL UNIQUE,description TEXT,is_active BOOLEAN DEFAULT TRUE,FOREIGN KEY (parent_id) REFERENCES categories(category_id) ON DELETE SET NULL,INDEX idx_parent_id (parent_id),INDEX idx_slug (slug)
);CREATE TABLE tags (tag_id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL UNIQUE,slug VARCHAR(50) NOT NULL UNIQUE,description TEXT,INDEX idx_slug (slug)
);-- 内容项
CREATE TABLE content_items (content_id INT PRIMARY KEY AUTO_INCREMENT,content_type_id INT NOT NULL,title VARCHAR(255) NOT NULL,slug VARCHAR(255) NOT NULL UNIQUE,author_id INT NOT NULL,status ENUM('draft', 'published', 'archived') DEFAULT 'draft',created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,published_at TIMESTAMP NULL,featured_image VARCHAR(255),excerpt TEXT,FOREIGN KEY (content_type_id) REFERENCES content_types(content_type_id) ON DELETE RESTRICT,FOREIGN KEY (author_id) REFERENCES users(user_id) ON DELETE RESTRICT,INDEX idx_content_type_id (content_type_id),INDEX idx_author_id (author_id),INDEX idx_status (status),INDEX idx_created_at (created_at),INDEX idx_published_at (published_at),INDEX idx_slug (slug)
);CREATE TABLE content_fields_data (data_id INT PRIMARY KEY AUTO_INCREMENT,content_id INT NOT NULL,field_id INT NOT NULL,field_value TEXT,FOREIGN KEY (content_id) REFERENCES content_items(content_id) ON DELETE CASCADE,FOREIGN KEY (field_id) REFERENCES content_fields(field_id) ON DELETE CASCADE,UNIQUE KEY (content_id, field_id),INDEX idx_content_id (content_id),INDEX idx_field_id (field_id)
);CREATE TABLE content_categories (content_id INT NOT NULL,category_id INT NOT NULL,PRIMARY KEY (content_id, category_id),FOREIGN KEY (content_id) REFERENCES content_items(content_id) ON DELETE CASCADE,FOREIGN KEY (category_id) REFERENCES categories(category_id) ON DELETE CASCADE,INDEX idx_content_id (content_id),INDEX idx_category_id (category_id)
);CREATE TABLE content_tags (content_id INT NOT NULL,tag_id INT NOT NULL,PRIMARY KEY (content_id, tag_id),FOREIGN KEY (content_id) REFERENCES content_items(content_id) ON DELETE CASCADE,FOREIGN KEY (tag_id) REFERENCES tags(tag_id) ON DELETE CASCADE,INDEX idx_content_id (content_id),INDEX idx_tag_id (tag_id)
);-- 评论系统
CREATE TABLE comments (comment_id INT PRIMARY KEY AUTO_INCREMENT,content_id INT NOT NULL,parent_id INT NULL,author_id INT NULL,author_name VARCHAR(100),author_email VARCHAR(100),author_ip VARCHAR(45),comment_text TEXT NOT NULL,status ENUM('pending', 'approved', 'spam', 'trash') DEFAULT 'pending',created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (content_id) REFERENCES content_items(content_id) ON DELETE CASCADE,FOREIGN KEY (parent_id) REFERENCES comments(comment_id) ON DELETE SET NULL,FOREIGN KEY (author_id) REFERENCES users(user_id) ON DELETE SET NULL,INDEX idx_content_id (content_id),INDEX idx_parent_id (parent_id),INDEX idx_author_id (author_id),INDEX idx_status (status),INDEX idx_created_at (created_at)
);-- 媒体库
CREATE TABLE media (media_id INT PRIMARY KEY AUTO_INCREMENT,user_id INT NOT NULL,file_name VARCHAR(255) NOT NULL,file_path VARCHAR(255) NOT NULL,file_type VARCHAR(100) NOT NULL,mime_type VARCHAR(100) NOT NULL,file_size INT NOT NULL,width INT,height INT,alt_text VARCHAR(255),caption TEXT,uploaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE RESTRICT,INDEX idx_user_id (user_id),INDEX idx_file_type (file_type),INDEX idx_uploaded_at (uploaded_at)
);-- 版本控制
CREATE TABLE content_revisions (revision_id INT PRIMARY KEY AUTO_INCREMENT,content_id INT NOT NULL,user_id INT NOT NULL,revision_data JSON NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,revision_note VARCHAR(255),FOREIGN KEY (content_id) REFERENCES content_items(content_id) ON DELETE CASCADE,FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE RESTRICT,INDEX idx_content_id (content_id),INDEX idx_user_id (user_id),INDEX idx_created_at (created_at)
);-- 网站设置
CREATE TABLE settings (setting_id INT PRIMARY KEY AUTO_INCREMENT,setting_key VARCHAR(100) NOT NULL UNIQUE,setting_value TEXT,is_system BOOLEAN DEFAULT FALSE,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,updated_by INT,FOREIGN KEY (updated_by) REFERENCES users(user_id) ON DELETE SET NULL,INDEX idx_setting_key (setting_key)
);-- 菜单管理
CREATE TABLE menus (menu_id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100) NOT NULL UNIQUE,description TEXT
);CREATE TABLE menu_items (item_id INT PRIMARY KEY AUTO_INCREMENT,menu_id INT NOT NULL,parent_id INT NULL,title VARCHAR(100) NOT NULL,url VARCHAR(255),target VARCHAR(20) DEFAULT '_self',icon VARCHAR(50),content_id INT NULL,order_position INT DEFAULT 0,FOREIGN KEY (menu_id) REFERENCES menus(menu_id) ON DELETE CASCADE,FOREIGN KEY (parent_id) REFERENCES menu_items(item_id) ON DELETE SET NULL,FOREIGN KEY (content_id) REFERENCES content_items(content_id) ON DELETE SET NULL,INDEX idx_menu_id (menu_id),INDEX idx_parent_id (parent_id)
);

5.2 内容类型与字段设计

内容类型
文章
页面
产品
事件
用户自定义
标题字段
内容字段
图片字段
分类与标签
固定页面
动态页面
产品信息
价格字段
库存字段
日期与时间
地点字段
注册表单

5.3 内容权限管理

权限管理
基于角色的访问控制
内容级权限
操作权限
管理员
编辑
作者
贡献者
订阅者
公开内容
私有内容
密码保护
会员专享
创建权限
编辑权限
发布权限
删除权限

5.4 查询优化与索引策略

-- 优化内容检索的复合索引
ALTER TABLE content_items
ADD INDEX idx_type_status_date (content_type_id, status, published_at);-- 优化标签搜索的索引
ALTER TABLE content_tags
ADD INDEX idx_tag_content (tag_id, content_id);-- 全文搜索索引
ALTER TABLE content_items
ADD FULLTEXT INDEX ft_content (title, excerpt);-- 分析常见查询模式并优化
EXPLAIN SELECT ci.content_id, ci.title, ci.slug, ci.published_at, u.username
FROM content_items ci
JOIN users u ON ci.author_id = u.user_id
JOIN content_categories cc ON ci.content_id = cc.content_id
WHERE ci.content_type_id = 1 
AND ci.status = 'published'
AND cc.category_id = 5
ORDER BY ci.published_at DESC
LIMIT 10;-- 查询优化后的存储过程示例
DELIMITER //
CREATE PROCEDURE get_latest_content_by_category(IN p_category_id INT,IN p_content_type_id INT,IN p_limit INT
)
BEGINSELECT ci.content_id, ci.title, ci.slug, ci.published_at, u.username as author_name, ci.featured_imageFROM content_items ciJOIN users u ON ci.author_id = u.user_idJOIN content_categories cc ON ci.content_id = cc.content_idWHERE ci.content_type_id = p_content_type_idAND ci.status = 'published'AND cc.category_id = p_category_idORDER BY ci.published_at DESCLIMIT p_limit;
END //
DELIMITER ;

6. 物联网数据管理实践案例

6.1 系统架构

IoT数据管理系统
设备层
通信层
数据处理层
存储层
应用层
传感器
控制器
网关设备
MQTT协议
HTTP/REST
WebSocket
实时处理
批量处理
数据验证
MySQL时序表
内存数据库
数据归档
数据可视化
异常监控
数据分析

6.2 数据库Schema设计

-- 设备管理
CREATE TABLE devices (device_id INT PRIMARY KEY AUTO_INCREMENT,device_uuid VARCHAR(36) NOT NULL UNIQUE,device_type_id INT NOT NULL,name VARCHAR(100) NOT NULL,description TEXT,firmware_version VARCHAR(50),hardware_version VARCHAR(50),ip_address VARCHAR(45),mac_address VARCHAR(17),location_id INT,status ENUM('active', 'inactive', 'maintenance', 'error') DEFAULT 'active',created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,last_online TIMESTAMP NULL,INDEX idx_device_uuid (device_uuid),INDEX idx_device_type_id (device_type_id),INDEX idx_status (status),INDEX idx_location_id (location_id),INDEX idx_last_online (last_online)
);CREATE TABLE device_types (device_type_id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100) NOT NULL UNIQUE,description TEXT,properties JSON
);CREATE TABLE locations (location_id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100) NOT NULL,description TEXT,address VARCHAR(255),city VARCHAR(100),state VARCHAR(100),country VARCHAR(100),latitude DECIMAL(10, 8),longitude DECIMAL(11, 8),parent_location_id INT NULL,FOREIGN KEY (parent_location_id) REFERENCES locations(location_id) ON DELETE SET NULL,INDEX idx_parent_location_id (parent_location_id),INDEX idx_coordinates (latitude, longitude)
);-- 传感器数据模型
CREATE TABLE sensors (sensor_id INT PRIMARY KEY AUTO_INCREMENT,device_id INT NOT NULL,sensor_type VARCHAR(50) NOT NULL,name VARCHAR(100) NOT NULL,description TEXT,unit VARCHAR(20),min_value DECIMAL(10, 2),max_value DECIMAL(10, 2),precision_digits INT DEFAULT 2,status ENUM('active', 'inactive', 'error') DEFAULT 'active',FOREIGN KEY (device_id) REFERENCES devices(device_id) ON DELETE CASCADE,INDEX idx_device_id (device_id),INDEX idx_sensor_type (sensor_type)
);-- 采用分区表存储时序数据
CREATE TABLE sensor_readings (reading_id BIGINT PRIMARY KEY AUTO_INCREMENT,sensor_id INT NOT NULL,timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,value DECIMAL(15, 5) NOT NULL,quality TINYINT DEFAULT 100,FOREIGN KEY (sensor_id) REFERENCES sensors(sensor_id) ON DELETE CASCADE,INDEX idx_sensor_timestamp (sensor_id, timestamp)
) PARTITION BY RANGE (UNIX_TIMESTAMP(timestamp)) (PARTITION p_history VALUES LESS THAN (UNIX_TIMESTAMP('2023-01-01 00:00:00')),PARTITION p_2023_q1 VALUES LESS THAN (UNIX_TIMESTAMP('2023-04-01 00:00:00')),PARTITION p_2023_q2 VALUES LESS THAN (UNIX_TIMESTAMP('2023-07-01 00:00:00')),PARTITION p_2023_q3 VALUES LESS THAN (UNIX_TIMESTAMP('2023-10-01 00:00:00')),PARTITION p_2023_q4 VALUES LESS THAN (UNIX_TIMESTAMP('2024-01-01 00:00:00')),PARTITION p_current VALUES LESS THAN MAXVALUE
);-- 创建每日聚合数据表
CREATE TABLE sensor_daily_aggregations (aggregation_id INT PRIMARY KEY AUTO_INCREMENT,sensor_id INT NOT NULL,date DATE NOT NULL,min_value DECIMAL(15, 5),max_value DECIMAL(15, 5),avg_value DECIMAL(15, 5),sum_value DECIMAL(20, 5),count_readings INT,first_reading_timestamp TIMESTAMP,last_reading_timestamp TIMESTAMP,FOREIGN KEY (sensor_id) REFERENCES sensors(sensor_id) ON DELETE CASCADE,UNIQUE KEY (sensor_id, date),INDEX idx_date (date)
);-- 警报配置和历史
CREATE TABLE alert_rules (rule_id INT PRIMARY KEY AUTO_INCREMENT,sensor_id INT NOT NULL,name VARCHAR(100) NOT NULL,condition_type ENUM('threshold_high', 'threshold_low', 'rate_of_change', 'no_data', 'custom') NOT NULL,threshold_value DECIMAL(15, 5),comparison_operator VARCHAR(10),duration_seconds INT DEFAULT 0,is_active BOOLEAN DEFAULT TRUE,severity ENUM('info', 'warning', 'error', 'critical') DEFAULT 'warning',notification_channels JSON,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,FOREIGN KEY (sensor_id) REFERENCES sensors(sensor_id) ON DELETE CASCADE,INDEX idx_sensor_id (sensor_id),INDEX idx_is_active (is_active)
);CREATE TABLE alert_history (alert_id BIGINT PRIMARY KEY AUTO_INCREMENT,rule_id INT NOT NULL,sensor_id INT NOT NULL,triggered_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,resolved_at TIMESTAMP NULL,duration_seconds INT NULL,trigger_value DECIMAL(15, 5),message TEXT,acknowledged BOOLEAN DEFAULT FALSE,acknowledged_by INT NULL,acknowledged_at TIMESTAMP NULL,FOREIGN KEY (rule_id) REFERENCES alert_rules(rule_id) ON DELETE CASCADE,FOREIGN KEY (sensor_id) REFERENCES sensors(sensor_id) ON DELETE CASCADE,INDEX idx_rule_id (rule_id),INDEX idx_sensor_id (sensor_id),INDEX idx_triggered_at (triggered_at),INDEX idx_resolved_at (resolved_at),INDEX idx_acknowledged (acknowledged)
) PARTITION BY RANGE (UNIX_TIMESTAMP(triggered_at)) (PARTITION p_2023_h1 VALUES LESS THAN (UNIX_TIMESTAMP('2023-07-01 00:00:00')),PARTITION p_2023_h2 VALUES LESS THAN (UNIX_TIMESTAMP('2024-01-01 00:00:00')),PARTITION p_current VALUES LESS THAN MAXVALUE
);

6.3 时序数据处理

时序数据处理
数据收集
数据存储
数据处理
数据展示
传感器实时采集
边缘过滤处理
批量导入
原始时序表
聚合表
归档策略
统计计算
异常检测
预测分析
实时监控
历史趋势
报表生成

6.4 数据聚合与压缩策略

-- 创建自动聚合存储过程
DELIMITER //
CREATE PROCEDURE aggregate_daily_sensor_data(IN p_date DATE)
BEGININSERT INTO sensor_daily_aggregations(sensor_id, date, min_value, max_value, avg_value, sum_value, count_readings, first_reading_timestamp, last_reading_timestamp)SELECT sensor_id,DATE(timestamp) AS reading_date,MIN(value) AS min_value,MAX(value) AS max_value,AVG(value) AS avg_value,SUM(value) AS sum_value,COUNT(*) AS count_readings,MIN(timestamp) AS first_reading_timestamp,MAX(timestamp) AS last_reading_timestampFROM sensor_readingsWHERE DATE(timestamp) = p_dateGROUP BY sensor_id, DATE(timestamp)ON DUPLICATE KEY UPDATEmin_value = VALUES(min_value),max_value = VALUES(max_value),avg_value = VALUES(avg_value),sum_value = VALUES(sum_value),count_readings = VALUES(count_readings),first_reading_timestamp = VALUES(first_reading_timestamp),last_reading_timestamp = VALUES(last_reading_timestamp);
END //
DELIMITER ;-- 创建动态分区管理存储过程
DELIMITER //
CREATE PROCEDURE manage_sensor_readings_partitions()
BEGINDECLARE next_quarter_start DATE;DECLARE partition_name VARCHAR(100);DECLARE partition_timestamp BIGINT;-- 确定下一个季度开始时间SET next_quarter_start = DATE_ADD(DATE(CONCAT(YEAR(CURDATE()), '-', CASE WHEN MONTH(CURDATE()) BETWEEN 1 AND 3 THEN '04-01'WHEN MONTH(CURDATE()) BETWEEN 4 AND 6 THEN '07-01'WHEN MONTH(CURDATE()) BETWEEN 7 AND 9 THEN '10-01'ELSE CONCAT(YEAR(CURDATE())+1, '-01-01')END)), INTERVAL 3 MONTH);-- 检查是否已有下下个季度的分区SET partition_name = CONCAT('p_', YEAR(next_quarter_start), '_q', CEILING(MONTH(next_quarter_start) / 3));SET partition_timestamp = UNIX_TIMESTAMP(next_quarter_start);-- 添加新分区SET @sql = CONCAT('ALTER TABLE sensor_readings REORGANIZE PARTITION p_current INTO (','PARTITION ', partition_name, ' VALUES LESS THAN (', partition_timestamp, '),','PARTITION p_current VALUES LESS THAN MAXVALUE)');PREPARE stmt FROM @sql;EXECUTE stmt;DEALLOCATE PREPARE stmt;-- 清理旧数据或归档旧分区-- 实际项目中可能将数据归档到其他表或存储系统
END //
DELIMITER ;-- 创建数据清理或归档处理存储过程
DELIMITER //
CREATE PROCEDURE archive_sensor_data(IN p_months_to_keep INT)
BEGINDECLARE archive_date DATE;SET archive_date = DATE_SUB(CURDATE(), INTERVAL p_months_to_keep MONTH);-- 归档数据到历史表INSERT INTO sensor_readings_archiveSELECT * FROM sensor_readingsWHERE DATE(timestamp) < archive_date;-- 删除已归档的数据DELETE FROM sensor_readingsWHERE DATE(timestamp) < archive_date;-- 通过事件调度器定期执行
END //
DELIMITER ;

7. 金融系统实践案例

7.1 交易数据模型

-- 账户管理
CREATE TABLE accounts (account_id INT PRIMARY KEY AUTO_INCREMENT,user_id INT NOT NULL,account_number VARCHAR(20) NOT NULL UNIQUE,account_type ENUM('checking', 'savings', 'credit', 'investment') NOT NULL,currency_code CHAR(3) NOT NULL DEFAULT 'USD',current_balance DECIMAL(15, 2) NOT NULL DEFAULT 0.00,available_balance DECIMAL(15, 2) NOT NULL DEFAULT 0.00,status ENUM('active', 'inactive', 'frozen', 'closed') DEFAULT 'active',opened_date DATE NOT NULL,closed_date DATE NULL,last_activity_date TIMESTAMP NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,INDEX idx_user_id (user_id),INDEX idx_account_number (account_number),INDEX idx_status (status),CHECK (current_balance >= available_balance OR account_type = 'credit')
);-- 事务使用分区表管理大量交易记录
CREATE TABLE transactions (transaction_id BIGINT PRIMARY KEY AUTO_INCREMENT,transaction_reference VARCHAR(36) NOT NULL UNIQUE,account_id INT NOT NULL,transaction_type ENUM('deposit', 'withdrawal', 'transfer_in', 'transfer_out', 'payment', 'fee', 'interest', 'adjustment') NOT NULL,amount DECIMAL(15, 2) NOT NULL,running_balance DECIMAL(15, 2) NOT NULL,status ENUM('pending', 'completed', 'failed', 'reversed') DEFAULT 'pending',description VARCHAR(255) NOT NULL,metadata JSON,transaction_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,cleared_date TIMESTAMP NULL,created_by VARCHAR(50) NOT NULL,FOREIGN KEY (account_id) REFERENCES accounts(account_id) ON DELETE RESTRICT,INDEX idx_account_id (account_id),INDEX idx_transaction_reference (transaction_reference),INDEX idx_transaction_date (transaction_date),INDEX idx_status (status)
) PARTITION BY RANGE (YEAR(transaction_date) * 100 + MONTH(transaction_date)) (PARTITION p_history VALUES LESS THAN (202301),PARTITION p_2023_01 VALUES LESS THAN (202302),PARTITION p_2023_02 VALUES LESS THAN (202303),PARTITION p_2023_03 VALUES LESS THAN (202304),-- 更多月份分区PARTITION p_future VALUES LESS THAN MAXVALUE
);-- 转账交易关联表
CREATE TABLE transfers (transfer_id BIGINT PRIMARY KEY AUTO_INCREMENT,source_transaction_id BIGINT NOT NULL,destination_transaction_id BIGINT NOT NULL,amount DECIMAL(15, 2) NOT NULL,fee_amount DECIMAL(15, 2) DEFAULT 0.00,exchange_rate DECIMAL(15, 6) DEFAULT 1.000000,transfer_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,status ENUM('pending', 'completed', 'failed', 'cancelled') DEFAULT 'pending',FOREIGN KEY (source_transaction_id) REFERENCES transactions(transaction_id) ON DELETE RESTRICT,FOREIGN KEY (destination_transaction_id) REFERENCES transactions(transaction_id) ON DELETE RESTRICT,INDEX idx_source (source_transaction_id),INDEX idx_destination (destination_transaction_id),INDEX idx_transfer_date (transfer_date),INDEX idx_status (status)
);-- 余额变更审计表
CREATE TABLE balance_audit (audit_id BIGINT PRIMARY KEY AUTO_INCREMENT,account_id INT NOT NULL,transaction_id BIGINT NULL,previous_balance DECIMAL(15, 2) NOT NULL,new_balance DECIMAL(15, 2) NOT NULL,change_amount DECIMAL(15, 2) NOT NULL,change_type VARCHAR(50) NOT NULL,changed_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,changed_by VARCHAR(50) NOT NULL,FOREIGN KEY (account_id) REFERENCES accounts(account_id) ON DELETE RESTRICT,FOREIGN KEY (transaction_id) REFERENCES transactions(transaction_id) ON DELETE SET NULL,INDEX idx_account_id (account_id),INDEX idx_transaction_id (transaction_id),INDEX idx_changed_at (changed_at)
);

7.2 事务一致性实现

事务一致性保证
数据库事务
锁机制
并发控制
错误处理
ACID特性
事务隔离级别
分布式事务
行级锁
表级锁
死锁预防
乐观锁
悲观锁
版本控制
错误码定义
回滚策略
故障恢复

7.3 账户转账实现示例

-- 转账存储过程示例
DELIMITER //
CREATE PROCEDURE transfer_funds(IN p_source_account_id INT,IN p_destination_account_id INT,IN p_amount DECIMAL(15, 2),IN p_description VARCHAR(255),IN p_user VARCHAR(50),OUT p_transfer_id BIGINT,OUT p_success BOOLEAN,OUT p_message VARCHAR(255)
)
BEGINDECLARE v_source_balance DECIMAL(15, 2);DECLARE v_source_currency CHAR(3);DECLARE v_dest_currency CHAR(3);DECLARE v_exchange_rate DECIMAL(15, 6) DEFAULT 1.000000;DECLARE v_converted_amount DECIMAL(15, 2);DECLARE v_source_transaction_id BIGINT;DECLARE v_dest_transaction_id BIGINT;DECLARE v_source_reference VARCHAR(36);DECLARE v_dest_reference VARCHAR(36);DECLARE v_exit_handler BOOLEAN DEFAULT FALSE;DECLARE CONTINUE HANDLER FOR SQLEXCEPTIONBEGINSET v_exit_handler = TRUE;SET p_success = FALSE;SET p_message = 'Database error occurred during transfer';ROLLBACK;END;-- 生成唯一交易引用SET v_source_reference = UUID();SET v_dest_reference = UUID();-- 验证账户存在且状态正常SELECT current_balance, currency_code INTO v_source_balance, v_source_currencyFROM accountsWHERE account_id = p_source_account_id AND status = 'active'FOR UPDATE;IF v_source_balance IS NULL THENSET p_success = FALSE;SET p_message = 'Source account invalid or inactive';LEAVE sp;END IF;SELECT currency_code INTO v_dest_currencyFROM accountsWHERE account_id = p_destination_account_id AND status = 'active'FOR UPDATE;IF v_dest_currency IS NULL THENSET p_success = FALSE;SET p_message = 'Destination account invalid or inactive';LEAVE sp;END IF;-- 检查余额是否足够IF v_source_balance < p_amount THENSET p_success = FALSE;SET p_message = 'Insufficient funds';LEAVE sp;END IF;-- 货币转换(如果需要)IF v_source_currency != v_dest_currency THEN-- 在实际应用中,应该查询实时汇率或汇率表-- 这里简化处理SET v_exchange_rate = 1.1; -- 示例汇率SET v_converted_amount = p_amount * v_exchange_rate;ELSESET v_converted_amount = p_amount;END IF;START TRANSACTION;-- 添加出账交易记录INSERT INTO transactions (transaction_reference, account_id, transaction_type, amount, running_balance, status, description, created_by) VALUES (v_source_reference, p_source_account_id, 'transfer_out',-p_amount, v_source_balance - p_amount, 'completed',p_description, p_user);SET v_source_transaction_id = LAST_INSERT_ID();-- 添加入账交易记录INSERT INTO transactions (transaction_reference, account_id, transaction_type, amount, running_balance, status, description, created_by) 

结语
感谢您的阅读!期待您的一键三连!欢迎指正!

在这里插入图片描述

相关文章:

【MySQL】项目实践

个人主页&#xff1a;Guiat 归属专栏&#xff1a;MySQL 文章目录 1. 项目实践概述1.1 项目实践的重要性1.2 项目中MySQL的典型应用场景 2. 数据库设计流程2.1 需求分析与规划2.2 设计过程示例2.3 数据库设计工具 3. 电子商务平台实践案例3.1 系统架构3.2 数据库Schema设计3.3 数…...

windows下authas调试tomcat

一般情况下&#xff0c;我们只需要输入以下代码 java -jar authas.jar调试tomcat时需要加上进程号 java -jar authas.jar <PID> 此外&#xff0c;如果你使用的是 Java 11 或更高版本&#xff0c;你需要添加 --add-opens 参数&#xff0c;以便 Arthas 能够访问 JVM 的内…...

回调函数应用示例

回调函数是一种通过函数指针&#xff08;或引用&#xff09;调用的函数&#xff0c;它在特定事件或条件发生时被另一个函数调用。回调函数的核心思想是将函数作为参数传递&#xff0c;以便在适当的时候执行自定义逻辑&#xff0c;常用于异步编程、事件驱动架构等场景。 业务场景…...

upload-labs通关笔记-第4关 文件上传之.htacess绕过

目录 一、.htacess 二、代码审计 三、php ts版本安装 1、下载ts版本php 2、放入到phpstudy指定文件夹中 3、修改php配置文件 4、修改php.ini文件 5、修改httpd.conf文件 &#xff08;1&#xff09;定位文件 &#xff08;2&#xff09;修改文件 6、重启小皮 7、切换…...

DeepSearch代表工作

介绍下今年以来深度搜索相关的一些论文~ 文章目录 Search-o1简述方法实验Search-R1简介方法带搜索引擎的强化学习多轮搜索调用的生成训练模板奖励建模实验R1-Searcher简介方法数据选择两阶段的强化学习训练算法ReSearch: Learning to Reason with Search for LLMs via Reinforc…...

记录一次服务器卡顿

一、服务器卡顿现象 服务用了一段时间后&#xff0c;突然很卡&#xff0c;发现在服务器上新建excel也很卡&#xff0c;发现服务器中病毒了&#xff0c;然后重新安装了操作系统。重新安装服务环境时&#xff0c;发现同时安装pdf、tomcat时都很慢&#xff0c;只能一个安装好了&am…...

C++ 中的几种锁机制整理

1. 互斥锁&#xff08;std::mutex&#xff09; ✅ 简介 最常用的线程同步工具。保证同一时间只能有一个线程访问临界区。 ✅ 使用方式 #include <mutex>std::mutex mtx;void safeFunction() {std::lock_guard<std::mutex> lock(mtx);// 临界区代码 }✅ 优点 简…...

leetcode2749. 得到整数零需要执行的最少操作数-medium

1 题目&#xff1a;得到整数零需要执行的最少操作数 官方标定难度&#xff1a;中 给你两个整数&#xff1a;num1 和 num2 。 在一步操作中&#xff0c;你需要从范围 [0, 60] 中选出一个整数 i &#xff0c;并从 num1 减去 2i num2 。 请你计算&#xff0c;要想使 num1 等于…...

14 C 语言浮点类型详解:类型精度、表示形式、字面量后缀、格式化输出、容差判断、存储机制

1 浮点类型 1.1 浮点类型概述 浮点类型用于表示小数&#xff08;如 123.4、3.1415、0.99&#xff09;&#xff0c;支持正数、负数和零&#xff0c;是科学计算和工程应用的核心数据类型。 1.2 浮点数的类型与规格 浮点类型存储大小值范围&#xff08;近似&#xff09;实际有效…...

Java 多线程基础:Thread 类核心用法详解

一、线程创建 1. 继承 Thread 类&#xff08;传统写法&#xff09; class MyThread extends Thread { Override public void run() { System.out.println("线程执行"); } } // 使用示例 MyThread t new MyThread(); t.start(); 缺点&#xff1a;Java 单…...

Vue3:脚手架

工程环境配置 1.安装nodejs 这里我已经安装过了&#xff0c;只需要打开链接Node.js — Run JavaScript Everywhere直接下载nodejs&#xff0c;安装直接一直下一步下一步 安装完成之后我们来使用电脑的命令行窗口检查一下版本 查看npm源 这里npm源的地址是淘宝的源&#xff0…...

显性知识的主要特征

有4个主要特征&#xff1a; 客观存在性静态存在性可共享性认知元能性...

使用pytest实现参数化后,控制台输出的日志是乱码

测试用例id显示的是乱码 问题 testcases/test_测试用例.py::TestPro::test_测试用例_用例1**[\u5fc3\u453g2]** PASSED [ 33%] 要让 pytest 在参数化测试中正确显示中文用例名称而非 Unicode 转义字符&#xff0c;可以通过以下两种方法 解决&#xff1a; 全局禁用测试 ID …...

自定义快捷键软件:AutoHotkey 高效的快捷键执行脚本软件

AutoHotkey 是一种适用于 Windows 的免费开源脚本语言&#xff0c;它允许用户轻松创建从小型到复杂的脚本&#xff0c;用于各种任务&#xff0c;例如&#xff1a;表单填充、自动点击、宏等。 定义鼠标和键盘的热键&#xff0c;重新映射按键或按钮&#xff0c;并进行类似自动更…...

【C++】 —— 笔试刷题day_30

一、爱吃素 题目解析 这道题&#xff0c;简单来说就是给定两个数a和b&#xff0c;然后让我们判断a*b是否是素数。 算法思路 这道题还是比较简单的 首先&#xff0c;输入两个数a和b&#xff0c;这两个数的数据范围都是[1, 10^11]&#xff1b;10的11次方&#xff0c;那a*b不就是…...

React文件上传组件封装全攻略

React文件上传组件封装指南 在现代Web应用开发中,文件上传是一个常见且重要的功能。本文将详细介绍如何使用React封装一个高质量、可复用的文件上传组件,内容涵盖基础实现、高级特性、性能优化和最佳实践等方面。 基础文件上传组件实现 核心功能设计 一个完整的文件上传组…...

`ParameterizedType` 和 `TypeVariable` 的区别

在 Java 的泛型系统中&#xff0c;ParameterizedType 和 TypeVariable 是两个不同的类型表示&#xff0c;它们都属于 java.lang.reflect.Type 接口的子接口。两者都在反射&#xff08;Reflection&#xff09;中用于描述泛型信息&#xff0c;但用途和含义不同。 &#x1f31f; 一…...

PSA Certified

Arm 推出的 PSA Certified 已成为安全芯片设计领域的黄金标准。通过对安全启动、加密服务以及更新协议等方面制定全面的要求&#xff0c;PSA Certified为芯片制造商提供了清晰的路线图&#xff0c;使其能将安全机制深植于定制芯片解决方案的基础架构中。作为对PSA Certified的补…...

项目版本管理和Git分支管理方案

文章目录 一、团队协作1.项目团队与职责2.项目时间线与里程碑3.风险评估与应对措施4.跨团队同步会议&#xff08;定期&#xff09;跨团队同步会议&#xff08;双周) 5.版本升级决策树6.边界明确与路标制定a.功能边界划分b.项目路标制定b1、项目路标制定核心要素b2. 路标表格模板…...

蓝牙AVRCP协议概述

AVRCP(Audio/Video Remote Control Profile)定义了蓝牙设备和 audio/video 控制功能通信的特 点和过程&#xff0c;另用于远程控制音视频设备&#xff0c;底层传输基于 AVCTP 传输协议。该 Profile 定义了AV/C 数字命令控制集。命令和信息通过 AVCTP(Audio/Video Control Trans…...

2025长三角杯数学建模B题思路模型代码:空气源热泵供暖的温度预测,赛题分析与思路

2025长三角杯数学建模B题思路模型代码&#xff0c;详细内容见文末名片 空气源热泵是一种与中央空调类似的设备&#xff0c;其结构主要由压缩主机、热交换 器以及末端构成&#xff0c;依靠水泵对末端房屋提供热量来实现制热。空气源热泵作为热 惯性负载&#xff0c;调节潜力巨…...

基于大数据的租房信息可视化系统的设计与实现【源码+文档+部署】

课题名称 基于大数据的租房信息可视化系统的设计与实现 学 院 专 业 计算机科学与技术 学生姓名 指导教师 一、课题来源及意义 租房市场一直是社会关注的热点问题。随着城市化进程的加速&#xff0c;大量人口涌入城市&#xff0c;导致租房需求激增。传统的租…...

下周,Coinbase将被纳入标普500指数

Coinbase加入标普500指数紧随比特币突破10万美元大关之后。加密资产正在日益成为美国金融体系的一部分。大型机构已获得监管批准创建现货比特币交易所交易基金&#xff0c;进一步推动了加密货币的主流化进程。 加密货币行业迎来里程碑时刻&#xff0c;Coinbase即将加入标普500…...

C++(17):引用传参

目录 一、核心概念 二、代码示例&#xff1a;对比指针和引用 1. 指针传参的问题 2. 引用传参的改进 三、引用传参的优势 四、总结 一、核心概念 别名机制&#xff1a;引用是变量的别名&#xff0c;操作引用等同于操作原变量。 避免拷贝&#xff1a;直接操作原始变量&…...

文章记单词 | 第82篇(六级)

一&#xff0c;单词释义 continual /kənˈtɪnjuəl/- adj. 持续不断的&#xff1b;频繁的instinct /ˈɪnstɪŋkt/- n. 本能&#xff1b;直觉weekday /ˈwiːkdeɪ/- n. 工作日&#xff08;周一至周五&#xff09;glove /ɡlʌv/- n. 手套process /ˈprəʊses/- n. 过程&a…...

30天通过软考高项-质量论文

近年来,尤其随着5G技术的普及及使用,JZ各单位接入数据的类型及容量呈现明显上升趋势,电信诈骗等案件频发,且GA部明确各地的国产化时间要求。TJ原有的大数据应用系统已无法满足完全满足jz单位对大数据的使用的要求。TJJZ总队于23年12月正式启动算力中心项目,该项目合同额13…...

容器化-k8s-使用和部署

一、K8s 使用 1、基本概念 集群: 由 master 节点和多个 slaver 节点组成,是 K8s 的运行基础。节点: 可以是物理机或虚拟机,是 K8s 集群的工作单元,运行容器化应用。Pod: K8s 中最小的部署单元,一个 Pod 可以包含一个或多个紧密相关的容器,这些容器共享网络和存储资源。…...

C++ Kafka客户端(cppkafka)安装与问题解决指南

一、cppkafka简介 cppkafka是一个现代C的Apache Kafka客户端库&#xff0c;它是对librdkafka的高级封装&#xff0c;旨在简化使用librdkafka的过程&#xff0c;同时保持最小的性能开销。 #mermaid-svg-qDUFSYLBf8cKkvdw {font-family:"trebuchet ms",verdana,arial,…...

一发入魂:极简解决 SwiftUI 复杂视图未能正确刷新的问题(中)

概述 各位似秃非秃小码农们都知道,在 SwiftUI 中视图是状态的函数,这意味着状态的改变会导致界面被刷新。 但是,对于有些复杂布局的 SwiftUI 视图来说,它们的界面并不能直接映射到对应的状态上去。这就会造成一个问题:状态的改变并没有及时的引起 UI 的变化。 如上图所示…...

Go语言处理HTTP下载中EOFFailed

在 Go 语言中使用 HTTP 下载文件时遇到 EOF 或 Failed 错误&#xff0c;通常是由于网络连接问题、服务器中断、未正确处理响应体或并发写入冲突等原因导致的。以下是详细的解决方案&#xff1a; 1. 检查错误类型并重试 io.EOF 错误可能表示连接被服务器关闭&#xff0c;而 Fai…...