Introdução à normalização
Ao longo da disciplina, discutimos diferentes modelagens aplicáveis a um mesmo problema. Algumas eram equivalentes entre si, enquanto outras se mostraram mais eficientes. Agora, daremos continuidade à nossa exploração em Banco de Dados, com foco nos conceitos de normalização.
Como vimos no início do curso, bancos de dados relacionais oferecem uma série de benefícios, mas também exigem o cumprimento de boas práticas para que seu uso seja eficaz. A normalização é uma dessas práticas: é um processo que visa aprimorar a modelagem dos dados, reduzindo a redundância e promovendo maior consistência.
O processo de normalização em um banco de dados pode ser conduzido em etapas, nas quais o esquema é avaliado em relação a diferentes propriedades. Cada uma dessas propriedades define uma forma normal. Nem sempre um banco de dados atenderá a todas elas, mas é comum que os bancos sejam modelados considerando até a terceira forma normal (3FN) ou a Forma Normal de Boyce-Codd (FNBC).
Antes de conhecermos as formas normais, precisamos reforçar alguns conceitos importantes:
- Superchave: segundo Elmasri e Navathe (2011), uma superchave é um atributo (ou conjunto de atributos) cujos valores identificam unicamente cada tupla de uma relação. Um detalhe importante é que uma superchave pode conter atributos redundantes. Por exemplo, em uma relação , o conjunto é uma superchave, embora o atributo nome seja redundante, já que por si só é suficiente para identificar exclusivamente cada pessoa. O conceito de chave candidata, por sua vez, elimina esses atributos não essenciais, exigindo minimalidade.
- Atributo principal (ou primo): um atributo principal é aquele que faz parte de alguma chave candidata da relação. Por exemplo, considerando a relação , o atributo é um atributo principal, pois pertence a uma chave candidata (no caso, a chave primária composta da relação). Uma observação importante é que um atributo é considerado principal mesmo que pertença a uma chave candidata que não foi escolhida como chave primária.
- Dependência funcional: em bancos de dados, uma dependência funcional ocorre quando, para quaisquer duas tuplas de uma relação, se elas possuem o mesmo valor para os atributos em X, então necessariamente possuem o mesmo valor para os atributos em Y. Em outras palavras, os valores de X determinam os valores de Y. Por exemplo, considerando a relação
UNIVERSIDADE_FEDERAL(<u>sigla</u>, nome), podemos dizer que existe a dependência funcionalsigla → nome, pois uma mesma sigla, como UFMT, está associada a um único nome, como “Universidade Federal de Mato Grosso”.
- Uma dependência funcional será considerada não trivial quando o(s) atributo(s) determinado(s) não fizer(em) parte do conjunto de atributos determinantes. Ou seja: .
- Dependência funcional transitiva: corre quando existem duas dependências funcionais
X->YeY->Z, de modo queZdepende indiretamente deY. Nesse caso, dizemos que há uma dependência transitivaX->Z, desde queYnão seja uma superchave. Por exemplo, considerando a relaçãoCAMPUS(universidade_federal_sigla, estado, regiao), temos:
universidade_federal_sigla → estadoestado → regiao
Assim, regiao depende transitivamente de universidade_federal_sigla.
Agora que já reforçamos os conceitos, vamos às definições.
Modelo Entidade-Relacionamento Estendido
Na disciplina de Programação Orientada a Objetos, vimos como alguns conceitos, como herança, trazem importantes contribuições à modelagem de dinâmicas do mundo real aos nossos programas. Agora, conheceremos o Modelo Entidade-Relacionamento Estendido (EER), que introduz alguns desses conceitos ao projeto conceitual de banco de dados.
1FN - Primeira Forma Normal