mysql规范化范式例题
时间: 2023-11-01 17:59:25 浏览: 149
假设我们有一个简单的电子商务网站,其中涉及的数据表有“订单(Orders)”和“订单详情(OrderDetails)”。
下面是两个表的示例结构:
Orders表:
| OrderID | CustomerID | OrderDate |
| ------- | ---------- | ------------ |
| 1 | 123 | 2021-01-01 |
| 2 | 456 | 2021-01-02 |
| 3 | 789 | 2021-01-03 |
OrderDetails表:
| OrderDetailID | OrderID | ProductID | Quantity | Price |
| ------------- | ------- | --------- | -------- | ----- |
| 1 | 1 | 100 | 2 | 10.0 |
| 2 | 1 | 200 | 1 | 20.0 |
| 3 | 2 | 100 | 1 | 10.0 |
| 4 | 3 | 300 | 3 | 30.0 |
1. 第一范式(1NF)
第一范式要求每个数据表中的每个列都是原子的,即不可再分解的。在示例中,Orders表中的每个列都是原子的,而OrderDetails表中的“ProductID”列可以再分解为“ProductCode”和“ProductName”,因此不符合第一范式。
为了符合第一范式,我们可以将OrderDetails表拆分为两个表,即“订单详情(OrderDetails)”和“产品(Products)”:
OrderDetails表:
| OrderDetailID | OrderID | ProductCode | Quantity | Price |
| ------------- | ------- | ----------- | -------- | ----- |
| 1 | 1 | 100 | 2 | 10.0 |
| 2 | 1 | 200 | 1 | 20.0 |
| 3 | 2 | 100 | 1 | 10.0 |
| 4 | 3 | 300 | 3 | 30.0 |
Products表:
| ProductCode | ProductName |
| ----------- | ----------- |
| 100 | ProductA |
| 200 | ProductB |
| 300 | ProductC |
现在每个表中的每个列都是原子的,符合第一范式。
2. 第二范式(2NF)
第二范式要求每个数据表中的每个非主键列都完全依赖于主键。在示例中,Orders表中的每个列都直接依赖于主键“OrderID”,而OrderDetails表中的“ProductCode”列不依赖于主键“OrderDetailID”,而是依赖于组合主键“OrderID”和“ProductCode”。
为了符合第二范式,我们可以将OrderDetails表拆分为两个表,即“订单详情(OrderDetails)”和“订单商品(OrderItems)”:
OrderDetails表:
| OrderDetailID | OrderID |
| ------------- | ------- |
| 1 | 1 |
| 2 | 1 |
| 3 | 2 |
| 4 | 3 |
OrderItems表:
| OrderDetailID | ProductCode | Quantity | Price |
| ------------- | ----------- | -------- | ----- |
| 1 | 100 | 2 | 10.0 |
| 2 | 200 | 1 | 20.0 |
| 3 | 100 | 1 | 10.0 |
| 4 | 300 | 3 | 30.0 |
现在每个表中的每个非主键列都完全依赖于主键,符合第二范式。
3. 第三范式(3NF)
第三范式要求每个数据表中的每个非主键列都不依赖于其他非主键列。在示例中,OrderItems表中的“Price”列依赖于“Quantity”列,因此不符合第三范式。
为了符合第三范式,我们可以将OrderItems表拆分为两个表,即“订单商品(OrderItems)”和“商品价格(ProductPrices)”:
OrderItems表:
| OrderDetailID | ProductCode | Quantity |
| ------------- | ----------- | -------- |
| 1 | 100 | 2 |
| 2 | 200 | 1 |
| 3 | 100 | 1 |
| 4 | 300 | 3 |
ProductPrices表:
| ProductCode | Price |
| ----------- | ----- |
| 100 | 10.0 |
| 200 | 20.0 |
| 300 | 30.0 |
现在每个表中的每个非主键列都不依赖于其他非主键列,符合第三范式。
阅读全文