Pergunta

O que é melhor? Ou uso e OR mapeador com SP de? Se você tem um sistema com SP já, é um OR mapeador vale a pena?

Foi útil?

Solução

Eu gosto de ORM é porque você não tem que reinventar a roda. Dito isto, depende completamente suas necessidades de aplicação, estilo de desenvolvimento e que da equipe.

Esta questão já foi coberto por que é SQL parametrizado gerado pelo NHibernate tão rápido quanto um procedimento armazenado?

Outras dicas

Não há nada de bom a dizer sobre procedimentos armazenados. Havia uma necessidade há 10 anos, mas cada única vantagem de usar sprocs não é mais válido. Os dois a maioria dos argumentos comuns são em relação à segurança e desempenho. O "envio de material sobre o fio" crap não detém qualquer um, eu certamente pode criar uma consulta dinâmica para fazer tudo no servidor também. Uma coisa que os proponentes sproc não irá dizer-lhe é que faz atualizações impossível se você estiver usando a resolução de conflitos coluna em uma publicação de mesclagem. Somente DBAs que pensam que são o banco de dados senhor insistir em sprocs porque torna sua aparência trabalho mais impressionante do que realmente é.

Esta foi discutido longamente sobre questões anteriores.

Quais são os prós e contras de manter o SQL na Stored Procs contra Código

No meu trabalho, nós principalmente fazer linha de aplicativos de negócios - contrato de trabalho.

Para este tipo de negócio, eu sou um grande fã de ORM. Cerca de quatro anos atrás (quando as ferramentas ORM eram menos maduro) que estudou-se sobre CSLA e demais nossa própria ferramenta ORM simplificado que usamos na maioria das nossas aplicações, incluindo alguns sistemas de classe empresarial que têm 100+ tabelas.

Nós estimamos que esta abordagem (que naturalmente inclui um monte de geração de código) cria uma economia de tempo de até 30% em nossos projetos. Sério, é ridículo.

Há uma pequena desempenho trade-off, mas é insubstancial, desde que você tenha uma compreensão razoável de desenvolvimento de software. Há sempre excepções que exigem flexibilidade.

Por exemplo, operações em lote extremamente intensivo de dados ainda deve ser tratado em sprocs especializados, se possível. Você provavelmente não deseja enviar 100.000 enormes registros sobre o fio se você poderia fazê-lo em um direito sproc no banco de dados.

Este é o tipo de problema que devs novatos correr em se eles estão usando ORM ou não. Eles só têm de ver os resultados e se eles são competentes, eles vão obtê-lo.

O que vimos em nossas aplicações web é que geralmente o mais difícil de resolver gargalos de desempenho não são mais, mesmo com ORM-relacionado banco de dados. Em vez disso, tey're no front-end (navegador), devido à largura de banda, AJAX sobrecarga, etc. servidores de banco de dados Mesmo mid-range são incrivelmente poderosos nos dias de hoje.

É claro, outras lojas que trabalham em muito sistemas de alta demanda maiores podem ter experiências diferentes lá. :)

procedimentos armazenados mãos para baixo. OU Mappers são específicas da linguagem, e muitas vezes adicionar lentidão gráficos.

meios procedimentos armazenados você não está limitado pela interface de linguagem, e você pode simplesmente orçada em novas interfaces para o banco de dados de maneiras para a frente compatíveis.

A minha opinião pessoal ou Mappers é sua existência destaques uma falha de projeto na estrutura popular de bancos de dados. desenvolvedores de banco de dados deve realizar as tarefas as pessoas estão tentando alcançar com complicada ou-Mappers e criar utilitários do lado do servidor que auxiliam no desempenho desta tarefa.

ou Mappers também são alvos épicos da síndrome de "abstração de fuga" ( Joel On Software: Leaky abstrações )

Se a sua muito fácil encontrar as coisas que punho simplesmente não posso por causa da camada de abstração não estar psíquico.

Os procedimentos armazenados são melhores, na minha opinião, porque eles podem ter uma configuração de segurança independente das tabelas subjacentes.

Isto significa que você pode permitir que operações específicas sem sair permitindo que escreve / lê para tabelas específicas. Também limita o dano que as pessoas podem fazer se eles descobrem uma injeção SQL explorar.

Definitivamente ORMs . Mais flexível, mais portátil (geralmente eles tendem a ter portabilidade embutido). Em caso de lentidão você pode querer usar o cache ou SQL sintonizado mão em pontos quentes.

procedimentos geralmente armazenados têm vários problemas com manutenção.

  • em separado do aplicativo (tantas mudanças têm agora a ser feita em dois lugares)
  • geralmente mais difícil de mudança
  • mais difícil de colocar sob controle de versão
  • mais difícil de fazer (problemas de implantação) se eles estão atualizados
  • portabilidade (já mencionado)

Eu, pessoalmente, descobri que de SP tendem a ser um desempenho mais rápido sábio, pelo menos para os grandes itens de dados que executam em uma base regular. Mas eu sei que muitas pessoas que juram por ou ferramentas e não fazer mais nada.

Eu diria que usando um OR mapeador irá aumentar a legibilidade e manutenção de seu código-fonte aplicações, enquanto usando SP irá aumentar o desempenho da aplicação.

Eles não são realmente mutuamente exclusivas, mas ao seu ponto de eles geralmente são assim.

