Armazenamento de dados em sistemas estilo "prateleira": banco de dados separados ou único?

Tenho um sistema web, no qual é vendido licenças para as empresas o utilizarem, para uma dessas eu crio um banco de dados, o que acaba gerando vários bancos de dados com a estrutura “igual”, porém com dados diferentes.

O igual está entre aspas porque gero minhas tabelas com o Hibernate, então no momento de criação são iguais, porém se alguma propriedade é alterada, o hiberante não altera e tenho que mudar manualmente no banco. ( então as vezes possuem diferenças na sua estrutura ).

Por isso me surgiu a dúvida:

Manter um banco para cada licença, ou então apenas um que irá armazenar todos os registros e cada tabela armazenaria uma referencia a empresa?

OBS: Cada banco teria em média 50.000 registros, e teriam aproximadamente 200 licenças aproximadamente 1.000.000 de registros.
OBS2: Utilizo MYSQL.

Ninguém?

[quote=RafaelViana]Tenho um sistema web, no qual é vendido licenças para as empresas o utilizarem, para uma dessas eu crio um banco de dados, o que acaba gerando vários bancos de dados com a estrutura “igual”, porém com dados diferentes.

O igual está entre aspas porque gero minhas tabelas com o Hibernate, então no momento de criação são iguais, porém se alguma propriedade é alterada, o hiberante não altera e tenho que mudar manualmente no banco. ( então as vezes possuem diferenças na sua estrutura ).

Por isso me surgiu a dúvida:

Manter um banco para cada licença, ou então apenas um que irá armazenar todos os registros e cada tabela armazenaria uma referencia a empresa?

OBS: Cada banco teria em média 50.000 registros, e teriam aproximadamente 200 licenças aproximadamente 1.000.000 de registros.
OBS2: Utilizo MYSQL.[/quote]

Bom a primeira pergunta … se o sistema roda no seu servidor e voce vende o serviço pq cria varios bancos de dados??? A refatoração pra um sistema unico não seria viavel,alem de milhoes de vantagens?? Tenho 3 sistema que rodo nesse esquema so que ja foi modelado pensando nisso…
Se sim basta modelar seu sistema para armazenar a licenca para a empresa guardando a referencia dela…
ou seja duas classes Empresa -> Licencas e o resto do sistema logico pra um nao ver coisa de outros…

Quanto a 1 milhão de registros ai depende do tipo de query que voce vai realizar, ja trabalhei com tabela de 700 mil registros que usava like em uma das querys e era um tormento demora quase 20 segundos pra rodar …o que obrigou a ter soluções paleativas de cache numa temporary etcetc…mas qunado usava indice ia bem…
nao sei qual framework voce usa tambem mas carregar mais de 20.000 objetos com hibernate java pesa pra burro…ai depende de quantas linha retorna…tem varios aspectos que voce tem de pensar…e analisar pra melhor “custoxbeneficio do seu sistema”

RafaelViana

Rafael, não existe uma resposta fácil para este problema.
Existe um material muito bom da Microsoft sobre este assunto que vale a pena ler.

http://msdn.microsoft.com/en-us/library/aa479069.aspx

Eu penso o contrário, não utilizaria a mesma base para clientes diferentes… Seria interessante pensar nas seguintes questões:
-> É realmente seguro ter uma separação apenas lógica entre os dados (muitas vezes confidenciais) de seus clientes? Ou seja, toda a privacidade dessas informações dependendo apenas do código da aplicação? Veja bem, não estou dizendo que você vai cometer algum erro e expor os dados para empresa errada, mas apenas essa possibilidade teórica já assusta.
-> O cliente com certeza se sentirá muito mais seguro (não estamos aqui para deixá-lo feliz?) com sua própria base de dados isolada, principalmente se essa empresa passa por algum tipo de auditoria sobre os sistemas que possui ou utiliza. Espero que ninguém venha aqui no tópico pra dizer que você pode enganar o cliente e dizer que ele tem uma base separada hehehe :shock:
-> Performance: uma coisa é o desempenho do sistema se degradar um pouco por causa do volume de dados, outra totalmente diferente é quando esses dados são de outra empresa totalmente diferente. Não é “problema dele” se você tem muitos clientes, e se eles fazem muitas operações no sistema.

