Pergunta

Uma e outra vez, eu vi pessoas aqui e em qualquer outro lugar defendendo evitar extensões nonportable à linguagem SQL, sendo o exemplo mais recente desta . Lembro-me apenas um artigo afirmando que estou prestes a dizer, e eu não tenho que apontam mais.

Você realmente beneficiado de escrever SQL portátil e destituir do seu dialeto proprietária ferramentas / sintaxe?

Eu nunca vi um caso de dores alguém tirar a construir um aplicativo complexo em mysql e, em seguida, dizendo Você sabe o que seria apenas peachy? Vamos mudar para (PostGreSQL | A Oracle | SQL Server)

!

bibliotecas comuns em PHP -say- fazer abstração das complexidades de SQL, mas a que custo? Você acaba incapaz de usar construções e funções eficientes, para um vislumbre presumido de portabilidade você provavelmente nunca vai usar. Isso soa como YAGNI livro para mim.

EDIT: Talvez o exemplo que eu mencionei é muito sarcástico, mas acho que os restos de ponto: se você está planejando um movimento de um DBMS para outro, você provavelmente está redesenhando o aplicativo de qualquer maneira, ou você não seria fazê-lo em tudo.

Foi útil?

Solução

Software fornecedores que lidam com grandes empresas podem não ter escolha (na verdade, esse é o meu mundo) - seus clientes podem ter políticas de utilização de apenas um produto do fornecedor de banco de dados. Para perder grandes clientes é comercialmente difícil.

Quando você trabalha dentro uma empresa que você pode ser capaz de beneficiar do conhecimento da plataforma.

De um modo geral a camada DB deve ser bem encapsulado, por isso mesmo se você tivesse que porta para um novo banco de dados a mudança não deve ser generalizada. Eu acho que é razoável tomar uma abordagem YAGNI para portar menos que tenha um requriement específico para suporte multi-vendor imediata. Fazê-lo funcionar com o seu banco de dados alvo atual, mas estruturar o código cuidadosamente para permitir a portabilidade futuro.

Outras dicas

O problema com as extensões é que você precisa para atualizá-los quando você está atualizando o próprio sistema de banco de dados. Os desenvolvedores geralmente pensam que o seu código vai durar para sempre, mas a maioria do código terá de ser reescrito dentro de 5 a 10 anos. Bases de dados tendem a sobreviver mais tempo do que a maioria das aplicações, desde os administradores são suficientes inteligente para não consertar as coisas que não são quebrados para que eles muitas vezes não atualizar seus sistemas a cada nova versão.
Ainda assim, é uma verdadeira dor quando você atualizar seu banco de dados para uma nova versão ainda as extensões não são compatíveis com aquele e, portanto, não vai funcionar. Faz a atualização muito mais complexo e exige mais código para ser reescrito.
Quando você escolhe um sistema de banco de dados, você está sempre preso com essa decisão por anos.
Quando você escolhe um banco de dados e algumas extensões, você 're preso com essa decisão por muito, muito mais!

O único caso em que eu posso ver que é necessário é quando você está criando software o cliente vai comprar e usar em seus próprios sistemas. De longe, a maioria dos programação não se enquadram nesta categoria. Recusar-se a código de fornecedor específico uso é para garantir que você tenha um banco de dados porrly atuando como o código de fornecedor específico é geralmente escrito para melhorar o desempenho de determinadas tarefas mais ANSII padrão SQL e escritos para tirar advatage da arquitetura específica desse banco de dados. Eu já trabalhei com datbases há mais de 30 anos e nunca ainda vi uma empresa alterar seu banco de dados de back-end sem uma reescrita completa aplicação também. Evitando código específico do fornecedor, neste caso, significa que você está prejudicando o seu desempenho por qualquer razão na maioria das vezes.

Eu usei também um monte de diferentes produtos comerciais com backends de banco de dados ao longo dos anos. Sem exceção, cada um deles foi escrito para oferecer suporte a vários backends e, sem exceção, cada um deles era um cão miserável, lenta de um programa para realmente usar em uma base diária.

Na grande maioria das aplicações que eu seria capaz de apostar que há pouco ou nenhum benefício e até mesmo um efeito negativo de tentar escrever sql portátil; no entanto, em alguns casos, há um caso de uso real. Vamos supor que você está construindo uma aplicação Web Time Tracking. E você gostaria de oferecer uma solução hospedada self.

Neste caso, seus clientes terão de ter um DB Server. Você tem algumas opções aqui. Você poderia forçá-los a usar uma versão específica que poderia limitar a sua base de clientes. Se você pode suportar vários DBMS, então você tem um cliente potencial mais amplo, que pode utilizar a aplicação web.

  • Se você é corporativo, então você usa a plataforma que está dada
  • Se você é um vendedor, você tem que planejar para múltiplas plataformas

Longevidade para empresas:

  • Você provavelmente vai reescrever o código do cliente antes de migrar SGBD
  • Os DBMS irá provavelmente viver mais o seu código de cliente (Java ou C # contra '80 mainframe)

Lembre-se:

SQL dentro de uma plataforma normalmente é compatível com versões anteriores, mas bibliotecas clientes não são. Você é forçado a migrar se o sistema operacional não pode apoiar uma antiga biblioteca, ou ambiente de segurança, ou arquitetura de driver, ou biblioteca de 16 bits etc

Assim, suponha que você tinha um aplicativo no SQL Server 6.5. Ele ainda corre com alguns ajustes no SQL Server 2008. Eu aposto que você não está usando o código do cliente sã ...

Há sempre alguns benefícios e alguns custos para usando o dialeto "menor denominador comum" de uma linguagem, a fim de portabilidade de salvaguarda. Eu acho que os perigos de lock-in para um determinado DBMS são baixos, quando comparados com os perigos semelhantes para languges, bibliotecas de objetos e funções, geradores de relatórios, e assim por diante.

programação

Aqui está o que eu recomendaria como a principal forma de salvaguardar a portabilidade futuro. Faça um modelo lógico do esquema que inclui tabelas, colunas, restrições e domínios. Faça isso como DBMS independente quanto possível, dentro do contexto de bancos de dados SQL. Sobre a única coisa que será dialeto dependente é o tipo de dados e tamanho por alguns domínios. Alguns dialetos mais velhos não têm suporte de domínio, mas você deve fazer o seu modelo lógico em termos de domínios de qualquer maneira. O fato de que duas colunas são retirados do mesmo domínio, e não apenas compartilhar um tipo de dados e tamanho comum, é de importância crucial na modelagem lógica.

Se você não entender a distinção entre a modelagem lógica e modelagem física, aprendê-lo.

Faça o máximo da estrutura do índice portátil que puder. Embora cada DBMS tem suas próprias características especiais de índice, a relação entre índices, tabelas e colunas é apenas sobre DBMS independente.

Em termos de CRUD SQL processamento dentro do aplicativo, o uso DBMS construções específicas, sempre que necessário, mas tentar mantê-los documentado. Como exemplo, eu não hesite em usar construção "CONNECT BY" da Oracle sempre que eu acho que vai me fazer algo de bom. Se a sua modelagem lógica tem sido DBMS independente, muito do seu CRUD SQL também será DBMS independente mesmo sem muito esforço de sua parte.

Quando chega a hora de se mover, esperar alguns obstáculos, mas esperamos superá-los de uma forma sistemática.

(A palavra "você" no exemplo acima é para quem possa interessar, e não ao OP, em particular.)

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