Formas normais

Projeto de banco de dados

Lis Sulmont

Curriculum Manager

Normalização

Identifique grupos de dados que se repetem e crie novas tabelas para eles.

Uma definição mais formal:

Os objetivos da normalização são:

  • Ser capaz de caracterizar o nível de redundância em um esquema relacional
  • Fornecer mecanismos para transformar esquemas a fim de remover redundâncias
1 Design de Banco de Dados, 2ª Edição, por Adrienne Watt
Projeto de banco de dados

Formas normais (NF)

Ordenado do menos para o mais normalizado:

  • Primeira forma normal (1NF)
  • Segunda forma normal (2NF)
  • Terceira forma normal (3NF)
  • Forma normal elementar (EKNF)
  • Forma normal de Boyce-Codd (BCNF)

$$

  • Quarta forma normal (4NF)
  • Forma normal essencial de tupla (ETNF)
  • Quinta forma normal (5NF)
  • Forma Normal Chave de Domínio (DKNF)
  • Sexta forma normal (6NF)
1 https://en.wikipedia.org/wiki/Database_normalization
Projeto de banco de dados

Regras 1NF

  • Cada registro precisa ser único - sem linhas duplicadas.
  • Cada célula deve conter um valor

Dados iniciais

| 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        |
Projeto de banco de dados

Na 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  | 
Projeto de banco de dados

2NF

  • Tem que seguir a 1NF AND
    • Se a chave primária for uma coluna
      • então automaticamente satisfaz a 2NF
    • Se houver uma chave primária composta
      • então cada coluna que não é chave precisa depender de todas as chaves

Dados iniciais

| 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     |
Projeto de banco de dados

Na 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 |
Projeto de banco de dados

3NF

  • Atende à 2NF
  • Sem dependências transitivas: colunas que não são chaves não podem depender de outras colunas que também não são chaves.

Dados iniciais

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

Em 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 |
Projeto de banco de dados

Anomalias nos dados

O que a gente arrisca se não normalizar o suficiente?

1. Atualizar anomalia

2. Anomalia de inserção

3. Anomalia de exclusão

Projeto de banco de dados

Atualizar anomalia

Inconsistência de dados causada por redundância de dados durante a atualização

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

Para atualizar o e-mail do aluno 520:

  • Precisa atualizar mais de um registro, senão vai ter inconsistência.
  • A atualização do usuário precisa saber sobre redundância
Projeto de banco de dados

Anomalia de inserção

Não deu pra adicionar um registro porque faltam alguns atributos.

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

Não dá pra inserir um aluno que se inscreveu, mas não se matriculou em nenhum curso.

Projeto de banco de dados

Anomalia de exclusão

A exclusão de registros pode causar perda acidental de dados.

| 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 a gente apagar o aluno 230, o que vai acontecer com os dados em Cleaning Data in R?

Projeto de banco de dados

Anomalias nos dados

O que a gente arrisca se não normalizar o suficiente?

1. Atualizar anomalia

2. Anomalia de inserção

3. Anomalia de exclusão

Quanto mais normalizado for o banco de dados, menos chances de ter anomalias nos dados.

Não esqueça as desvantagens da normalização do último vídeo.

Projeto de banco de dados

Vamos praticar!

Projeto de banco de dados

Preparing Video For Download...