Saudações companheiros! Preciso da opinião de vocês neste assunto, pois, está gerando muita polêmica por aqui.
Existe alguma informação espalhada pela web sobre o assunto, mas, gostaria de focar o assunto aqui em Java, para saber qual seria a melhor abordagem.
Generalizando, podemos dizer que existem 3 formas de implementar um SaaS.
Forma 1: Usar um só conjunto de tabelas no banco de dados sendo que todas possuem um campo “id_tenant” usado para separar as informações dos clientes. Essa forma é muito prática pois torna a manutenção do sistema muito fácil por existir apenas uma instância e um banco de dados, porém, deixa o sistema nas mãos da integridade referencial do banco de dados, cabendo a ela separar os dados dos usuários.
Forma 2: Bancos de dados tipo o Oracle e o PostgreSql permitem criar Sets de tabelas (Schemas), ou seja, cada tenant teria um conjunto de tabelas próprio, isolando seus dados. A vantagem é que não precisaria depender da integridade referencial para isolar os usuários, porém, tornaria a manutenção mais trabalhosa, pois a cada modificação no banco de dados, todos os Schemas teriam que ser alterados
Forma 3: Criar um banco de dados para cada tenant. Fornece isolamento total, mas, em questões de infra-estrutura nos hosts torna menos rentavel, além é claro, de trazer o mesmo problema da forma 2.
Gostaria da opinião dos companheiros em relação a essas abordagens no que diz respeito a um sistema desenvolvido JPA(EclipseLink, Hibernate, TopLink, o que preferirem…).
Qual destas formas o Java receberia mais amigavelmente?