Nilo, vou contribuir tb com mais um artigo do Martin Fowler!
Inversion of Control Containers and the Dependency Injection pattern - http://martinfowler.com/articles/injection.html
Acredito que para um equipe de desenvolvimento crescer e ajudar uma empresa crescer também, o mínimo que as pessoas precisam é se dedicar no auto-conhecimento e quando falamos de tecnologia isso se torna ainda mais complicado, pq a cada dia tem-se algo novo e os nossos sistemas sempre vão ficando velhos e obsoletos.
Pode ter certeza, essas mesmas pessoas que hoje em dia rejeitam a mudança de paradigma, amanhã estarão ligando pra vc “DESESPERADAS” qdo forem trocar de emprego ou forem demitidas, como do tipo: “...cara, preciso de uma ajuda urgente, vc manja de .Net, Unity, ASP.Net MVC, Linq, NHiber, Extensions Methods, etc... Como faço isso e aquilo?”
E assim a vida segue no nosso mundo e as coisas infelizmente e muitas vezes no Brasil sempre caminham um pouco mais devagar, é claro não podemos esquecer dos imbecis dos Gerentes de Projetos que contribuem para isso, não tendo o mínimo de discernimento para ao menos assumir o risco junto com a equipe, incentivar quem tem potencial e muitas vezes incentivar e acreditar que pelo menos um POC poderá ser feito para tentar validar uma nova arquitetura candidata ou mesmo mudar um paradigma para melhor....
T+
Kemps A. Vieira
System Architect
MCPD Enterprise
<br
Desculpem a demora,
Acredito que eu seja realmente o único a não concordar com a opinião dos que postaram seus comentários a respeito do assunto.
Basicamente acompanho diversas gerações de sistemas e já faz muito tempo que tenho isso muito claro em meu pensamento:
Independente da aplicação, das regras de negócio, o que faz realmente sentido para o cliente são os dados.
Uma estória para descontrair:
Crie um cenário onde você tenha dois datacenters :
O fictício e recém criado “Datacenter A” possui todas as suas regras de negócio enquanto o “DataCenter B” possui as bases de dados da sua empresa.
Agora imagine receber uma carta de um grupo terrorista informando: “Vamos destruir um dos seus datacenters”.
Tendo como premissa que a ação terrorista será algo inevitável, você torceria para que qual dos dois fosse danificado?
Um pensamento:
Os meios e a metodologia usada para escrever os manuscritos, pergaminhos, hieróglifos, etc podem ter se perdido, mas o importante é o que tais representações de informação trouxeram.
As aplicações vem, as aplicações vão, linguagens, plataforma etc. Tudo vem e vai exceto os dados, o menor ponto de mudança ainda é a estrutura de dados, inevitavelmente. Não só pelo seu valor, mas pelo que eles representam em si. O conteúdo tem valor infinitamente maior do que o canal de processamento.
Qual bom profissional não entenderia todo o contexto de uma aplicação apenas em olhar para um banco de dados bem modelado?
Sei perfeitamente que o tema em questão está relacionado apenas ao problema das PK’s Compostas, no entanto a abordagem que se tem tido sobre a função do banco de dados em aplicações OO está fora do que eu consigo enxergar como saudável.
Lembrando do conceito de divisão de responsabilidades, encaro que o banco é responsável pela sanidade dos dados armazenados nele. Portanto, para mim, existem regras que devem ser aplicadas a este contexto.
Não estou falando de processamento de negócio, entretanto se alguém encarar uma constraint (seja ela qual for) como uma regra de negócio, então eu sou a favor de regras de negócio no banco sim.
Na questão das chaves primárias compostas, esta é uma boa prática de modelagem de dados. Existem recomendações referentes às implementações de ORM’s que dizem para usar sempre chaves burras.
Ao meu ver essa não é uma boa prática, é apenas um facilitador. De acordo com o contexto vale a pena. Depende diretamente da “política” da empresa (política formal ou informal) para modelagem.
É evidente e não sou tolo a ponto de discordar dos ganhos (no desenvolvimento) usando chaves burras, no entanto não acho justo.
Ao meu ver, as ferramentas deveriam suportar tal implementação de forma satisfatória. Não é meu o problema se uma ferramenta não suportar alguma boa prática de modelagem, é problema da ferramenta. Essa forma de modelar para mim é um workaround “politicamente não tão incorreto” porque já virou “jurisprudência”.
Neste caso específico eu nem faço tanta questão, mas a minha indignação vem em função de alguns problemas de infra que tive no passado por causa desta linha de raciocínio.
Enquanto o repositório, banco de dados no caso, não puder ser totalmente abstraído, ele não será. Esta é a minha visão, um tanto radical, conservadora, mas para mim muito sensata.
Atenciosamente
Luiz Carlos Faria
De:
dotnetar...@googlegroups.com [mailto:dotnetar...@googlegroups.com] Em
nome de Nilo Lima
Enviada em: quarta-feira, 17 de junho de 2009 00:20
Para: dotnetar...@googlegroups.com
Assunto: [dotnetarchitects] Re: Chave primária única x Chave primária
composta
Não é bem assim Tucaz,
Desculpem a demora,
--
André Carlucci
Daniel,
Acho que a melhor forma de responder é usando seu texto e respondendo abaixo:
Existe uma diferença gritante entre um "Banco bem modelado" e um sistema "bem modelado" por que normalmente o modelo que se aplica a um não é o mesmo que se aplica ao outro. Então o que você disse a respeito da ferramenta não suportar uma boa prática de modelagem é um mal-entendido. Ela suporta, sim, as boas práticas de modelagem. Mas no modelo que ela implementa. Um banco de dados pode ser bem-modelado no relacional e o sistema que o consome pode ser bem modelado também, mas no modelo de objetos.
Neste caso não há mal-entendido, como eu disse:
Ao meu ver, as ferramentas deveriam suportar tal implementação de forma satisfatória. Não é meu o problema se uma ferramenta não suportar alguma boa prática de modelagem, é problema da ferramenta. Essa forma de modelar para mim é um workaround “politicamente não tão incorreto” porque já virou “jurisprudência”.
Reformulando
a parte principal desse parágrafo: “Não é meu o problema se uma ferramenta não
suportar alguma boa prática de modelagem”.
Independente de ser boa ou ruim, é uma prática que ainda não foi e não será abolida. Se é boa ou ruim, vou voltar ao assunto no próximo email. Envio ainda hoje.
Mas o banco, independente de como foi modelado, acaba por fazer parte do sistema. Então lidar com a diferença entre os modelos acaba por fazer parte do nosso trabalho.
Concordo. Se eu mudar meu questionamento acho que vai ficar mais claro: E se meu modelo relacional for imutável? Sabemos que nunca é, mas e se fosse? Quem aparece com a pretensão de resolver o meu problema para o mapeamento é o ORM em questão. Eu tenho total ciência das minhas necessidades, alguns ORM’ que não satisfazem minhas necessidades. Este não é o caso do NHibernate, ele me atende razoavelmente bem.
Em meus sistemas não uso campos de negócio para chave-primária, e o uso de constraints pode até indicar uma certa aplicação de regra de negócio no DB, mas eu não enxergo assim, é somente "modelo" (no caso, relacional).
Agora temos um mal-entendido. Embora estivéssemos falando sobre chaves compostas como primary key, o que eu disse foi a mesma coisa, veja:
Lembrando do conceito de divisão de responsabilidades, encaro que o banco é responsável pela sanidade dos dados armazenados nele. Portanto, para mim, existem regras que devem ser aplicadas a este contexto.
Não estou falando de processamento de negócio, entretanto se alguém encarar uma constraint (seja ela qual for) como uma regra de negócio, então eu sou a favor de regras de negócio no banco sim.
Vê? Estou lidando com, no mínimo, dois modelos. (E podem haver outros, por exemplo, em outros sistemas consumindo o mesmo banco para contextos diferentes).
Sim, eu concordo.
Tabelas normalizam dados, Objetos normalizam comportamento, e se você quiser usar somente um deles como lead-model pra todo o resto, você vai ter problemas.
Concordo com ressalvas: Existem cenários em que não há problema algum.
Quanto a entender o contexto de uma aplicação apenas observando um banco de dados bem modelado... eu diria que aí você tá esquecendo de muita coisa. Nem tudo em um sistema é pura persistência de dados. Você tem componentes. Você tem Layers, Tiers... e, embora isso não mude o "contexto" do modelo dos seus dados, eu prefiro ver um sistema bem modelado (onde você pode ver um panorama bem mais abrangente de objetos, componentes e camadas - pra não falar dos recursos externos) do que ver um MER.
Lendo seu texto me lembrei de mais um item: A configuração. Pronto! Vendo um MER e a configuração de uma aplicação bem modelada daria para fazer um big picture da aplicação.
Eu não estava ignorando a modelagem da aplicação, apenas citando e reiterando a importância de um banco bem modelado.
O que eu queria dizer, em termos práticos é que um MER bem feito consegue por si só fazer dos dados informação.
O banco no fim das contas vai ser apenas um repositório deste modelo, e como ele vai ser modelado normalmente não faz muito impacto no fim das contas.
Eu não concordo, se voltarmos à estória do terrorista, a resposta à pergunta final mostra a importância dos dados. Já vi e já tive muita dor de cabeça por conta de modelos relacionais equivocados e desnecessariamente complexos.
De:
dotnetar...@googlegroups.com [mailto:dotnetar...@googlegroups.com] Em
nome de Daniel Moreira Yokoyama
Enviada em: quarta-feira, 17 de junho de 2009 02:49
Para: dotnetar...@googlegroups.com
Assunto: [dotnetarchitects] Re: Chave primária única x Chave primária
composta
Luiz,
“Tomar decisões baseadas em boas práticas é legal, mas nunca esqueçam da sua experiência. "Martin Fowler falou" não funciona como argumento, mesmo porque ele não é deus e muito menos está trabalhando no seu projeto.”
Acaba de ganhar um amigo!!!
>
> >
>
--
André Carlucci
Mt boa!!!!!
2009/6/17 André Carlucci <andrec...@gmail.com>
--
André Carlucci
O maior legado COBOL no Brasil ainda é das instituições financeiras.
O maior motivador para manterem essa estrutura é: custo.
Princípios básicos e plausíveis:
Uma instituição financeira existe para gerar lucro.
Se algo funciona, não há problema.
Se algo não funciona, é melhor corrigir ou refazer? O que trouxer menor custo, obvio.
Portanto não muda e nem vai mudar tão cedo.
Quando falo em custo falo em:
· Projeto
· Implantação
· Manutenção
· Risco
A primeira instituição que parar de funcionar em função de uma migração desse porte tem grande chance de afundar e ainda virar piada na mídia.
Ops... esqueci do conteúdo relevante!! Hehehehe
Como disse antes, citei alguns aspectos que uso no banco e disse: Se consideram isso regra de negócio, eu gosto sim.
Basicamente foi isso.
"Se o modelo é bem feito (como eu entendo por um modelo bem feito, e que alguns podem discordar) você não vai ter consultas complexas"
Cara, você com certeza não tem os clientes que eu tenho :)
Quanto a criação de um ORM, acho completamente inviável bater chegar sequer próximo do que há no mercado hoje.
É difícil manter investimento nisto.
Claro que com uma visão minimalista se consegue um meio termo. Eu já tenho algo do gênero, mas baseado em geração de código.
Quanto à questão dos dados x aplicação.
A aplicação sempre é o elo fraco nessa história. Afinal, a aplicação é, no final das contas, um ator que engloba diversos papeis dentro de um fluxo de negócio. Portanto, se não existisse aplicação, alguém ou muitos realizariam a tarefa. Assim, é viável recriá-la, pois o conhecimento sobre o processo é algo rotineiro. Não perdendo pessoas, a maioria das aplicações poderiam ser recriadas, e já são.
<br
2009/6/17 André Carlucci <andrec...@gmail.com>
2009/6/17 André Carlucci <andrec...@gmail.com>
--
André Carlucci
--
André Carlucci
Com relação a estória só queria tirar o foco da questão em si para fazer com que repensasse. Nada demais. O cenário fictício esteve ali para mostrar o caos e gerar uma reflexão sobre a importância de um e de outro. Sem desqualificar nenhum, apenas “medindo forças”.
Quanto a ninguém pagar por algo que já havia sido pago: Já vi dois casos, grandes.
Quanto a banco, tem load balance sim, podendo escolher se é feito via software ou hardware.
Gostaria de lembrar que não sou profissional de banco de dados, Ok?
Só tenho minhas opiniões, um tanto críticas, mas nem tudo é perfeito.
<br
--
André Carlucci
Além disso, você tem pacotes que gerenciam e garantem afinidade entre servidores em um contexto transacional.
Eu conheço a existência, mas não trato com estes recursos diretamente.
Seguem alguns links com informações sobre SQL Server, Oracle e MySQL. Muito interessante.
Oracle
http://www.orafaq.com/node/1840
http://www.datadirect.com/developer/odbc/odbc_oracle_rac/index.ssp
Sql Server
http://msdn.microsoft.com/pt-br/library/ms189134.aspx
http://technet.microsoft.com/en-us/library/ms191309.aspx
MySQL
http://www.mysql.com/news-and-events/newsletter/2003-04/a0000000157.html
http://www.howtoforge.com/loadbalanced_mysql_cluster_debian (só para exemplificar, o link trata instalações debian)
<br
A Oracle tem diversas soluções não só para load balance como para segurança também.
Já faz algum tempo (uns 4 anos) que vi uma solução Oracle contendo autenticação integrada em aplicações web, fazendo controle de acesso sobre registros/colunas de uma tabela do banco.
Não estou a par do que há de novo em função das necessidades que tenho, mas com certeza existem muitas soluções interessantes.
Outra novidade, eu encontrei em um banner Oracle, o “HP Oracle Exadata Storage Server”. Pelo menos o marketing em cima deste produto está muito bom.
<BR<BR
Respondendo:
“Quanto as chaves primárias (compostas ou não), lembro que um professor que tive na faculdade foi muito feliz em sua colocação dizendo (IMHO) que não devemos usar como chave primária valores externos que não temos controle sobre ele, como CPF, um código de um produto, CEP, etc. Vamos supor que temos um comércio eletrônico e o código de um produto de um fornecedor mude, vcs podem imaginar o impacto que isso teria em nossa aplicação.”
Você está certo, esse cuidado é uma boa prática.
Mas... o assunto estava relacionado apenas a criação de chaves compostas como PK.
<br
Régis,
Se pareci, ou pareço arrogante pela forma como disserto, me perdoe, não era essa a intenção.
Entenda que quando digo “discordo” é porque penso diferente, apenas. Não gostaria de ser mal interpretado por ninguém do grupo.
Mas, vamos aos porquês:
Imagine uma relação NxN com duas tabelas com chave burra. Não sou contra chave burra, desde que faça sentido para os dados. Fruto desta relação NxN teríamos naturalmente uma tabela associativa.
Essa tabela associativa, ao meu ver, e não pretendo mudar o mundo com meus argumentos, não deveria possuir uma chave burra, apenas a composição de sua PK com base nas FK’s envolvidas no relacionamento.
Visualmente, não consigo lembrar de nenhuma ferramenta ou forma de modelar um banco que traga junto ao MER as informações sobre cada índice de uma tabela. Visualmente temos problemas para identificar a cardinalidade entre relações NxN, dificultando inclusive a validação do modelo relacional.
Do ponto de vista tecnológico, estou incorporando ao meu modelo de dados regras para atender a questões não relacionadas ao contexto dos dados. Não vejo sentido algum ter de adaptar meu modelo de dados a uma necessidade ou luxo de um ORM, por exemplo. Assim como não me familiarizo com a necessidade de adaptar meu design da aplicação em função de características relacionadas ao banco.
Ignorando a existência de um banco de dados, o relacionamento entre as duas classes teria um identificador? Não.
No banco, só existe uma tabela intermediária pois o modelo relacional não permite uma implementação diferente para esse relacionamento.
Atenciosamente
Luiz Carlos Faria
<br
Então Régis,
Para estes casos e na verdade para a maioria eu coloco ID’s , simples ou compostos de acordo com a necessidade de versionamento do conteúdo. Eu não faria o mesmo para uma tabela simplismente associativa. Esse é o ponto da discussão.
Quanto a ser ou não uma boa prática, neste caso ainda existe uma forte discussão e até acredito que não mudará. Sempre terá duas linhas de raciocínio a respeito do assunto. Com base na discussão aqui, acredito que mesmo em tabelas associativas vamos acabar tendo duas linhas diferentes e eternas. Discordar faz parte e é bom para os dois lados.
<br
Então Régis,
Para estes casos e na verdade para a maioria eu coloco ID’s , simples ou compostos de acordo com a necessidade de versionamento do conteúdo. Eu não faria o mesmo para uma tabela simplesmente associativa. Esse é o ponto da discussão.
Quanto a ser ou não uma boa prática, neste caso ainda existe uma forte discussão e até acredito que não mudará. Sempre terá duas linhas de raciocínio a respeito do assunto. Com base na discussão aqui, acredito que mesmo em tabelas associativas vamos acabar tendo duas linhas diferentes e eternas. Discordar faz parte e é bom para os dois lados.
<br