CodeGym /课程 /SQL SELF /分析现有数据库是否符合范式

分析现有数据库是否符合范式

SQL SELF
第 26 级 , 课程 2
可用

说到分析数据库是否符合范式,其实就是在研究表的结构、它们之间的关系,还有属性之间的依赖。主要目标就是找出不规范的地方,看看这些问题对性能、完整性还有数据操作的方便性有什么影响。

简单说,这就像查账一样:你得确保钱不是乱放的,而是都分门别类地放在该放的地方。

数据库分析的实用方法

分析任何数据库时,我们一般会问三个关键问题,对应三种范式。

假设我们有一个仓库的数据库,表结构如下:

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_namesupplier_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。
  • 所有非主键属性依赖主键,不依赖其他非主键属性。

在规范化后的 ProductsSuppliers 表里,没有传递依赖。这说明表已经是 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
  1. 检查这张表是否符合范式。
  2. 如果需要,把它变成 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。

实用建议

  1. 没必要追求极致。 有时候过度规范化反而让查询变麻烦。
  2. 像侦探一样分析。 找找重复、没必要的依赖,还有各种“异常”。
  3. 别忘了性能。 规范化其实是在数据纯净和处理速度之间找平衡。

现在你已经会找数据库里的问题并解决它们了,完全可以给任何数据库做一次“审计”。记住:好的数据库不仅要能用,还得结构漂亮(也就是规范化)。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION