10 de fevereiro de 2010

O Tal Banco de Dados Relacional

Acreditem eu só entendi o que deveras era um BD relacional quando tentei montar um BD orientado a objetos.

Em algumas horas livres rascunhei na mente o projeto de BD orientado a objetos. Um dia sentei e fiz a modelagem de dados começando por Python, usando Storm. Até aí perfeito: a classe pai ia dando o rumo aos filhos que além de necessariamente herdar os atributos do pai criavam outros filhos ou se relacionavam com outros filhos numa hierarquia angelical.

Legal. Passei para o Postgres. Daí o primeiro problema: as tabelas-filho estranhamente herdavam fisicamente as colunas da tabela-pai. Beleza, esqueci que tem esse detalhe. Mas não muda muito as coisas. Em seguida as "tabelas-filhas-netas" (herdavam da tabela pai e filho) se relacionavam com a segunda geração e tudo mais.

Tudo sincronizado em python-storm. Vamos para os testes e... saltam resultados estranhíssimos.

..:|:.. A chave primária da classe pai fora francamente violada sem que o Postgres reclamasse. Hmm... Teria feito alguma coisa errada? Reviso as restrições. Tudo certo. Como os Postgres havia aceitado aquilo?

..:|:.. Dados inconsistentes, as restrições haviam sido sumariamente ignoradas.

..:|:.. O próprio BD obrigava os dados a serem inconsistentes. Se tentasse consertar manualmente os problemas das chaves primárias e estrangeiras, o BD impunha novos dados inconsistentes. Que loucura era aquela?

O que estaria errado então? Fui ao Google e finalmente encontrei a chave-primária da questão: o Postgres é relacional e tentar fazê-lo orientado a objetos é amplamente desencorajado.

O neǵocio é que o que eu considerava inconsistente não era assim tão inconsistente, apenas que havia uma meia lógica objeto-relacional que justificava aqueles dados.

Final das contas: Usando um BD relacional seja apenas relacional, que funciona muito bem. A propósito, a idéia de OO é ótima, mas não é tudo.

Um comentário:

Anonymous disse...

Amigo, teria alguma ilustração para representar estes dois casos?
Não consigo visualizar a diferença entre bd relacional e orientado a objetos...
Abraço.