A vantagem de usar o mapeamento relacional de objeto é que você pode trocar fontes de dados. Não só a estrutura de banco de dados, mas você pode usar qualquer fonte de dados. Com serviços web Advent / arquitetura orientada a serviços / da ESB, em uma grande corporação, seria prudente considerar ter uma separação maior nível de preocupações do que o que você poderia entrar em procedimentos armazenados. No entanto, em empresas menores e em aplicativo que nunca vai usar uma fonte de dados diferente, então de SP pode caber a multa conta. E um último ponto, não é necessário utilizar um OR Mapper para obter a abstração. Meu ex-equipe teve grande sucesso, simplesmente usando um modelo adaptador usando Spring.NET para plug-in a fonte de dados.

@ Kent Fredrick

A minha opinião pessoal ou cartógrafos são os seus destaques a existência de uma falha de projeto na estrutura popular de bases de dados "

Eu acho que você está falando sobre a diferença entre o modelo relacional e modelo orientado a objetos. Esta é realmente por isso que precisamos ORMs, mas as implementações destes modelos foram feito de propósito - não é um fluxo de design -. É apenas como as coisas acabou por ser historicamente

Use procedimentos onde você identificou um gargalo de desempenho armazenados. se você ainda não identificou um gargalo, o que você está fazendo com a otimização prematura?
Use procedimentos armazenados onde você está preocupado com a segurança de acesso a uma tabela particular.
Use procedimentos armazenados quando você tem um assistente de SQL que está preparado para se sentar e escrever consultas complexas que se juntam grande quantidade de mesas em um database- legado para fazer as coisas que são difíceis em um OR mapeador.

Use o OR mapeador para o outro (pelo menos) 80% do seu banco de dados: onde os seleciona e atualizações são tão rotineiro quanto ao acesso make através de procedimentos armazenados só um exercício inútil no manual de codificação, e onde as atualizações são tão pouco frequentes que não há custo desempenho. Use um OR mapeador de automatizar as coisas fáceis.

A maioria OR mappers pode falar com procedimentos armazenados para o resto.

Você não deve usar procedimentos armazenados assumindo que eles são mais rápidos do que uma instrução SQL em uma corda, isso não é necessariamente o caso nos últimos versões do servidor MS SQL.

Você não precisa usar procedimentos armazenados para impedir ataques de injeção SQL, existem outras maneiras de fazer certificar de que seus parâmetros de consulta são fortemente digitado e não apenas cordas concatenadas.

Você não precisa usar um OR mapeador de obter um modelo de domínio POCO, mas ajuda.

Se você já tem um API de dados que é exposto como sprocs, você precisa para justificar uma grande reformulação arquitetônica para ir para ORM.

Para um acúmulo de campos verdes, eu avaliar várias coisas:

  1. Se houver um DBA dedicado na equipe, eu inclinar-se para sprocs
  2. Se houver mais de um aplicativo tocando o mesmo DB eu inclinar-se para sprocs
  3. Se não há nenhuma possibilidade de migração de banco de dados sempre, eu inclinar-se para sprocs
  4. Se eu estou tentando implementar MVCC no DB, eu inclinar-se para sprocs
  5. Se eu estou implantando este como um produto com potencialmente vários dbs de back-end (MySQL, MSSQL, Oracle), eu inclinar-se para ORM
  6. Se eu estou em um prazo apertado, eu inclinar-se para ORM, já que é uma maneira mais rápida para criar o meu modelo de domínio e mantê-lo em sincronia com o modelo de dados (com ferramental apropriado).
  7. Se eu estou expondo o mesmo modelo de domínio de várias maneiras (aplicativo web, serviços web, cliente RIA), eu vou inclinar para ORM como então modelo de dados é então escondido por trás da minha fachada ORM, fazendo um modelo robusto de domínio é mais valioso para mim.

Eu acho que o desempenho é um pouco de um arenque vermelho; hibernate parece desempenhar tão bem ou melhor do que SQL mão-codificado (devido à sua níveis de cache), e é fácil de escrever uma consulta ruim em sua sproc de qualquer forma.

Os critérios mais importantes são, provavelmente, as necessidades de portabilidade de banco de dados de habilidades e de longo prazo da equipe.

Bem, a SP já estão lá. Não faz sentido para pode-los realmente. Eu acho que isso faz sentido usar um mapeador com SP de?

"Eu estou tentando dirigir em um prego. Devo usar o salto do meu sapato ou uma garrafa de vidro?"

Ambos os procedimentos e ORMs armazenados são difícil e chato de usar para um desenvolvedor (embora não necessariamente para um DBA ou arquiteto, respectivamente), porque eles têm um custo start-up e maior custo de manutenção que não garante um pay- fora.

Tanto vai pagar bem se os requisitos não devem mudar muito ao longo da vida útil do sistema, mas eles vão ficar no seu caminho se você está construindo o sistema para descobrir os requisitos em primeiro lugar.

Direto codificado SQL ou quase-ORM como LINQ e ActiveRecord é melhor para build-to-descobrir projectos (que acontecem na empresa muito mais do que o PR quer que você pense).

procedimentos armazenados são melhor em um ambiente de linguagem-agnóstico, ou onde é necessário o controle de grão fino sobre permissões. Eles são também melhor se o seu DBA tem uma melhor compreensão das exigências do que seus programadores.

ORMs

full-blown são melhores se você fizer Big Projeto dianteiro, use lotes de UML, quer abstrair o back-end de banco de dados, e seu arquiteto tem uma melhor compreensão das exigências do que quer o seu DBA ou programadores.

E depois há a opção # 4: Use todos eles. Um sistema como um todo não é geralmente apenas um programa, e enquanto muitos programas podem falar com o mesmo banco de dados, eles poderiam cada uso de qualquer método é apropriado tanto para a tarefa específica do programa, e para o seu nível de maturidade. Ou seja:. Você começa com SQL straight-codificados ou LINQ, então amadurecer o programa de refatoração em ORM e Procedimentos onde você vê elas fazem sentido armazenados

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top