Devo usar um banco de dados por aplicativo ou compartilhar um único banco de dados entre vários aplicativos [fechado]

33

Eu tenho vários aplicativos, alguns que usam dados das mesmas fontes. É uma boa prática (ou quais são os prós / contras):

  • deixe os dados em bancos de dados compartilhados por vários aplicativos

    1. economiza espaço, pois é necessário apenas um banco de dados
    2. complica a indexação, pois diferentes aplicativos têm diferentes necessidades de consulta
  • importar dados diariamente para bancos de dados por aplicativo

    1. usa mais espaço, pois existem dados duplicados nos bancos de dados por aplicativo
    2. indexação mais fácil, pois cada aplicativo pode se concentrar em suas necessidades individuais

Posso ter deixado de fora outras vantagens / desvantagens, liste, se houver, e também como isso é feito no seu local de trabalho?

Laz
fonte
1
Como você está definindo o aplicativo: compilações separadas, desenvolvedores diferentes?
JeffO
Compartilhar o banco de dados transforma o banco de dados inteiro em uma API pública grande e confusa. E faltam todas as abstrações que você pode criar no primeiro aplicativo.
22412 Patrick
O desempenho é um problema? Com registros suficientes que dissuadiriam um de um grande banco de dados único. O espaço é barato.
Rig

Respostas:

41

Atualmente, o espaço é barato, por isso aconselho o uso de um banco de dados por aplicativo.

Compartilhar um banco de dados entre vários aplicativos tem algumas sérias desvantagens :

  • Quanto mais aplicativos usarem o mesmo banco de dados, maior será a probabilidade de você encontrar gargalos de desempenho e não conseguir dimensionar facilmente a carga conforme desejado . Os bancos de dados SQL não são realmente escaláveis. Você pode comprar máquinas maiores, mas elas não escalam bem em grupos!

  • Os custos de manutenção e desenvolvimento podem aumentar : o desenvolvimento é mais difícil se um aplicativo precisar usar estruturas de banco de dados que não são adequadas para a tarefa em questão, mas precisam ser usadas como já estão presentes. Também é provável que os ajustes de um aplicativo tenham efeitos colaterais em outros aplicativos ("por que existe um gatilho desnecessário ??!" / "Não precisamos mais desses dados!"). Já é difícil com um banco de dados para um único aplicativo, quando os desenvolvedores não sabem / não podem conhecer todos os casos de uso.

  • A administração se torna mais difícil: qual objeto pertence a qual aplicativo? Caos subindo. Onde devo procurar meus dados? Qual usuário tem permissão para interagir com quais objetos? O que posso conceder a quem?

  • Atualização: você precisará de uma versão com o menor denominador comum para todos os aplicativos que a utilizarem. Isso significa que certos aplicativos não poderão usar recursos poderosos. Você terá que ficar com versões mais antigas. Também aumenta um pouco os custos de desenvolvimento.

  • Concorrência: Você pode realmente ter certeza de que não há dependências cronológicas entre processos? E se um aplicativo modificar dados desatualizados ou que deveriam ter sido alterados por outro aplicativo primeiro? E os diferentes aplicativos que trabalham nas mesmas tabelas simultaneamente?

Comparado a isso, as importações de dados / processos ETL são quase sempre bastante diretas e simples. Carregue os dados quantas vezes for necessário, o espaço é barato. Você pode explicar a escalabilidade de cada aplicativo independentemente, ajustar e ajustar as estruturas conforme necessário e não haverá problemas de simultaneidade. Os efeitos colaterais também podem ser rastreados muito mais facilmente.

Edit: Gostaria de ressaltar, no entanto, que, como o @Saeed mencionou, se você pode encapsular manipulações de dados em um serviço que está normalmente disponível, é mais fácil compartilhar um banco de dados com vários aplicativos. Contanto que você não precise de acesso bruto, essa é uma abordagem muito boa.

Falcão
fonte
Ao usar um serviço para o banco de dados compartilhado de acordo com a resposta do @ Saeed, ainda não tenho a preocupação de vários aplicativos não terem necessidades diferentes e exigirem uma ampla variedade de índices no banco de dados?
Laz
2
@ Laz: Provavelmente, depende dos casos de uso e requisitos.
Falcon
2
Um dos fundamentos do design de banco de dados relacional é não ter dados duplicados. Ter bancos de dados diferentes que contêm sobreposição dos mesmos dados está apenas causando problemas.
Pieter B
Pieter B: Suponho que você nunca trabalhou em ambientes empresariais, como nas grandes corporações. Ter um banco de dados com muitos aplicativos diferentes e equipes de desenvolvimento diferentes está apenas pedindo problemas e, eventualmente, pode atrasar o desenvolvimento. Dito isto, nunca há uma escolha em preto e branco.
Falcon
@ PieterB: vários aplicativos lendo e gravando os mesmos dados são uma boa indicação de que você deve levar em consideração uma camada de serviço na qual todos os aplicativos podem fazer solicitações. Por outro lado, se forem diferentes o suficiente para que você não consiga fatorar um serviço comum, serão diferentes o suficiente para exigir tabelas / bancos de dados separados.
Dan Lyons
23

