Conectar vários clientes no mesmo banco?

Estou com uma dúvida onde acredito que vocês possam me esclarecer e neste projeto que estou desenvolvendo vou ter um administrador da conta, que vai criar vários outros usuários para esta conta.

###Exemplos:

Empresa 1

  1. João
  2. Pedro
  3. Marcos

Empresa 2

  1. Maria
  2. Juliana

Ou seja, um novo cliente vai acessar o portal e criar uma conta(Empresa) e a partir dela vai adicionar seus usuários. Estava pensando em separar essas empresas em SCHEMAS em um mesmo banco, ou não sei se existe algo mais prático.

Pesquisei sobre o assunto em fóruns e conversa com outros arquitetos, e surgiu o chamado MultiTenancy. Gostaria de saber dos colegas do GUJ, se já passaram por algo assim, e qual seria uma estrutura recomendada, viável e funcional para um caso como este. Se alguém se deparou com essa situação, usou o multiTenancy, ou outro recurso?

Observação: projeto SPRING e PostgreSQL

Olá,
basicamente o MultiTenancy pode ser implementado por base/schema diferente ou por coluna na tabela que identifica de qual empresa é o registro.
Aqui na empresa tbm usamos PostgreSQL e optamos por separar por schemas tbm.
Tem alguns fatores que levaram a essa decisão, por exemplo se vc frequentemente precisa consultar dados de várias empresas, aí é melhor deixar os dados juntos no mesmo banco ou schema e fazer a separação por uma coluna que identifica o registro.

1 curtida

Obrigado pela resposta @Rodrigo_Void.

No meu caso talvez eu nem faça consultas em todas as empresas… porque as empresas serão de clientes distintos.

Neste caso de vocês, por exemplo tenho 10 empresas, é utilizada uma tabela para guardar os usuários e nela ficar armazenado a qual schema ele deverá buscar? ou o Tenancy controla isso de alguma forma?

Temos um outro esquema comum para todos. Dados que são “comuns”(compartilhados por todos) ficam neste esquema.
Ex.: usuários, cadastro das próprias empresas, sessões…

1 curtida

Show!

Ajudou bastante pois não havia visto nenhum relato desta funcionalidade aplicada neste contexto, aí fique na dúvida quanto a se iria se encaixar ou não no modelo.

Grato!

Mais um situação. Por exemplo eu terei o Schema PADRAO.

Neste armazeno só o registro apontando exemplo…

PADRAO.PESSOA_SCHEMA
IDPESSOA, SCHEMA

e nessa tabela teria por exemplo
1, EMP1
2, EMP2
3, EMP3
4, EMP1
5, EMP1

Poderia ser controlado dessa forma, ou você conhece algo que facilite essa operação?

Não entendi

Bom dia @Rodrigo_Void, deixa eu ver se consigo me expressar melhor,

O usuário da empresa 1, não vai acessar dados da 2 porque são empresas totalmente diferentes.

Desta forma eu precisaria que no login por exemplo ele validasse e apontasse para o banco da empresa daquele login. Ex:

Empresa 1 está no schema EMP1 e tem os funcionários Pedro e Maria.
Empresa 2 está no schema EMP2 e tem os funcionarios Jose e Carlos.

Quando e tentar logar imagem o sistema validar em uma tabela do schema de controle, ex. PADRAO.USUARIOS_SCHEMA. E nessa tabela ele apontar em qual schema ele deverá validar aquele usuário, bem como em qual schema esse usuário irá consumir dados. Pois o usuário não pode consumir dados de outros schemas e nem mesmo logar caso esteja inativo.

Grato,

Sim, um cadastro de empresas no schema comum onde tem uma coluna que informa o nome do schema daquela empresa. No login, ou em qualquer situação que criar uma conexão para um usuário logado, precisa setar o schema na connection, ai tudo será buscado somente daqele schema. Cuidar para não qualificar as tabelas nas SQL, só usar o nome dela, não emp1.tabela1. Já para o schema padrão, as tabelas precisam ser chamadas com o nome do schema na frente.

Maravilha!

Muito obrigado pelos esclarecimentos. Serão de grande valia.