关系型数据库设计的核心是规范化与反规范化平衡。开始时遵循1NF、2NF、3NF消除冗余,然后根据查询模式反规范化热门表。实践步骤:1. 识别实体和关系;2. 创建ER图;3. 规范化表结构;4. 添加索引优化查询;5. 测试性能并迭代。示例订单系统:用户表(id, name),订单表(order_id, user_id, amount),通过外键关联,避免数据重复。
第一章:数据库设计基础理论
关系型数据库设计的第一步是理解范式。第一个范式(1NF)要求每个字段原子化,不能有重复组。第二个范式(2NF)基于1NF,要求非主键属性完全依赖整个主键。第三个范式(3NF)要求非主键属性不传递依赖主键。举例,一个学生选课表最初可能有学生ID、姓名、课程ID、课程名,如果拆分成学生表和课程表,就符合3NF了。
实体关系建模实践
绘制ER图是实践起点。实体如用户、订单、产品;关系是一对多、多对多。用工具如Draw.io画出矩形(实体)、菱形(关系)、椭圆(属性)。一对多用外键实现,如订单表引用用户ID。多对多用中间表,如用户收藏产品表有user_id和product_id。
索引策略与性能优化
索引像书的目录,加速查询但增加写开销。主要用在WHERE、JOIN、ORDER BY列上。B+树索引适合范围查询,哈希索引适合等值。复合索引顺序重要,先高选择性列。避免在频繁更新列上建索引。监控EXPLAIN计划,优化慢查询。
从理论到实战:电商数据库案例
电商平台设计:用户表(users: id, email, created_at),商品表(products: id, name, price),订单表(orders: id, user_id, total),订单项表(order_items: id, order_id, product_id, qty)。添加用户状态索引,订单日期复合索引。插入10万数据后,查询用户最近订单只需毫秒。
常见陷阱与反规范化
过度规范化导致JOIN爆炸,读性能差。反规范化如在订单表存用户姓名快照,牺牲写一致性换读速度。分库分表适用于海量数据,先单库优化。事务用ACID保证一致性,长事务拆分。
FAQ
Q: 什么时候需要反规范化?
A: 当JOIN查询慢、读多写少时,反规范化热门数据。
Q: 如何选择主键?
A: 用自增ID或UUID,避免业务字段做主键。
Q: 索引太多有什么问题?
A: 占用空间大,写操作慢,定期检查删除无效索引。
Q: 数据库设计工具推荐?
A: Draw.io免费画ER图,MySQL Workbench建模生成SQL。