Нормальні форми

Проєктування баз даних

Lis Sulmont

Curriculum Manager

Нормалізація

Визначайте повторювані групи даних і створюйте для них окремі таблиці

Більш формальне визначення:

Цілі нормалізації:

  • Уміти оцінювати рівень надмірності в реляційній схемі
  • Надавати механізми перетворення схем, щоб прибрати надмірність
1 Database Design, 2nd Edition by Adrienne Watt
Проєктування баз даних

Нормальні форми (NF)

Упорядковано від найменш до найбільш нормалізованої:

  • Перша нормальна форма (1NF)
  • Друга нормальна форма (2NF)
  • Третя нормальна форма (3NF)
  • Нормальна форма елементарного ключа (EKNF)
  • Нормальна форма Бойса — Кодда (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       |

Щоб оновити email студента 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. Аномалія видалення

Чим краще нормалізована база, тим менше вона схильна до аномалій даних

Не забудьте про недоліки нормалізації з попереднього відео

Проєктування баз даних

Давайте потренуємось!

Проєктування баз даних

Preparing Video For Download...