Quais são os formulários normais do banco de dados e você pode dar exemplos? [fechadas]

277

No design de banco de dados relacional, existe um conceito de normalização de banco de dados ou simplesmente normalização, que é um processo de organização de colunas (atributos) e tabelas (relações) para reduzir a redundância de dados e melhorar a integridade dos dados. (conforme escrito na Wikipedia ).

Como a maioria dos artigos é um pouco técnica e, portanto, mais difícil de entender, peço a alguém que escreva uma explicação mais fácil de entender com base em exemplos sobre o que significam 1NF, 2NF, 3NF e até 3,5NF (Boyce-Codd).

barfoon
fonte

Respostas:

435

1NF é o mais básico dos formulários normais - cada célula de uma tabela deve conter apenas uma informação e não pode haver linhas duplicadas.

2NF e 3NF são todos dependentes da chave primária. Lembre-se de que uma chave primária pode ser composta de várias colunas. Como Chris disse em sua resposta:

Os dados dependem da tecla [1NF], da tecla inteira [2NF] e nada além da tecla [3NF] (então, me ajude a Codd ).

2NF

Digamos que você tenha uma tabela contendo os cursos realizados em um determinado semestre e tenha os seguintes dados:

|-----Primary Key----|               uh oh |
                                           V
CourseID | SemesterID | #Places  | Course Name  |
------------------------------------------------|
IT101    |   2009-1   | 100      | Programming  |
IT101    |   2009-2   | 100      | Programming  |
IT102    |   2009-1   | 200      | Databases    |
IT102    |   2010-1   | 150      | Databases    |
IT103    |   2009-2   | 120      | Web Design   |

Isso não está no 2NF , porque a quarta coluna não depende de toda a chave - mas apenas de uma parte dela. O nome do curso depende do ID do curso, mas não tem nada a ver com o semestre em que ele foi realizado. Assim, como você pode ver, temos informações duplicadas - várias linhas nos informando que o IT101 está programando e o IT102 é Databases. Então, corrigimos isso movendo o nome do curso para outra tabela, em que CourseID é a chave INTIRE.

Primary Key |

CourseID    |  Course Name |
---------------------------|
IT101       | Programming  |
IT102       | Databases    |
IT103       | Web Design   |

Sem redundância!

3NF

Ok, digamos que também adicionamos o nome do professor do curso e alguns detalhes sobre eles no RDBMS:

|-----Primary Key----|                           uh oh |
                                                       V
Course  |  Semester  |  #Places   |  TeacherID  | TeacherName  |
---------------------------------------------------------------|
IT101   |   2009-1   |  100       |  332        |  Mr Jones    |
IT101   |   2009-2   |  100       |  332        |  Mr Jones    |
IT102   |   2009-1   |  200       |  495        |  Mr Bentley  |
IT102   |   2010-1   |  150       |  332        |  Mr Jones    |
IT103   |   2009-2   |  120       |  242        |  Mrs Smith   |

Agora, espero que seja óbvio que o TeacherName depende do TeacherID - portanto, isso não está no 3NF . Para consertar isso, fazemos o mesmo que fizemos no 2NF - retire o campo TeacherName dessa tabela e coloque-o por conta própria, que possui o TeacherID como a chave.

 Primary Key |

 TeacherID   | TeacherName  |
 ---------------------------|
 332         |  Mr Jones    |
 495         |  Mr Bentley  |
 242         |  Mrs Smith   |

Sem redundância !!

Uma coisa importante a lembrar é que, se algo não está em 1NF, também não está em 2NF ou 3NF. Assim, cada forma normal adicional requer tudo o que as formas normais mais baixos tinha, além de algumas condições adicionais, que devem todos ser cumpridas.