Ter uma base única só tem uma vantagem, que é a manutenção. Mesmo assim essa vantagem é discutível, pois cada um desses clientes está pagando pelo uso do sistema e para que este atenda às suas necessidades, quer dizer: você vai cobrar por esse trabalho de cuidar das bases. A dica que eu daria aqui é criar scripts para reduzir o trabalho manual (e consequentemente diminuir o risco de erro decorrente desse trabalho manual).

Eu penso o contrário, não utilizaria a mesma base para clientes diferentes… Seria interessante pensar nas seguintes questões:
-> É realmente seguro ter uma separação apenas lógica entre os dados (muitas vezes confidenciais) de seus clientes? Ou seja, toda a privacidade dessas informações dependendo apenas do código da aplicação? Veja bem, não estou dizendo que você vai cometer algum erro e expor os dados para empresa errada, mas apenas essa possibilidade teórica já assusta.
-> O cliente com certeza se sentirá muito mais seguro (não estamos aqui para deixá-lo feliz?) com sua própria base de dados isolada, principalmente se essa empresa passa por algum tipo de auditoria sobre os sistemas que possui ou utiliza. Espero que ninguém venha aqui no tópico pra dizer que você pode enganar o cliente e dizer que ele tem uma base separada hehehe :shock:
-> Performance: uma coisa é o desempenho do sistema se degradar um pouco por causa do volume de dados, outra totalmente diferente é quando esses dados são de outra empresa totalmente diferente. Não é “problema dele” se você tem muitos clientes, e se eles fazem muitas operações no sistema.

Ter uma base única só tem uma vantagem, que é a manutenção. Mesmo assim essa vantagem é discutível, pois cada um desses clientes está pagando pelo uso do sistema e para que este atenda às suas necessidades, quer dizer: você vai cobrar por esse trabalho de cuidar das bases. A dica que eu daria aqui é criar scripts para reduzir o trabalho manual (e consequentemente diminuir o risco de erro decorrente desse trabalho manual).[/quote]

“-> É realmente seguro ter uma separação apenas lógica entre os dados (muitas vezes confidenciais) de seus clientes? Ou seja, toda a privacidade dessas informações dependendo apenas do código da aplicação? Veja bem, não estou dizendo que você vai cometer algum erro e expor os dados para empresa errada, mas apenas essa possibilidade teórica já assusta.”

Bom ai depende a que nivel de qualidade de software voce monta, se voce é marinheiro de primeira viagem e não trabalha com uma suite de testes bacanas ai nao aconselho mesmo o uso da mesma base de dados.
Mas tipo pra mim e pra engenharia de software se sua qualidade for legal seu risco de erro é quase zero. Tenho 3 sistemas nesse molde e quanto a performance tem um assunto legal chamado “escalabilidade” que resolve isso tranquilamente. Por si só sistemas que nao rodam local ja tem varios problemas de performance,rede,internet,trafego,picos,etc.

Não sei o tamanho do sistema dele e seu uso teria que ver pra analizar realmente a melhor coisa a se fazer.

Ter um sistema unico tem varias vantagens além de manutenção

Algumas :

  1. Se voce tem 500 clientes e sua aplicação é achado um erro de conceito ? Voce arruma e faz o patch pros 500?? Ruim hein!!
  2. Se voce tem 500 clientes voce tem 500 bases de dados?? Vai precisar de muita gente hein??
  3. Performance se resolve com escalabilidade
  4. Segurança se resolve com teste.
  5. Auditoria podem ser resolvidas em bases separadas, isso se o sistema dele prever isso e se a empresa realmente se importar em auditar seus dados.

Bom essa é minha opinião!!

Obrigado pelas respostas.

Fiquei curioso com uma delas:

@gomesrod: A dica que eu daria aqui é criar scripts para reduzir o trabalho manual (e consequentemente diminuir o risco de erro decorrente desse trabalho manual).

Scripts para manipular bancos de dados? Consigo fazer algo como assim: manter em um arquivo todos os endereços dos bancos de dados e fazer um loop neles fazendo a alteração? Ou teria que executar o script sql um por um?

Voltei ao assunto…

Como não tenho testes ( infelizmente percebi a importância deles tarde demais ) preferi rodar um banco de dados para cada cliente.

Alguém ai sabe se já existe algum framework ou biblioteca para manipular bancos de dados MySQL? Como incluir coluna, alterar coluna, excluir coluna? Para automatizar o processo.