Normalformer

Databasdesign

Lis Sulmont

Curriculum Manager

Normalisering

Identifiera återkommande datagrupper och skapa nya tabeller för dem

En mer formell definition:

Målen med normalisering är att:

  • Kunna beskriva redundansnivån i ett relationellt schema
  • Tillhandahålla mekanismer för att omvandla scheman för att ta bort redundans
1 Database Design, 2nd Edition av Adrienne Watt
Databasdesign

Normalformer (NF)

Ordnade från minst till mest normaliserade:

  • Första normalformen (1NF)
  • Andra normalformen (2NF)
  • Tredje normalformen (3NF)
  • Elementary key normal form (EKNF)
  • Boyce-Codd normal form (BCNF)

$$

  • Fourth normal form (4NF)
  • Essential tuple normal form (ETNF)
  • Fifth normal form (5NF)
  • Domain-key Normal Form (DKNF)
  • Sixth normal form (6NF)
1 https://en.wikipedia.org/wiki/Database_normalization
Databasdesign

1NF-regler

  • Varje post måste vara unik – inga dubbletter
  • Varje cell får bara innehålla ett värde

Ursprungliga data

| 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        |
Databasdesign

På 1NF-form

| 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  | 
Databasdesign

2NF

  • Måste uppfylla 1NF OCH
    • Om primärnyckeln består av en kolumn
      • uppfylls 2NF automatiskt
    • Om det finns en sammansatt primärnyckel
      • måste varje icke-nyckelkolumn vara beroende av alla nycklar

Ursprungliga data

| 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     |
Databasdesign

På 2NF-form

| 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 |
Databasdesign

3NF

  • Uppfyller 2NF
  • Inga transitiva beroenden: icke-nyckelkolumner får inte vara beroende av andra icke-nyckelkolumner

Ursprungliga data

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

På 3NF-form

| 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 |
Databasdesign

Dataanomalier

Vad riskerar vi om vi inte normaliserar tillräckligt?

1. Uppdateringsanomali

2. Insättningsanomali

3. Raderingsanomali

Databasdesign

Uppdateringsanomali

Datainkonsistens orsakad av redundans vid uppdatering

| 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       |

För att uppdatera student 520s e-postadress:

  • Mer än en post måste uppdateras, annars uppstår inkonsistens
  • Den som uppdaterar måste känna till redundansen
Databasdesign

Insättningsanomali

Det går inte att lägga till en post på grund av saknade attribut

| 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       |

Det går inte att lägga till en student som registrerat sig men inte anmält sig till någon kurs

Databasdesign

Raderingsanomali

Radering av post(er) orsakar oavsiktlig dataförlust

| 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       |

Om vi raderar student 230, vad händer med datan om Cleaning Data in R?

Databasdesign

Dataanomalier

Vad riskerar vi om vi inte normaliserar tillräckligt?

1. Uppdateringsanomali

2. Insättningsanomali

3. Raderingsanomali

Ju mer normaliserad databasen är, desto mindre känslig är den för dataanomalier

Glöm inte nackdelarna med normalisering från förra videon

Databasdesign

Nu kör vi en övning!

Databasdesign

Preparing Video For Download...