在数据库设计中,数据范式是确保数据一致性和减少数据冗余的一系列规则。数据范式从第一范式(1NF)到第三范式(3NF)依次递进,每一范式都有其特定的规则和目标。以下是详细地从原始数据到第三范式的转换步骤。
第一范式(1NF)
定义
第一范式要求数据表中的所有字段都是不可分割的最小数据单位,即每个字段都是原子性的。
步骤
- 识别重复组:检查数据表中是否存在重复的数据组。
- 分割数据表:将包含重复数据组的字段分离出来,创建一个新的数据表。
- 设置主键:为每个数据表设置一个主键,确保唯一性。
例子
假设有一个原始数据表如下:
| ID | Name | Address | City | ZipCode | Phone |
|---|---|---|---|---|---|
| 1 | John | 123 Main St | Anytown | 12345 | 555-1234 |
| 2 | Jane | 123 Main St | Anytown | 12345 | 555-5678 |
| 3 | John | 456 Elm St | Anycity | 67890 | 555-9012 |
转换步骤:
- 识别重复的地址和城市信息。
- 分割数据表,创建一个新的地址表。
新的数据表结构如下:
| ID | Name | AddressID |
|---|---|---|
| 1 | John | 1 |
| 2 | Jane | 1 |
| 3 | John | 2 |
地址表:
| AddressID | Address | City | ZipCode |
|---|---|---|---|
| 1 | 123 Main St | Anytown | 12345 |
| 2 | 456 Elm St | Anycity | 67890 |
第二范式(2NF)
定义
第二范式要求数据表满足第一范式,并且非主键字段完全依赖于主键。
步骤
- 识别部分依赖:检查非主键字段是否完全依赖于主键。
- 分割数据表:将部分依赖的字段分离出来,创建新的数据表。
例子
基于第一范式转换后的数据,我们发现AddressID字段依赖于ID字段。
转换步骤:
- 创建一个新的地址表,如上所示。
第三范式(3NF)
定义
第三范式要求数据表满足第二范式,并且非主键字段不传递依赖于主键。
步骤
- 识别传递依赖:检查非主键字段是否传递依赖于主键。
- 分割数据表:将传递依赖的字段分离出来,创建新的数据表。
例子
基于第二范式转换后的数据,我们发现ZipCode字段依赖于City字段,而City字段又依赖于AddressID字段。
转换步骤:
- 创建一个新的城市表,包含城市和邮编信息。
新的城市表结构如下:
| CityID | City | ZipCode |
|---|---|---|
| 1 | Anytown | 12345 |
| 2 | Anycity | 67890 |
通过以上步骤,我们成功地将原始数据转换到了第三范式,从而确保了数据的一致性和减少冗余。