Smashery
fonte
9
Apenas pense sobre isso em termos da relação entre as coisas. Se eu perguntar "qual é o nome do curso com o ID IT101?", Você pode me responder, certo? Da mesma forma, se eu perguntar "qual professor tem o ID 332?" você pode me dizer qual é o professor. Assim, o nome do curso depende do seu ID.
Smashery 07/04/09
9
No entanto, você não pode seguir o outro caminho - se eu lhe perguntasse "Qual é a identificação do Sr. Jones?" talvez você não consiga dar uma resposta única, pois pode haver dois Sr. Joneses. Portanto, o ID não depende do nome - é o nome que depende do ID.
Smashery
2
Você também pode pensar dessa maneira - veja a terceira tabela (a primeira com o TeacherName). O que me impede de ter "Sr. Jones" na primeira linha, mas depois colocar "Sr. Bloggs" na segunda linha? I não devem ser autorizados a fazer isso, porque eles têm ambos obteve o ID de 332.
Smashery
30
@instantsetsuna - Explicação completa: Em alguns tribunais, uma testemunha é perguntada se eles dirão "A verdade, toda a verdade, e nada além da verdade, então me ajude a Deus"; como Deus é considerado aquele com autoridade quando se trata de saber se você está dizendo a verdade. No caso de bancos de dados, podemos dizer "Os dados dependem da chave, a chave inteira e nada além da chave, então me ajude no Codd". Foi Ted Codd quem teve a idéia de bancos de dados relacionais - coisas que dependem de chaves, etc., portanto ele seria a autoridade a seguir no caso de bancos de dados relacionais.
Smashery 12/08/10
5
@ Smashery Qual é a diferença entre 2NF e 3NF?
precisa
119

Eu nunca tive uma boa memória de palavras exatas, mas na minha classe de banco de dados, acho que o professor sempre dizia algo como:

Os dados dependem da tecla [1NF], da tecla inteira [2NF] e apenas da tecla [3NF].

Chris Shaffer
fonte
72
... então me ajude, Codd. en.wikipedia.org/wiki/Ted_Codd
Smashery 07/04
6
Então, qual é a diferença entre The data depends on the key [1NF], nothing but the key [3NF]? Por favor, não nos confunda, pois uma resposta sentenciosa não esclarece a resposta, mas confunde os visitantes!
Pratik
2
"cada célula em uma tabela deve conter apenas uma informação e não pode haver linhas duplicadas." - Não vejo como "Os dados dependem da chave" correspondem a tudo isso.
21817 Simon Forsberg
46

Aqui está uma resposta rápida, reconhecidamente massacrada , mas em uma frase:

1NF: Sua tabela está organizada como um conjunto não ordenado de dados e não há colunas repetidas.

2NF: você não repete dados em uma coluna da sua tabela por causa de outra coluna.

3NF: Cada coluna da sua tabela se refere apenas à chave da sua tabela - você não teria uma coluna em uma tabela que descreva outra coluna na sua tabela que não seja a chave.

Para mais detalhes, consulte a Wikipedia ...

Dave Markle
fonte
1
Tanto quanto posso dizer, a evitação de grupos repetidos pela 1NF não se refere a colunas repetidas, mas a colunas únicas que representam um número arbitrário de valores repetidos para o mesmo atributo, ou seja, não são atômicos. Baseamos isso em, por exemplo, (1) stackoverflow.com/questions/23194292/… / (2) stackoverflow.com/questions/26357276/…
underscore_d
34

1NF: Apenas um valor por coluna

2NF: Todas as colunas de chave não primária na tabela devem depender de toda a chave primária.

3NF: Todas as colunas de chave não primária na tabela devem depender DIRETAMENTE de toda a chave primária.

Eu escrevi um artigo com mais detalhes aqui

Arcturus
fonte
Porque você não forneceu atribuição. Editei a resposta para fornecer atribuição.
Robert Harvey
Sempre que possível, inclua o exemplo na própria resposta. Um usuário casual deve poder ler sua resposta e obter algum valor sem precisar clicar no link do blog. A resposta deve ser independente, em outras palavras.
Robert Harvey
Eu vou manter aquilo em mente. Obrigado :) #
22412 Arcturus
3
Observe também que esta pergunta tem dois anos e já possui uma resposta altamente votada que foi marcada como aceita pelo OP. As respostas tardias são examinadas com mais cuidado pela comunidade para avaliar se acrescentam ou não um valor adicional genuíno ao OP.
Robert Harvey
3
O @Arcturus leu o artigo, ainda uma das melhores explicações para a normalização por aí.
Olian04