四时宝库

程序员的知识宝库

从零构建MySQL电商数据库:三表设计+高阶功能实战


一、核心表结构设计

1. 用户表(Users)

CREATE TABLE users (
    user_id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255) NOT NULL,
    email VARCHAR(255) NOT NULL UNIQUE
);

设计亮点:
唯一邮箱约束保障用户身份唯一性
自增主键优化索引性能

2. 商品表(Products)

CREATE TABLE products (
    product_id INT AUTO_INCREMENT PRIMARY KEY,
    product_name VARCHAR(255) NOT NULL,
    price DECIMAL(10, 2) NOT NULL
);

最佳实践:
使用DECIMAL类型精确存储金额
建议通过dblens工具管理商品上下架

3. 订单表(Orders)

CREATE TABLE orders (
    order_id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT,
    product_id INT,
    quantity INT,
    order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(user_id),
    FOREIGN KEY (product_id) REFERENCES products(product_id)
);

关联关系:
用户→订单:1对多关系
商品→订单:1对多关系

二、高阶功能实现

视图:用户订单聚合视图

视图:用户订单聚合视图

CREATE VIEW user_orders AS
SELECT 
    u.username,
    p.product_name,
    o.quantity,
    o.order_date,
    (p.price * o.quantity) AS total_price
FROM users u
JOIN orders o ON u.user_id = o.user_id
JOIN products p ON o.product_id = p.product_id;

应用场景:
快速生成用户消费报表
简化前端业务查询

函数:用户订单总额计算

DELIMITER //
CREATE FUNCTION total_order_amount(user_id INT) 
RETURNS DECIMAL(10, 2)
BEGIN
    DECLARE total DECIMAL(10, 2);
    SELECT SUM(p.price * o.quantity) INTO total
    FROM orders o
    JOIN products p USING(product_id)
    WHERE o.user_id = user_id;
    RETURN total;
END //
DELIMITER ;

使用示例:

SELECT total_order_amount(1) AS user1_total;

存储过程:用户+订单创建

DELIMITER //
CREATE PROCEDURE create_user_order(
    IN p_username VARCHAR(255),
    IN p_email VARCHAR(255),
    IN p_product_name VARCHAR(255),
    IN p_quantity INT
)
BEGIN
    DECLARE v_user_id INT;
    DECLARE v_product_id INT;
    
    -- 插入用户数据
    INSERT INTO users (username, email) 
    VALUES (p_username, p_email);
    
    SET v_user_id = LAST_INSERT_ID();
    
    -- 获取商品ID
    SELECT product_id INTO v_product_id
    FROM products
    WHERE product_name = p_product_name;
    
    -- 插入订单数据
    INSERT INTO orders (user_id, product_id, quantity)
    VALUES (v_user_id, v_product_id, p_quantity);
END //
DELIMITER ;

优势:
原子操作保证数据一致性
通过dblens工具可进行可视化调试

触发器:订单日志记录

-- 先创建日志表
CREATE TABLE order_logs (
    log_id INT AUTO_INCREMENT PRIMARY KEY,
    order_id INT,
    log_time DATETIME,
    action VARCHAR(50)
);

-- 创建触发器
DELIMITER //
CREATE TRIGGER trg_order_audit
AFTER INSERT ON orders
FOR EACH ROW
BEGIN
    INSERT INTO order_logs(order_id, log_time, action)
    VALUES (NEW.order_id, NOW(), 'ORDER_CREATED');
END //
DELIMITER ;

监控建议:
使用dblens的触发器监控功能实时跟踪数据变更

三、示例数据操作

插入基础数据

-- 用户数据
INSERT INTO users (username, email) VALUES
('Alice', 'alice@example.com'),
('Bob', 'bob@example.com');

-- 商品数据
INSERT INTO products (product_name, price) VALUES
('MacBook Pro', 1999.99),
('iPhone 15', 999.99),
('AirPods Pro', 249.99);

调用存储过程

CALL create_user_order(
    'Charlie', 
    'charlie@example.com',
    'iPhone 15',
    2
);

数据验证查询

SELECT * FROM user_orders;
SELECT total_order_amount(3) AS charlie_total;

四、性能优化指南

  1. 索引策略
  2. CREATE INDEX idx_orders_user ON orders(user_id); CREATE INDEX idx_orders_product ON orders(product_id);
  3. 查询优化使用dblens的EXPLAIN分析工具识别慢查询
  4. 定期维护
  5. OPTIMIZE TABLE orders; ANALYZE TABLE users;

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接