Forme normali

Progettazione di database

Lis Sulmont

Curriculum Manager

Normalizzazione

Identifica i gruppi di dati che si ripetono e crea nuove tabelle per loro.

Una definizione più formale:

Gli obiettivi della normalizzazione sono:

  • Saper dire quanto è ridondante uno schema relazionale
  • Fornire meccanismi per trasformare gli schemi al fine di eliminare le ridondanze.
1 Progettazione di database, seconda edizione di Adrienne Watt
Progettazione di database

Forme normali (NF)

Ordinati dal meno al più normalizzato:

  • Prima forma normale (1NF)
  • Seconda forma normale (2NF)
  • Terza forma normale (3NF)
  • Forma normale elementare (EKNF)
  • Forma normale di Boyce-Codd (BCNF)

$$

  • Quarta forma normale (4NF)
  • Forma normale essenziale delle tuple (ETNF)
  • Quinta forma normale (5NF)
  • Forma normale del dominio chiave (DKNF)
  • Sesta forma normale (6NF)
1 https://en.wikipedia.org/wiki/Database_normalization
Progettazione di database

Regole 1NF

  • Ogni record deve essere unico, non ci possono essere righe duplicate.
  • Ogni cella deve contenere un solo valore.

Dati iniziali

| 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        |
Progettazione di database

Nella forma 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  | 
Progettazione di database

2NF

  • Deve soddisfare 1NF AND
    • Se la chiave primaria è una colonna
      • quindi soddisfa automaticamente la 2NF
    • Se c'è una chiave primaria composta
      • quindi ogni colonna non chiave deve dipendere da tutte le chiavi

Dati iniziali

| 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     |
Progettazione di database

Nella forma 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 |
Progettazione di database

3NF

  • Soddisfa 2NF
  • Nessuna dipendenza transitiva: le colonne non chiave non possono dipendere da altre colonne non chiave.

Dati iniziali

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

In 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 |
Progettazione di database

Anomalie nei dati

Cosa rischiamo se non normalizziamo abbastanza?

1. Aggiornamento anomalia

2. Anomalia di inserimento

3. Anomalia di cancellazione

Progettazione di database

Aggiornamento anomalia

Incoerenza dei dati causata dalla ridondanza dei dati durante l'aggiornamento

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

Per aggiornare l'indirizzo e-mail dello studente 520:

  • Devi aggiornare più di un record, altrimenti ci saranno delle incongruenze.
  • Chi aggiorna i dati deve sapere che c'è ridondanza
Progettazione di database

Anomalia di inserimento

Non riesco ad aggiungere un record perché mancano degli attributi.

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

Non riesco a inserire uno studente che si è registrato ma non è iscritto a nessun corso.

Progettazione di database

Anomalia di cancellazione

Se cancelli i record, potresti perdere i dati senza volerlo.

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

Se cancelliamo lo studente 230, cosa succede ai dati su Cleaning Data in R?

Progettazione di database

Anomalie nei dati

Cosa rischiamo se non normalizziamo abbastanza?

1. Aggiornamento anomalia

2. Anomalia di inserimento

3. Anomalia di cancellazione

Più il database è normalizzato, meno sarà soggetto ad anomalie dei dati.

Non dimenticare gli svantaggi della normalizzazione che abbiamo visto nell'ultimo video.

Progettazione di database

Passiamo alla pratica!

Progettazione di database

Preparing Video For Download...