2009/6/16 Nilo Lima <nilo.a...@gmail.com>:
> Ola,
>
> Estou com um problema para convencer uma equipe de desenvolvimento que estou
> entrando agora, a nao usar chaves compostas.
> Dei um boa pesquisada no grupo e no google procurando uma boa bibliografia
> para convence-los.
> Nao encontrei nada ainda. Pesquisando aqui no grupo vi que o Mauricio
> Linhares falou sobre o livro Domain-Driven Design de Eric Evans. Eu tenho o
> PDF dele aqui e busquei por primary key e composed key e nao encontrei nada.
> Algu'em conhece uma boa bibliografia para eu apresentar para a equipe.
Qualquer livro decente sobre design de bancos de dados vai falar sobre
as Surrogate Keys ( http://en.wikipedia.org/wiki/Surrogate_key ), que
são as chaves primárias sintéticas não derivadas de campos/colunas da
tabela. No artigo da Wikipedia você vai encontrar alguns dos problemas
que elas resolvem e no fim referências pra livros onde você pode se
aprofundar no assunto se for necessário.
A criação de chaves compostas através de campos derivados dos dados da
aplicação são uma prática desaconselhável a mais de três décadas.
> Eles tamb'em querem colocar logica de negocio no banco usando
> procedures,function, trigres. Tamb'em queria mostra-los que isso nao 'e bom,
> ja argumentei varios fatores mas acho que eles precisam ouvir ou ler um
> terceiro confiavel.
A lógica sobre não colocar a lógica da sua aplicação, escrita em uma
línguagem de programação orientada a objetos é bem simples, linguagens
de programação de uso genérico orientadas a objeto são muito mais
flexíveis, fáceis de manter e alterar do que linguagens como PL/SQL,
que é uma linguagem desenvolvida com um único uso em mente. Pior,
usando uma linguagem como Java você tem todo um suporte de IDEs e
ferramentas complementares, como controle de versão, que são uma coisa
completamente inexistente pra línguagens de propósito único como
PL/SQL.
Linguagens orientadas a objeto são mais expressívas e mais fáceis de
se lidar do que linguagens estruturadas de uso específico, que são
péssimas pra qualquer coisa que não seja o seu objetivo, que é tratar
de tabelas.
-
Maurício Linhares
http://codeshooter.wordpress.com/ | http://twitter.com/mauriciojr
2009/6/17 Rosivaldo Ramalho <rosi...@gmail.com>:
Dependendo da tua regra de negócio você terá que criar chaves
compostas, cabe a você a aos outros desenvolvedores ver se isso é o
que vocês necessitam.
-
Maurício Linhares
http://codeshooter.wordpress.com/ | http://twitter.com/mauriciojr
2009/6/17 Clovis Leoncio Junior <clovis...@gmail.com>:
A parte mais importante do sistema depende de cada sistema,
simplificar assim é muito perigoso :)
Quanto a integridade dos bancos de dados, ela não tem nada haver com
chaves compostas, mas com índices únicos colocados nas colunas
corretas.
> Vou dar um exemplo:
>
> Software para construção civil.
>
> 1 condomínio contém blocos que contém apartamentos. Temos aptos 101 em todos
> os blocos. Como identificar 1 apartamento? Chave composta, com No.
> do apto e chave do bloco. E não existe nenhuma necessidade de chaves
> artificiais. Já os blocos precisam também ser compostas, pois podemos ter
> diversos condomínios com blocos "A". A tabela blocos é composta por uma
> chave identificando o bloco (que pode ser o próprio A) e a chave do
> condomínio.
>
> E digo mais uma: Evite usar chaves artificiais, procure usar chaves
> naturais. Com meus 16 anos de analista, o maior uso do banco de dados são
> realizados para relatórios e pesquisas atrás de informações, com raras
> exceções. Se utilizar chaves artificiais, terá de indexar os atributos de
> maior pesquisa, gerando maior processamento do banco de dados, maior
> lentidão de resposta.
>
Qualquer manual de banco de dados vai explicar que chaves inteiras,
crescentes e contíguas são as que vão lhe fornecer a melhor
performance em consultas e indexação. É exatamente por esse motivo que
os diversos manuais de melhoria de performance em bancos de dados vão
lhe dizer que a melhor chave primaria pra sua tabela é uma coluna com
um número inteiro e auto incrementado, a chave artificial mais comum
que existe.
Chaves não numéricas e/ou crescentes vão ser sempre mais lentas e
sempre mais trabalhosas de se lidar, pois elas não são contíguas e não
é fácil para o banco "chutar" a provável posição dela em um índice sem
ter que fazer um passeio grande por ele.
E ainda tem a melhor parte, depois de perder performance, na hora que
você precisar trocar o nome do bloco do apartamento, já viu né?
Dançou.
> Além disso, procure realizar pesquisas com código SQL, e mande o banco
> processar. O banco é otimizado para isso. Onde colocar o código SQL? Pode
> ser em uma procedure no banco de dados, pode ser em Queries no código java.
>
> E por último: Quando existe a necessidade de a mesma pesquisa se repetir
> diversas vezes ao longo do tempo, crie views. Views para o hibernate é como
> se fosse uma tabela de dados normal.
>
> Já trabalhei com jdbc, JDO e no momento trabalho com JPA como tecnologia de
> persistência de dados. Como provedor do JPA aconselho o TopLink Essentials,
> hoje EclipseLink. Extremamente mais rápido que o Hibernate. Estou agora
> estudando tecnologias de banco de dados orientado a objetos e tenho me
> surpreendido bastante.
Você poderia nos mostrar os benchmarks que comprovam que o EclipseLink
é mais rápido que o Hibernate?
Se você se basear sempre pelo pior caso, vai terminar nunca terminando
o que havia pra fazer de verdade.
-
Maurício Linhares
http://codeshooter.wordpress.com/ | http://twitter.com/mauriciojr
2009/6/18 Nilo Lima <nilo.a...@gmail.com>:
Não :)
O que eu quis dizer foi exatamente exatamente o que estava escrito,
chaves inteiras, crescentes e contíguas são melhores do que chaves não
crescentes e não contíguas.
Mais uma vez, recomendo a leitura do "High Performance MySQL",
especialmente o capítulo 3 que trata de indexação e otimização de
schemas.
-
Maurício Linhares
http://codeshooter.wordpress.com/ | http://twitter.com/mauriciojr
2009/6/19 Tomaz Lavieri <tomazl...@gmail.com>:
Se há chaves primárias nos dois objetos comparados, eu uso as chaves
primárias pra comparação, se não há chaves primárias definidas nos
dois, eu uso os dados do objeto.
2009/6/19 Tomaz Lavieri <tomazl...@gmail.com>:
>
> Aproveitando o animo de vocês nessa discussão ^^, e mudando um pouco o
> foco para EJB, como vocês costumam identificar suas Entitys
> (especificamente falando de equals/hashcode)?
>
> 1° uma observação: eu uso chave primária interna não composta (que não
> faz parte da lógica de negocio)
>
> Eu não uso a chave primária para os testes de equals e na geração de
> hashCode, não faço isso para poder comparar objetos não persistentes
> com objetos persistentes, e para não bugar as tabelas hashs (pois caso
> o equals/hashCode seja baseado na chave primária gerada por
> auto-incrase o hashCode vai mudar após a persistência bugando as
> tabelas hash).
>
> Como vocês costumam implementar o equals/hashCode nos EJBs? baseado na
> chave-primária ? baseado em um campo único que faz parte da lógica de
> negocio ?
>
No fim das contas, quem diz a identidade "real" do objeto é a chave
primária, não as suas propriedades
Sempre a parte mais importante são os dados. Já perguntou a algum cliente se
tem algum problema perder os dados?
De toda forma, trabalhando com os objetos sempre no menor escopo possível, utilizando id ou não no equals/hashcode, a possibilidade de se ter problemas nas coleções por conta disso é relativamente pequena. Não acham ?