范式

数据库设计

Lis Sulmont

Curriculum Manager

规范化

识别重复数据组,并为其创建新表

更正式的定义:

规范化的目标是:

  • 能刻画关系模式中的冗余程度
  • 提供转换模式以消除冗余的机制
1 Database Design, 2nd Edition by Adrienne Watt
数据库设计

范式(NF)

从低到高的规范化级别:

  • 第一范式(1NF)
  • 第二范式(2NF)
  • 第三范式(3NF)
  • 基本键范式(EKNF)
  • Boyce-Codd 范式(BCNF)

$$

  • 第四范式(4NF)
  • 基本元组范式(ETNF)
  • 第五范式(5NF)
  • 域-键范式(DKNF)
  • 第六范式(6NF)
1 https://en.wikipedia.org/wiki/Database_normalization
数据库设计

1NF 规则

  • 每条记录必须唯一——无重复行
  • 每个单元格只能有一个值

初始数据

| Student_id | Student_Email   | Courses_Completed                                        | 
|------------|-----------------|----------------------------------------------------------|
| 235        | [email protected]   | Introduction to Python, Intermediate Python              |
| 455        | [email protected] | Cleaning Data in R                                       | 
| 767        | [email protected] | Machine Learning Toolbox, Deep Learning in Python        |
数据库设计

1NF 形式

| Student_id | Student_Email   | 
|------------|-----------------|
| 235        | [email protected]   | 
| 455        | [email protected] | 
| 767        | [email protected] | 
| Student_id | Completed                |
|------------|--------------------------|
| 235        | Introduction to Python   | 
| 235        | Intermediate Python      | 
| 455        | Cleaning Data in R       | 
| 767        | Machine Learning Toolbox | 
| 767        | Deep Learning in Python  | 
数据库设计

2NF

  • 必须满足 1NF 且:
    • 若主键为单列
      • 则自动满足 2NF
    • 若为复合主键
      • 则每个非键列必须依赖于所有键

初始数据

| Student_id (PK) | Course_id (PK) | Instructor_id | Instructor    | Progress |
|-----------------|----------------|---------------|---------------|----------|
| 235             | 2001           | 560           | Nick Carchedi | .55      |
| 455             | 2345           | 658           | Ginger Grant  | .10      |
| 767             | 6584           | 999           | Chester Ismay | 1.00     |
数据库设计

2NF 形式

| Student_id (PK) | Course_id (PK) | Percent_Completed |
|-----------------|----------------|-------------------|
| 235             | 2001           | .55               |
| 455             | 2345           | .10               |
| 767             | 6584           | 1.00              |
| Course_id (PK) | Instructor_id | Instructor    |
|----------------|---------------|---------------|
| 2001           | 560           | Nick Carchedi |
| 2345           | 658           | Ginger Grant  |
| 6584           | 999           | Chester Ismay |
数据库设计

3NF

  • 满足 2NF
  • 无传递依赖:非键列不能依赖于其他非键列

初始数据

| Course_id (PK) | Instructor_id | Instructor    | Tech   |
|----------------|---------------|---------------|--------|
| 2001           | 560           | Nick Carchedi | Python |
| 2345           | 658           | Ginger Grant  | SQL    |
| 6584           | 999           | Chester Ismay | R      |
数据库设计

3NF 形式

| Course_id (PK) | Instructor    | Tech   |
|----------------|---------------|--------|
| 2001           | Nick Carchedi | Python |
| 2345           | Ginger Grant  | SQL    |
| 6584           | Chester Ismay | R      |
| Instructor_id | Instructor    | 
|---------------|---------------|
| 560           | Nick Carchedi | 
| 658           | Ginger Grant  | 
| 999           | Chester Ismay |
数据库设计

数据异常

未充分规范化会带来什么风险?

1. 更新异常

2. 插入异常

3. 删除异常

数据库设计

更新异常

更新时因数据冗余导致的不一致

| Student_ID | Student_Email   | Enrolled_in             | Taught_by           |
|------------|-----------------|-------------------------|---------------------|
| 230        | [email protected]  | Cleaning Data in R      | Maggie Matsui       |
| 367        | [email protected] | Data Visualization in R | Ronald Pearson      |
| 520        | [email protected]   | Introduction to Python  | Hugo Bowne-Anderson |
| 520        | [email protected]   | Arima Models in R       | David Stoffer       |

要更新学生 520 的邮箱:

  • 需更新多条记录,否则会不一致
  • 执行更新者需了解冗余情况
数据库设计

插入异常

因缺少属性而无法添加记录

| Student_ID | Student_Email   | Enrolled_in             | Taught_by           |
|------------|-----------------|-------------------------|---------------------|
| 230        | [email protected]  | Cleaning Data in R      | Maggie Matsui       |
| 367        | [email protected] | Data Visualization in R | Ronald Pearson      |
| 520        | [email protected]   | Introduction to Python  | Hugo Bowne-Anderson |
| 520        | [email protected]   | Arima Models in R       | David Stoffer       |

无法插入仅注册但尚未选课的学生

数据库设计

删除异常

删除记录会造成非预期的数据丢失

| Student_ID | Student_Email   | Enrolled_in             | Taught_by           |
|------------|-----------------|-------------------------|---------------------|
| 230        | [email protected]  | Cleaning Data in R      | Maggie Matsui       |
| 367        | [email protected] | Data Visualization in R | Ronald Pearson      |
| 520        | [email protected]   | Introduction to Python  | Hugo Bowne-Anderson |
| 520        | [email protected]   | Arima Models in R       | David Stoffer       |

若删除学生 230,关于 Cleaning Data in R 的数据会怎样?

数据库设计

数据异常

未充分规范化会带来什么风险?

1. 更新异常

2. 插入异常

3. 删除异常

规范化程度越高,越不易出现数据异常

别忘了上一期视频中规范化的缺点

数据库设计

Ayo berlatih!

数据库设计

Preparing Video For Download...