范式是最小冗余的表结构,三范式的概念如下所述。
1.第一范式
如果每列都是不可再分的最小数据单元(也叫作最小的原子单元),则满足第一范式,第一范式的目标是确保每列的原子性。如图,其中的Address列违背了第一范式列不可再分的原则,要满足第一范式,就需要将Address列拆分为Country列和City列。
| BuyerID | Address |
|---|---|
| 1 | 中国北京市 |
| 2 | 美国纽约市 |
| 3 | 日本东京市 |
| BuyerID | Country | City |
|---|---|---|
| 1 | 中国 | 北京 |
| 2 | 中国 | 纽约 |
| 3 | 中国 | 东京 |
2.第二范式
第二范式在第一范式的基础上,规定表中的非主键列不存在对主键部分的部分依赖,即第二范式要求每个表只描述一件事情。如图,Orders表既包含订单信息,也包含产品信息,需要将其拆分为两个单独的表。
订单表:orders
| 字段 | 例子 |
|---|---|
| 订单编号 | 001 |
| 产品编号 | A001 |
| 订购日期 | 2022-01-03 |
| 产品价格 | 100 |
拆分为:订单表:orders
| 字段 | 例子 |
|---|---|
| 订单编号 | 001 |
| 订购日期 | 2022-01-03 |
| ... | ... |
| 字段 | 例子 |
|---|---|
| 产品编号 | A001 |
| 产品价格 | 100 |
| ... | ... |
3.第三范式
第三范式的定义为:满足第一范式和第二范式,并且表中的列不存在对非主键列的传递依赖。如果所示,除了主键的订单编号,顾客姓名依赖于非主键的顾客编号,因此需要将列去除。
| 字段 | 例子 |
|---|---|
| 订单编号 | 001 |
| 订购日期 | 2022-01-03 |
| 顾客编号 | C001 |
| 顾客姓名 | Alex |
| ... | ... |
顾客编号去除后:
| 字段 | 例子 |
|---|---|
| 订单编号 | 001 |
| 订购日期 | 2022-01-03 |
| 顾客姓名 | Alex |
| ... | ... |