数据库设计
良好的数据库设计是系统成功的关键。本章介绍数据库设计的原则和最佳实践。
设计原则
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_id3. 数据类型选择
sql
-- 使用合适的数据类型
id INT UNSIGNED AUTO_INCREMENT,
price DECIMAL(10,2), -- 不用 FLOAT
status ENUM('active', 'inactive'),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMPER 图设计
实体关系
用户 (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)
);最佳实践
- 使用主键:每个表都应有主键
- 外键约束:保证引用完整性
- 索引优化:为常用查询列创建索引
- 时间戳:添加 created_at 和 updated_at
- 软删除:使用 deleted_at 而不是真删除
- 版本控制:使用 version 字段实现乐观锁
性能考虑
- 合理使用范式
- 适当的反范式化
- 分区表
- 读写分离
- 缓存策略
小结
- 遵循规范化原则
- 使用合适的数据类型
- 建立正确的关系
- 添加必要的约束和索引
- 考虑性能和扩展性
下一步: 学习 PRACTICE 实战项目