说到分析数据库是否符合范式,其实就是在研究表的结构、它们之间的关系,还有属性之间的依赖。主要目标就是找出不规范的地方,看看这些问题对性能、完整性还有数据操作的方便性有什么影响。
简单说,这就像查账一样:你得确保钱不是乱放的,而是都分门别类地放在该放的地方。
数据库分析的实用方法
分析任何数据库时,我们一般会问三个关键问题,对应三种范式。
假设我们有一个仓库的数据库,表结构如下:
| product_id | product_name | supplier_name | supplier_phone | stock_quantity |
|---|---|---|---|---|
| 1 | 钉子 | 建材配件 | +12301112233 | 150 |
| 2 | 螺丝 | 紧固件专家 | +12306667788 | 200 |
| 3 | 螺母 | 建材配件 | +12301112233 | 100 |
怎么检查这张表是不是符合范式?
提醒一下,表满足 1NF,如果:
- 每个单元格只有一个值。
- 表里没有为同一类型数据重复的列。
在我们这个例子里,没有违反 1NF:每个单元格都是原子的。这说明表已经是 1NF 了。Nice!可以继续往下走。
表满足 2NF,如果:
- 它已经是 1NF。
- 所有非主键属性只依赖于整个主键(不是主键的一部分)。
在这张表里,supplier_name 和 supplier_phone 只依赖 product_id —— 也就是主键。但这里有数据重复:同一个供应商的名字和电话在多行里都出现了。
要让表达到 2NF,可以把它拆成两张表:
表 Products:
| product_id | product_name | supplier_id | stock_quantity |
|---|---|---|---|
| 1 | 钉子 | 1 | 150 |
| 2 | 螺丝 | 2 | 200 |
| 3 | 螺母 | 1 | 100 |
表 Suppliers:
| supplier_id | supplier_name | supplier_phone |
|---|---|---|
| 1 | 建材配件 | +78901112233 |
| 2 | 紧固件专家 | +78906667788 |
现在每个供应商只出现一次,表之间通过外键 supplier_id 关联。
表满足 3NF,如果:
- 它已经是 2NF。
- 所有非主键属性只依赖主键,不依赖其他非主键属性。
在规范化后的 Products 和 Suppliers 表里,没有传递依赖。这说明表已经是 3NF 了。
实战练习
假设我们有原始表 "大学"
| student_id | student_name | course_name | professor_name | professor_email |
|---|---|---|---|---|
| 101 | Otto Lin | 数学 | Peter Pen | pen@university.com |
| 102 | Anna Song | 物理 | Alex Sid | sid@university.com |
| 103 | Otto Lin | 物理 | Alex Sid | sid@university.com |
- 检查这张表是否符合范式。
- 如果需要,把它变成 1NF、2NF 和 3NF。
解答
步骤 1:检查 1NF
表已经是 1NF:每个单元格只有一个值。
步骤 2:检查 2NF
表不符合 2NF:老师的信息(名字和邮箱)重复了。我们可以把它拆出来:
表 Students:
| student_id | student_name |
|---|---|
| 101 | Otto Lin |
| 102 | Anna Song |
表 Courses:
| course_id | course_name | professor_id |
|---|---|---|
| 1 | 数学 | 1 |
| 2 | 物理 | 2 |
表 Professors:
| professor_id | professor_name | professor_email |
|---|---|---|
| 1 | Peter Pen | pen@university.com |
| 2 | Alex Sid | sid@university.com |
表 Enrollments:
| enrollment_id | student_id | course_id |
|---|---|---|
| 1 | 101 | 1 |
| 2 | 102 | 2 |
| 3 | 103 | 2 |
步骤 3:检查 3NF
新结构里没有传递依赖。表都符合 3NF。
实用建议
- 没必要追求极致。 有时候过度规范化反而让查询变麻烦。
- 像侦探一样分析。 找找重复、没必要的依赖,还有各种“异常”。
- 别忘了性能。 规范化其实是在数据纯净和处理速度之间找平衡。
现在你已经会找数据库里的问题并解决它们了,完全可以给任何数据库做一次“审计”。记住:好的数据库不仅要能用,还得结构漂亮(也就是规范化)。
GO TO FULL VERSION