Skip to main content

Dependência transitiva em um banco de dados

Meritocracia: o que não costumam contar (#Pirula 233) (Julho 2024)

Meritocracia: o que não costumam contar (#Pirula 233) (Julho 2024)
Anonim

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_IDAutorLivroAutor_Nacionalidade
Auth_001Orson Scott CardJogo de EnderEstados Unidos
Auth_001Orson Scott CardJogo de EnderEstados Unidos
Auth_002Margaret AtwoodO conto da criadaCanadá

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_IDLivroAutor_ID
Book_001Jogo de EnderAuth_001
Book_001Filhos da MenteAuth_001
Book_002O conto da criadaAuth_002

AUTORES

Autor_IDAutorAutor_Nacionalidade
Auth_001Orson Scott CardEstados Unidos
Auth_002Margaret AtwoodCanadá

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_IDPaís
Coun_001Estados Unidos
Coun_002Canadá

AUTORES

Autor_IDAutorCountry_ID
Auth_001Orson Scott CardCoun_001
Auth_002Margaret AtwoodCoun_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_IDAutorLivroAutor_Nacionalidade
Auth_001Orson Scott CardJogo de EnderEstados Unidos
Auth_001Orson Scott CardFilhos da MenteEstados Unidos
Auth_002Margaret AtwoodO conto da criadaCanadá

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.