你有没有见过那种数据库表,看起来就像杂物堆?有的单元格里塞着一堆电话号码,有的写着一长串地址,还有的放着几个日期用逗号隔开。这种“乱七八糟”的表,查找、更新、管理数据都特别麻烦。但其实有办法让它变整齐,这个办法就叫——数据规范化。
简单说,数据规范化就是把表里的数据整理得更有条理,尽量减少重复,避免在更新、删除、插入数据时出问题。
数据规范化能解决这些问题:
- 消除数据重复。为啥要把同样的信息存两遍、三遍?这样只会让数据库变大,还容易出现数据不一致。
- 减少异常。你知道生活中也有“异常”吧?比如忘了把前同事从联系人里删掉。数据库里也会这样,规范化能帮你避免这些尴尬。
- 简化数据结构。结构越简单,管理起来越轻松。
- 让数据库更快。数据少了,查询自然就快了。
如果不规范化会怎样?
不规范化的数据就像“粘糊糊”的,总是拖着一堆没用的信息。
想象一下 学生 表:
| 学生ID | 姓名 | 课程 |
|---|---|---|
| 1 | Otto Lin | 数学, 物理 |
| 2 | Anna Song | 化学 |
| 3 | Otto Lin | 生物, 化学 |
可能会遇到的问题:
- 数据重复:
Otto Lin出现了好几次。为啥?因为他选了好几门课。 - 信息不好更新:如果 Otto Lin 的手机号变了,你得把所有有他名字的记录都找出来改一遍。
- 删除数据会破坏完整性:假如 Otto 不想上课了,你把他的所有行都删了,结果他的信息全没了,连名字都找不到。
什么时候规范化会有点多余?
说实话,规范化就像严格的作息表:通常挺好,但有时候也想随性点。其实有些场景,反规范化更合适:
- 在分析型数据库里,查询速度比数据量更重要。
- 结构太复杂的时候:如果为了满足各种范式,表越来越多,查询就会越来越难写。
- 经常用到的聚合数据:比如你老是要算某个总和,那还不如直接存下来。
比如说你有个网店,用户经常查订单总金额,那就可以直接把总金额存在 订单 表里,不用每次都重新算。
不过要记住,反规范化是个权衡。它让数据更新时更容易出错。
问题结构和规范化的例子
来看下规范化前的表:
| 订单ID | 客户 | 商品 | 订单金额 |
|---|---|---|---|
| 1 | Otto Lin | 手机, 耳机 | 20000 |
| 2 | Anna Song | 冰箱 | 30000 |
| 3 | Otto Lin | 电视 | 40000 |
这里明显有问题:
- 客户信息重复了。
- 商品是用列表存的——这不符合数据原子性原则。
规范化后
我们把表拆成三张: 表 客户
| 客户ID | 姓名 |
|---|---|
| 1 | Otto Lin |
| 2 | Anna Song |
表 商品
| 商品ID | 名称 | 价格 |
|---|---|---|
| 1 | 手机 | 10000 |
| 2 | 耳机 | 10000 |
| 3 | 冰箱 | 30000 |
| 4 | 电视 | 40000 |
表 订单
| 订单ID | 客户ID | 商品ID |
|---|---|---|
| 1 | 1 | 1 |
| 1 | 1 | 2 |
| 2 | 2 | 3 |
| 3 | 1 | 4 |
现在我们:
- 没有数据重复了。
- 每个商品都单独一行。
- 可以很方便地加新商品和新订单。
规范化就是把混乱变成秩序的艺术。虽然有时候它看起来有点死板、麻烦,但最终的目标绝对值得。接下来的课程我们会按顺序学各种范式:先1NF,再2NF,最后3NF。走起,向有序数据的世界进发!
GO TO FULL VERSION