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
- João
- Pedro
- Marcos
Empresa 2
- Maria
- 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?
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.