Uma dependência transitiva em um banco de dados é um relacionamento indireto entre valores na mesma tabela que causa uma dependência funcional. Para atingir o padrão de normalização da terceira forma normal (3NF), você deve eliminar qualquer dependência transitiva.
Por sua natureza, uma dependência transitiva requer três ou mais atributos (ou colunas do banco de dados) que possuem uma dependência funcional entre eles, o que significa que a coluna A em uma tabela depende da coluna B por meio de uma coluna intermediária C.
Vamos ver como isso pode funcionar.
Exemplo de dependência transitiva
AUTORES
Autor_ID | Autor | Livro | Autor_Nacionalidade |
---|---|---|---|
Auth_001 | Orson Scott Card | Jogo de Ender | Estados Unidos |
Auth_001 | Orson Scott Card | Jogo de Ender | Estados Unidos |
Auth_002 | Margaret Atwood | O conto da criada | Canadá |
No exemplo dos AUTHORS acima:
- Livro → Autor : Aqui o Livro atributo determina o Autor atributo. Se você souber o nome do livro, poderá aprender o nome do autor. Contudo, Autor não determina Livro , porque um autor pode escrever vários livros. Por exemplo, só porque sabemos o nome do autor Orson Scott Card, ainda não sabemos o nome do livro.
- Autor → Autor_Nacionalidade : Da mesma forma, Autor atributo determina o Autor_Nacionalidade mas não o contrário; só porque sabemos que a nacionalidade não significa que podemos determinar o autor.
Mas esta tabela introduz uma dependência transitiva:
- Livro → Autor_Nacionalidade: Se soubermos o nome do livro, podemos determinar a nacionalidade por meio da coluna Autor.
Evitando dependências transitivas
Para garantir a terceira forma normal, vamos remover a dependência transitiva.
Podemos começar removendo a coluna Livro da tabela Autores e criando uma tabela Livros separada:
LIVROS
Book_ID | Livro | Autor_ID |
---|---|---|
Book_001 | Jogo de Ender | Auth_001 |
Book_001 | Filhos da Mente | Auth_001 |
Book_002 | O conto da criada | Auth_002 |
AUTORES
Autor_ID | Autor | Autor_Nacionalidade |
---|---|---|
Auth_001 | Orson Scott Card | Estados Unidos |
Auth_002 | Margaret Atwood | Canadá |
Isso resolveu isso? Vamos examinar nossas dependências agora:
Tabela de LIVROS:
- Book_ID → Livro: o Livro depende do Book_ID .
- Nenhuma outra dependência nesta tabela existe, então estamos bem. Note que a chave estrangeira Autor_ID liga esta tabela à tabela AUTHORS através da sua chave primária Autor_ID . Nós criamos um relacionamento para evitar uma dependência transitiva, um projeto chave de bancos de dados relacionais.
Tabela AUTORES:
- Autor_ID → Autor: o Autor depende do Autor_ID .
- Autor → Autor_Nacionalidade: A nacionalidade pode ser determinada pelo autor.
- Autor_ID → Autor_Nacionalidade: A nacionalidade pode ser determinada a partir do Autor_ID através de Autor atributo. Nós ainda temos uma dependência transitiva.
Precisamos adicionar uma terceira tabela para normalizar esses dados:
PAÍSES
Country_ID | País |
---|---|
Coun_001 | Estados Unidos |
Coun_002 | Canadá |
AUTORES
Autor_ID | Autor | Country_ID |
---|---|---|
Auth_001 | Orson Scott Card | Coun_001 |
Auth_002 | Margaret Atwood | Coun_002 |
Agora temos três tabelas, fazendo uso de chaves estrangeiras para linkar entre as tabelas:
- A chave estrangeira da tabela BOOK Autor_ID liga um livro a um autor na tabela AUTHORS.
- A chave estrangeira da tabela AUTHORS Country_ID liga um autor a um país na tabela COUNTRIES.
- A tabela COUNTRIES não possui chave estrangeira porque não precisa vincular a outra tabela nesse design.
Por que dependências transitivas são design de banco de dados ruim
Qual é o valor de evitar dependências transitivas para ajudar a garantir 3NF? Vamos considerar nossa primeira tabela novamente e ver os problemas que ela cria:
AUTORES
Autor_ID | Autor | Livro | Autor_Nacionalidade |
---|---|---|---|
Auth_001 | Orson Scott Card | Jogo de Ender | Estados Unidos |
Auth_001 | Orson Scott Card | Filhos da Mente | Estados Unidos |
Auth_002 | Margaret Atwood | O conto da criada | Canadá |
Esse tipo de design pode contribuir para anomalias e inconsistências de dados, por exemplo:
- Se você apagou os dois livros "Children of the Mind" e "Ender's Game", você excluiria o autor "Orson Scott Card" e sua nacionalidade completamente do banco de dados.
- Você não pode adicionar um novo autor ao banco de dados, a menos que você também adicione um livro; E se o autor ainda não foi publicado ou você não sabe o nome de um livro que ela escreveu?
- Se "Orson Scott Card" mudou sua cidadania, você teria que mudar em todos os registros em que ele aparece. Ter vários registros com o mesmo autor pode resultar em dados imprecisos: e se a pessoa da entrada de dados não perceber que há vários registros para ele e alterar os dados em apenas um registro?
- Você não pode excluir um livro como "The Handmaid's Tale" sem excluir o autor completamente.
Estas são apenas algumas das razões pelas quais a normalização, e evitando dependências transitivas, protege os dados e garante a consistência.