Sistema multiusuario

opa galera estou com uma duvida,

quero desenvolver um sistema web onde vou ter varias empresas cadastradas…

minha duvida é a seguinte como vou separar as informações de cada empresa dentro do meu banco de dados, sem correr risco dos dados serem visualizados por pessoas não autorizadas…

Use um EAR/WAR para cada empresa e nela aponte para um database diferente. [=

mas isso não fica ruim? eu imagino eu com 5 mil usuarios ai vou ter 5 mil bases diferentes

Vc ta falando de cada empresa ter vários usuários? Ou uma empresa ser apenas mais um registro na tabela usuário?
tipo

usuarios
empresaA
empresaB

É isso?

O exemplo que eu falei, se aplica ao primeiro caso.

é varias empresas vao ter varios usuarios…

Se seu sistema vai ter 5000 empresas cadastradas, realmente sua app é de grande porte viu.
O único modo que eu imagino eh ter um database para cada empresa e cada empresa ter seus usuários.

tava pensando em colocar em todas as tabelas um campos chamado idgrupo e na hora do select ou do insert eu colocar o id do grupo pegando da session do usuario

o que voce acha?

[quote=michelorth_92]tava pensando em colocar em todas as tabelas um campos chamado idgrupo e na hora do select ou do insert eu colocar o id do grupo pegando da session do usuario

o que voce acha?[/quote]
Acho que você poderia perder em performance.

Seguindo os dados que você me passou, imagine 5000 empresas cada uma com 20 usuários em cada uma.
Vc teria uma tabela boba com 100.000 usuários.

Imagine que você tenha uma tabela minhas_musicas onde cada usuário vai pode gravar de 0 a infinito músicas.

Imagine se cada usuário cadastrar 50 músicas, qual seria a varredura feita no banco para você buscar um registro nessa tabela.

E olha que eu estou dando exemplo bobo. Quer um exemplo parrudo?
Se ativar uma auditoria onde cada ação de cada usuário for salva em uma tabela… Imagina o tamanho dessa tabela?
Sei de um sistema com 150 +ou- usuários onde a tabela de auditoria passa de milhões de registros…

Eu não vejo como boa opção por causa disso, você poderia perder em performance nas tabelas principais.

Realmente se for tudo num servidor só terá que ter um bd para cada empresa, se não vai perder muita performance.

Dá uma olhada nessa discussão sobre o tema:
http://www.tectura.com.br/topics/abordagens_de_multitenant

Minha opinião:

  • O melhor motivo pra separar em bancos diferentes seria segurança simplificada.
    Garantir um where em TODA query lançada ao banco não acho trivial, mas possível mesmo assim.

  • Sobre a performance eu não me preocuparia.
    5k empresas com 20 usuários ou 1 empresa com 100k dá no mesmo.
    A aplicação tem que estar pronta para escalar.

  • Num modelo web, onde novas empresas possam se cadastrar com facilidade, colocar esse id_empresa em cada tabela simplifica muito.

Isso é o modelo multitenant.
Estude toda as opções arquiteturais e veja qual se encaixa melhor com seu cenário.

obrigado pela ajuda de vcs… eu ja tinha começado um sistema em php onde eu coloquei em todas as tabelas um campo chamado idgrupo onde sempre que eu fazia um select eu vereficava se o idgrupo era igual ao do usuario logado… acho q vou seguir como alguns me falarão criar uma base nova para cada nova empresa q se cadastrar, só uma duvida uso o hibernate imagino a seguinte situação onde tem 300 clientes logados na aplicação então era existir 300 conexoes com o banco cada usuario conectado a sua base certo? outra duvida seria de como controlar essas conexoes…

para qm não entendeu minha pergunta ainda ; imagine como se fosse uma conta de email… acho q daria para usar a mesma logica

[quote=michelorth_92]obrigado pela ajuda de vcs… eu ja tinha começado um sistema em php onde eu coloquei em todas as tabelas um campo chamado idgrupo onde sempre que eu fazia um select eu vereficava se o idgrupo era igual ao do usuario logado… acho q vou seguir como alguns me falarão criar uma base nova para cada nova empresa q se cadastrar, só uma duvida uso o hibernate imagino a seguinte situação onde tem 300 clientes logados na aplicação então era existir 300 conexoes com o banco cada usuario conectado a sua base certo? outra duvida seria de como controlar essas conexoes…

para qm não entendeu minha pergunta ainda ; imagine como se fosse uma conta de email… acho q daria para usar a mesma logica[/quote]

Conexão de qualquer aplicação web é controlada via pool…
No seu caso de modelo multitenant vai ter que media boa sim.