前言痛点引入
很多零基础学 SQL、做开发和数据分析的朋友,只会抄别人的表结构,自己不会设计表。 工作中自己建表经常遇到这些问题:
- 数据重复冗余严重,改一条数据要改好多地方,容易数据不一致;
- 表结构混乱,字段乱放、重复建字段,后期维护巨难;
- 插入、修改数据出现s 非法值、乱码、关联数据错乱;
- 面试被问三大范式、四大数据完整性,完全答不出来;
- 不懂企业建表规范,做项目设计表全凭感觉,不符合职场标准。
其实企业里正规建表,都遵循两套硬性标准:三大范式控制数据冗余、四大数据完整性保证数据合法准确。 本篇用大白话 + 通俗举例,不讲晦涩理论,只讲职场能用、面试必考的核心内容,零基础也能一次吃透。
分层知识点精讲
一、什么是数据库范式?
范式:是关系型数据库表结构设计的规范标准,级别越高,表设计越合理、冗余越少、数据越规整。 职场常用只需要掌握前三范式:1NF 第一范式、2NF 第二范式、3NF 第三范式,企业建表默认满足3NF。
核心作用: 减少数据冗余、避免插入异常、更新异常、删除异常,让表结构易维护、易关联、易扩展。
二、三大范式逐层精讲
1. 第一范式 1NF(原子性,最基础底线)
核心规则:字段具有原子性,不可再拆分,一个单元格只能存单一值,不能放多个数据。
- 禁止一个字段里放多个值,比如用逗号分隔存多个手机号、多个爱好
- 所有字段必须是不可拆分的最小单元
- 所有企业表必须强制满足 1NF,是建表最低门槛
2. 第二范式 2NF(完全依赖,消除部分依赖)
核心规则: 在满足 1NF 的基础上,所有非主键字段必须完全依赖于整张主键,不能只依赖主键的一部分。 适用场景:复合主键表、多字段联合做主键的业务表。 作用:拆分冗余字段,避免部分依赖带来的数据重复。
3. 第三范式 3NF(传递依赖,企业标准)
核心规则: 在满足 2NF 基础上,非主键字段之间不能存在传递依赖,不能通过其他字段推导出来。 简单说:一张表只干一件事,不存放其他业务的冗余字段。
- 用户表只存用户信息,不要冗余存所属部门名称
- 部门名称放到部门表,通过外键关联查询即可
- 3NF 是企业项目建表默认标准,日常开发、设计表都按 3NF 来
三、四大数据完整性(职场建表核心约束)
1. 实体完整性
规则:主键约束
- 主键不能为空、不能重复
- 一张表必须有主键,唯一标识每一条记录
- 保证每条数据都是独立、唯一的实体
2. 域完整性
规则:限制字段本身合法有效包含:数据类型、长度、非空、默认值、枚举限制等。 作用:限制单元格只能存规定类型的数据,防止乱填非法值。
3. 引用完整性(参照完整性)
规则:外键约束
- 子表外键值必须在主表主键中存在
- 不能随便删除主表被关联的数据
- 保证多表之间关联关系不乱、数据不脱节
4. 自定义完整性
规则:根据业务自己定义的校验规则 常用:CHECK 约束、触发器、业务逻辑判断举例:年龄必须大于 0、成绩 0~100、性别只能男 / 女等,按业务自定义规则限制。
通俗类比 + 实例表格
通俗类比
- 三大范式:好比档案归档规范,规定怎么分类、怎么拆分档案,不让信息重复乱放;
- 四大完整性:好比档案录入规矩,规定编号不能重复、信息不能为空、关联档案不能乱填、内容要符合业务规则。
反例:不满足 1NF 的错误表结构
表格
| id | 姓名 | 联系方式 |
|---|---|---|
| 1 | 张三 | 13800,13900 |
问题:联系方式一个字段放两个手机号,不满足原子性,违反 1NF。
正例:满足 1NF 拆分后
表格
| id | 姓名 | 手机号 |
|---|---|---|
| 1 | 张三 | 13800 |
| 2 | 张三 | 13900 |
3NF 规范设计:拆分表、消除冗余
错误设计(违反 3NF,冗余)订单表:id、用户名、部门名、订单金额
规范设计(满足 3NF,分表关联)
- 用户表:用户 id、用户名、部门 id
- 部门表:部门 id、部门名
- 订单表:订单 id、用户 id、订单金额 通过外键关联查名称,不冗余存放。
SQL 代码演示
1. 实体完整性:主键设置
sql
-- 主键约束,保证唯一非空,实体完整性 CREATE TABLE user ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOT NULL );2. 域完整性:非空 + 默认值 + 数据类型
sql
-- 域完整性:限制类型、非空、默认值 CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOT NULL, age INT DEFAULT 18 );3. 引用完整性:外键关联
sql
-- 外键实现引用完整性 CREATE TABLE order_info ( order_id INT PRIMARY KEY AUTO_INCREMENT, user_id INT, FOREIGN KEY (user_id) REFERENCES user(id) );4. 自定义完整性:CHECK 约束
sql
-- 自定义完整性:年龄必须大于0 CREATE TABLE person ( id INT PRIMARY KEY AUTO_INCREMENT, age INT CHECK (age > 0) );新手易错 / 职场避坑点
- ❌ 一个字段存多个值,用逗号、斜线分隔,违反1NF✅ 正解:拆分成多行或者拆分成多个字段,保证原子不可拆分。
- ❌ 为了省事,一张表塞所有字段,大量冗余,违反3NF✅ 正解:按业务拆分表,用外键关联,遵循一表一事原则。
- ❌ 不设主键,随便建表,违反实体完整性✅ 正解:企业所有业务表必须设置主键。
- ❌ 随便填外键不存在的值、随意删主表数据,破坏引用完整性✅ 正解:关联数据要合法,主表有关联数据不能随意删除。
- ❌ 忽略业务规则,不做范围限制,出现年龄负数、成绩超范围 ✅ 正解:用 CHECK、业务代码双重保证自定义完整性。
全文核心小结
- 1NF:字段原子性,不可拆分,是建表最低强制要求;
- 2NF:消除部分函数依赖,针对复合主键设计;
- 3NF:消除传递依赖,一表只做一件事,企业标准建表规范;
- 四大完整性:
- 实体完整性 → 主键
- 域完整性 → 类型、非空、默认值
- 引用完整性 → 外键关联
- 自定义完整性 → CHECK、业务规则
- 学完可以看懂企业现有表结构,也能独立按规范设计业务表,面试必背、工作必用。
思考题
思考题 1
第一范式 1NF 的核心要求是什么?
答案: 字段具备原子性,每个字段数据不可再拆分,一个单元格只能存储单一独立数据,不能存放多个拼接值。
思考题 2
第三范式 3NF 的设计原则是什么?有什么好处?
答案: 原则:在满足 2NF 基础上,消除非主键字段的传递依赖,一张表只负责一个业务实体,不冗余存放其他业务字段。 好处:减少数据冗余、避免更新删除异常、表结构更清晰易维护。
思考题 3
四大数据完整性分别是什么?各自靠什么约束实现?
答案:
- 实体完整性:主键约束
- 域完整性:数据类型、非空、默认值等
- 引用完整性:外键约束
- 自定义完整性:CHECK 约束、触发器、业务逻辑校验