CodeGym /课程 /SQL SELF /数据规范化入门

数据规范化入门

SQL SELF
第 25 级 , 课程 0
可用

你有没有见过那种数据库表,看起来就像杂物堆?有的单元格里塞着一堆电话号码,有的写着一长串地址,还有的放着几个日期用逗号隔开。这种“乱七八糟”的表,查找、更新、管理数据都特别麻烦。但其实有办法让它变整齐,这个办法就叫——数据规范化。

简单说,数据规范化就是把表里的数据整理得更有条理,尽量减少重复,避免在更新、删除、插入数据时出问题。

数据规范化能解决这些问题:

  1. 消除数据重复。为啥要把同样的信息存两遍、三遍?这样只会让数据库变大,还容易出现数据不一致。
  2. 减少异常。你知道生活中也有“异常”吧?比如忘了把前同事从联系人里删掉。数据库里也会这样,规范化能帮你避免这些尴尬。
  3. 简化数据结构。结构越简单,管理起来越轻松。
  4. 让数据库更快。数据少了,查询自然就快了。

如果不规范化会怎样?

不规范化的数据就像“粘糊糊”的,总是拖着一堆没用的信息。

想象一下 学生 表:

学生ID 姓名 课程
1 Otto Lin 数学, 物理
2 Anna Song 化学
3 Otto Lin 生物, 化学

可能会遇到的问题:

  • 数据重复Otto Lin 出现了好几次。为啥?因为他选了好几门课。
  • 信息不好更新:如果 Otto Lin 的手机号变了,你得把所有有他名字的记录都找出来改一遍。
  • 删除数据会破坏完整性:假如 Otto 不想上课了,你把他的所有行都删了,结果他的信息全没了,连名字都找不到。

什么时候规范化会有点多余?

说实话,规范化就像严格的作息表:通常挺好,但有时候也想随性点。其实有些场景,反规范化更合适:

  1. 在分析型数据库里,查询速度比数据量更重要。
  2. 结构太复杂的时候:如果为了满足各种范式,表越来越多,查询就会越来越难写。
  3. 经常用到的聚合数据:比如你老是要算某个总和,那还不如直接存下来。

比如说你有个网店,用户经常查订单总金额,那就可以直接把总金额存在 订单 表里,不用每次都重新算。

不过要记住,反规范化是个权衡。它让数据更新时更容易出错。

问题结构和规范化的例子

来看下规范化前的表:

订单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。走起,向有序数据的世界进发!

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