Skip to content

数据库设计

良好的数据库设计是系统成功的关键。本章介绍数据库设计的原则和最佳实践。

设计原则

1. 数据规范化

第一范式(1NF):每列都是原子值

sql
-- 不符合 1NF
CREATE TABLE users (
    id INT,
    name VARCHAR(50),
    phones VARCHAR(200)  -- '13800138000,13900139000'
);

-- 符合 1NF
CREATE TABLE users (
    id INT,
    name VARCHAR(50)
);
CREATE TABLE user_phones (
    user_id INT,
    phone VARCHAR(20)
);

第二范式(2NF):消除部分依赖 第三范式(3NF):消除传递依赖

2. 命名规范

sql
-- 表名:复数、小写、下划线
users, orders, order_items

-- 列名:小写、下划线
user_id, created_at, total_amount

-- 索引名:idx_表名_列名
idx_users_email, idx_orders_user_id

3. 数据类型选择

sql
-- 使用合适的数据类型
id INT UNSIGNED AUTO_INCREMENT,
price DECIMAL(10,2),  -- 不用 FLOAT
status ENUM('active', 'inactive'),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP

ER 图设计

实体关系

用户 (1) ←→ (N) 订单 (1) ←→ (N) 订单项 (N) ←→ (1) 商品

示例:电商系统

sql
-- 用户表
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 商品表
CREATE TABLE products (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    price DECIMAL(10,2) NOT NULL,
    stock INT DEFAULT 0
);

-- 订单表
CREATE TABLE orders (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT NOT NULL,
    total_amount DECIMAL(10,2),
    status ENUM('pending', 'paid', 'shipped', 'delivered'),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id)
);

-- 订单项表
CREATE TABLE order_items (
    id INT PRIMARY KEY AUTO_INCREMENT,
    order_id INT NOT NULL,
    product_id INT NOT NULL,
    quantity INT NOT NULL,
    price DECIMAL(10,2) NOT NULL,
    FOREIGN KEY (order_id) REFERENCES orders(id),
    FOREIGN KEY (product_id) REFERENCES products(id)
);

最佳实践

  1. 使用主键:每个表都应有主键
  2. 外键约束:保证引用完整性
  3. 索引优化:为常用查询列创建索引
  4. 时间戳:添加 created_at 和 updated_at
  5. 软删除:使用 deleted_at 而不是真删除
  6. 版本控制:使用 version 字段实现乐观锁

性能考虑

  1. 合理使用范式
  2. 适当的反范式化
  3. 分区表
  4. 读写分离
  5. 缓存策略

小结

  • 遵循规范化原则
  • 使用合适的数据类型
  • 建立正确的关系
  • 添加必要的约束和索引
  • 考虑性能和扩展性

下一步: 学习 PRACTICE 实战项目