第2章:数据库设计基础理论

好,咱们进入正题。这一章讲的是数据库设计的“内功心法”。你想想看,不懂这些基础理论,上来就建表,那跟盖楼不打地基有什么区别?我在项目里见过太多“跑得起来但改不动”的系统,说白了,就是基础没打牢。

2.1 关系型数据库核心概念

先聊聊最基础的东西。关系型数据库,你可以把它想象成一个Excel大合集。但比Excel严谨得多。

2.1.1 表(Table)与字段(Field)

就是实体。比如“员工表”、“部门表”。字段就是属性。比如员工的姓名、工号、入职日期。

我个人习惯,在设计表时,字段名全小写,用下划线分隔。比如 user_name,而不是 UserName。为什么?因为大多数数据库对大小写敏感,全小写能避免很多莫名其妙的错误。嗯,这是踩坑换来的经验。

2.1.2 主键(Primary Key)

主键就是每行数据的“身份证号”。必须唯一,不能为空。我建议你用自增整数或者UUID。但要注意:

  • 自增整数:性能好,但分布式场景下会冲突
  • UUID:全局唯一,但占空间大,查询慢一点
我的建议:单库单表用自增ID。微服务、分库分表用雪花算法生成的ID。别用业务字段做主键,比如身份证号——万一哪天格式变了呢?

2.1.3 外键(Foreign Key)

外键是用来建立表与表之间关系的。比如员工表里的 dept_id,指向部门表的主键。

但是!我在实际项目中,很少用数据库层面的外键约束。为什么?因为外键约束会影响写入性能,而且在分布式系统里根本没法用。我更倾向于在应用层(Java/Python代码里)维护这种关系。这叫“逻辑外键”。

注意:面试时可以说外键很重要。但做项目时,除非是财务、银行等强一致性场景,否则慎用物理外键。

2.1.4 索引(Index)

索引就是书的目录。没有索引,查数据就得全表扫描——数据量一上去,直接卡死。

我记得有一次,一个OA系统的审批流程页面打开要30秒。一查,核心表没加索引。加上之后,秒开。

索引类型主要有:

索引类型 说明 使用场景
普通索引 最基本的索引 经常查询的字段
唯一索引 值必须唯一 身份证号、工号
联合索引 多个字段组合 经常一起查询的字段
全文索引 用于文本搜索 文章内容、审批意见
核心原则:索引不是越多越好。写多读少的表少建索引。每个表索引建议控制在5个以内。

2.2 三大范式详解

范式,说白了就是“表该怎么设计”的规范。一共6级,但实际工作中掌握前3级就够了。

2.2.1 第一范式(1NF):字段不可再分

每个字段只能存一个值。比如“地址”字段不能写成“北京市海淀区中关村”,应该拆成“省、市、区、详细地址”。

我曾经接手过一个OA系统,里面有个“附件”字段,存的是“文件1.zip,文件2.pdf,文件3.docx”。查询时还得用代码拆分,麻烦得要死。这就是违反第一范式的典型。

2.2.2 第二范式(2NF):非主键字段必须完全依赖主键

说白了,就是一张表只描述一件事。比如员工表里,员工信息依赖员工ID,部门信息依赖部门ID。如果把部门名称也放在员工表里,那部门改名时,就得更新所有员工记录——这就是部分依赖。

正确的做法:拆成员工表和部门表,用部门ID关联。

2.2.3 第三范式(3NF):非主键字段不能传递依赖

这个有点绕。举个例子:员工表里有“部门ID”和“部门地址”。部门地址其实是通过部门ID推导出来的,这就是传递依赖。应该把部门地址放到部门表里。

实战建议:不要死磕范式。有时候为了查询性能,适当反范式化是必要的。比如OA系统的审批表,我经常会把“申请人姓名”冗余进去,避免每次都要联表查询。这叫“空间换时间”。

2.3 ER图绘制规范

ER图(实体关系图)是数据库设计的“蓝图”。画好ER图,建表就成功了一半。

2.3.1 基本符号

  • 矩形:实体(表)
  • 椭圆:属性(字段)
  • 菱形:关系(关联)
  • 连线:1对1、1对多、多对多

2.3.2 我的绘图习惯

我一般先画核心实体,再画关联关系。比如OA系统:

  1. 先画出“用户”、“部门”、“角色”三个核心实体
  2. 再画“用户属于部门”(多对一)
  3. 再画“用户拥有角色”(多对多)
  4. 最后补充属性字段
小技巧:ER图不要画得太细。字段太多会看不清。我通常只画关键字段,详细字段在PDMan里补充。

2.4 PowerDesigner / PDMan 工具入门

工欲善其事,必先利其器。这两个工具我都用过,说说我的感受。

2.4.1 PowerDesigner

老牌工具,功能强大。支持逆向工程(从数据库生成模型)、正向工程(从模型生成SQL)。但缺点也很明显:

  • 收费,而且不便宜
  • 界面老旧,学习曲线陡
  • 适合大型企业、传统项目

2.4.2 PDMan(国产之光)

我最近几年一直在用PDMan。免费、开源、界面清爽。支持MySQL、Oracle、PostgreSQL等主流数据库。

它的核心功能:

  • 可视化建表:拖拽就能建字段
  • 自动生成SQL:设计完直接导出建表语句
  • 版本管理:可以对比两个版本的差异
  • 文档导出:一键生成数据库设计文档(Word/PDF)
我的推荐:个人项目、中小团队用PDMan。大企业、需要严格管控的用PowerDesigner。但说实话,PDMan已经能满足90%的需求了。

2.4.3 快速上手PDMan

安装后,跟着这几步走:

  1. 新建项目,选择数据库类型(比如MySQL 8.0)
  2. 创建表,添加字段(名称、类型、长度、是否为空)
  3. 设置主键(一般选自增ID)
  4. 建立外键关系(拖拽连线即可)
  5. 点击“生成SQL”,复制到数据库执行

嗯,就这么简单。你试试看,十分钟就能上手。


好了,这一章的内容就到这里。理论是枯燥的,但它是你未来少踩坑的保障。下一章我们开始实战——设计OA系统的用户模块表结构。