Eu tive uma situação semelhante uma vez. Meu problema era criar três aplicativos, um para gerenciamento de inventário, um para gerenciamento de compras e outro para gerenciar usuários, ou seja, funcionários. Minha recomendação é não interromper os bancos de dados fisicamente por aplicativo ou uni-los fisicamente por aplicativo. Pelo contrário, a separação lógica do IMHO funciona melhor.

Por exemplo, todos os três aplicativos necessários para trabalhar com informações de funcionários. Os sistemas de estoque e suprimento usavam as mesmas informações de mercadorias e itens de estoque.

Criei um banco de dados compartilhado, no qual armazenava as informações de usuários e mercadorias. Então construí uma camada de serviço sobre ela e usei esses serviços em outros aplicativos. Para mostrar uma lista de todos os funcionários que estão agora na empresa, por exemplo, eu só precisava chamar um método do serviço, como GetOnWorkEmployees().

Também criei uma interface de usuário comum para interagir com usuários e mercadorias, que era um aplicativo da Web separado por si só.

Então, adicionando o que o @Falcon apontou, acho que você pode se beneficiar da centralização da funcionalidade comum entre aplicativos em um banco de dados.

Saeed Neamati
fonte
3
+1 para separação lógica e sugerindo uma arquitetura limpa. SOA faz essas coisas realmente mais fácil
Falcon
Definitivamente +1 para organização lógica. Deixe os dados serem agrupados para otimizar o equilíbrio entre acoplamento e coesão e, em seguida, os aplicativos poderão mergulhar nos bancos de dados necessários para o trabalho.
Joel Brown
9

Se esses aplicativos funcionarem com os mesmos dados - por exemplo, a mesma lista de produtos e clientes -, mantenha o banco de dados unido. Você não ganha nada separando os bancos de dados. Isso é puramente um problema 'humano' - para o servidor, são apenas bytes em um disco. Ele não se importa se seus 1 ou 100 bancos de dados. Mas se você dividir, precisará lidar com a sincronização de dados. Os problemas de indexação apresentados não são um problema real - você gastaria a mesma quantidade de tempo do processador mantendo os índices se os bancos de dados fossem divididos.

Se o desempenho começar a se tornar um problema, replicou o banco de dados para vários servidores para equilibrar as coisas.

GrandmasterB
fonte
3

Pode ou não valer a pena a troca na sua situação, mas manter a integridade dos dados é mais fácil com um único banco de dados. Pelo menos no MS SQL Server, você não pode chave estrangeira de um banco de dados para um banco de dados diferente. Você pode simular o comportamento de chave estrangeira com gatilhos, mas não é particularmente elegante.

Além disso, a criação de cópias locais dos dados pode ser perigosa quando as gravações entram em cena. Se o AppA e o AppB tiverem uma cópia de alguns dados compartilhados e o AppA os atualizar, o AppB ainda terá os dados antigos. Ou você precisará configurar gatilhos para manter os dados sincronizados.

Jared S
fonte
+1: é fácil o suficiente mapear vários aplicativos para um único banco de dados.
Kevin cline
0

Uma vez eu tive vários sites que se tornaram populares ao longo do tempo. Eles usaram bancos de dados separados, principalmente porque o provedor de hospedagem permitia apenas 1 GB de espaço de armazenamento cada. Mas! Assim que lancei um serviço que incluía todos esses sites, comecei a fazer transações entre esses sites, e a maneira mais conveniente de fazer isso é mover tudo definitivamente para um grande banco de dados.

Então, otimizei a estrutura do banco de dados e espremi as partes relevantes para esse banco de dados central, mas deixei todo o resto de fora.

Minha opinião está de alguma forma relacionada aos paradigmas da OOP. Dados semelhantes devem ser armazenados juntos; portanto, se você criar aplicativos diferentes, use bancos de dados diferentes para eles.

No caso acima, não foi possível evitar o uso de db comum, mas lembre-se de que também mantive algumas tabelas separadas em um db separado, que não fazem parte das consultas comuns.

Além disso, se você os mantiver separados, eles serão mais fáceis de fazer backup, haverá menos chances de perda de dados. Se algo der errado e os aplicativos interferirem um com o outro, o banco de dados fica bagunçado e você basicamente não deseja expor seu aplicativo a esse perigo.

Em suma, você pode manter um banco de dados comum para consultas comuns, mas também um para cada um de seus aplicativos.

Rápli András
fonte
0

Você pode elaborar mais sobre sua arquitetura de aplicativos?

Se o seu banco de dados funcionar apenas como um repositório de dados sem lógica do aplicativo, como gatilhos ou código do pacote de negócios, seria melhor ter um único banco de dados e encapsular a funcionalidade no nível de negócios aos serviços que usam o banco de dados para todas as suas ações. Se você tiver gatilhos ou código no esquema do banco de dados, terá grandes problemas usando um único banco de dados que pode ser problemático em muitos casos.

Chris Mylonas
fonte