Tenho o mesmo problema para resolver e também considerando variantes. Como tenho anos de experiência na criação de aplicativos SaaS multi-tenant, também selecionaria a segunda opção com base em minha experiência anterior com bancos de dados relacionais.
Enquanto fazia minha pesquisa, encontrei este artigo no site de suporte do mongodb (adicionado há muito tempo):
https://web.archive.org/web/20140812091703/http://support.mongohq.com/use-cases/multi -tenant.html
Os caras declararam evitar as segundas opções a qualquer custo, o que, pelo que entendi, não é particularmente específico para mongodb. Minha impressão é que isso é aplicável para a maioria dos bancos de dados NoSQL que pesquisei (CoachDB, Cassandra, CouchBase Server, etc.) devido às especificações do design do banco de dados.
Coleções (ou depósitos ou como eles chamam em bancos de dados diferentes) não são a mesma coisa que esquemas de segurança em RDBMS, apesar de se comportarem como contêineres para documentos, eles são inúteis para aplicar uma boa separação de inquilino. Não consegui encontrar o banco de dados NoSQL que pode aplicar restrições de segurança com base em coleções.
Claro que você pode usar a segurança baseada em função mongodb para restringir o acesso no nível do banco de dados / servidor. ( http://docs.mongodb.org/manual/core/authorization/ )
Eu recomendaria a 1ª opção quando:
- Você tem tempo e recursos suficientes para lidar com a complexidade do design, implementação e teste deste cenário.
- Se você não vai ter muitas diferenças na estrutura e funcionalidade do banco de dados para diferentes inquilinos.
- O design do seu aplicativo permitirá que os locatários façam apenas personalizações mínimas no tempo de execução.
- Se você deseja otimizar espaço e minimizar o uso de recursos de hardware.
- Se você vai ter milhares de inquilinos.
- Se você deseja expandir rapidamente e com bom custo.
- Se você NÃO vai fazer backup de dados com base em locatários (mantenha backups separados para cada locatário). É possível fazer isso mesmo nesse cenário, mas o esforço será enorme.
Eu escolheria a variante 3 se:
- Você terá uma pequena lista de inquilinos (várias centenas).
- As especificidades do negócio exigem que você seja capaz de suportar grandes diferenças na estrutura do banco de dados para diferentes locatários (por exemplo, integração com sistemas de terceiros, importação-exportação de dados).
- O design do seu aplicativo permitirá que os clientes (locatários) façam mudanças significativas no tempo de execução do aplicativo (adicionando módulos, personalizando os campos, etc.).
- Se você tiver recursos suficientes para escalar horizontalmente com novos nós de hardware rapidamente.
- Se você for obrigado a manter versões / backups de dados por locatário. Além disso, a restauração será fácil.
- Existem restrições legais / regulatórias que o obrigam a manter diferentes locatários em diferentes bancos de dados (até mesmo centros de dados).
- Se você deseja utilizar totalmente os recursos de segurança prontos para uso do mongodb, como funções.
- Existem grandes diferenças quanto ao tamanho entre os locatários (você tem muitos locatários pequenos e poucos locatários muito grandes).
Se você postar detalhes adicionais sobre sua inscrição, talvez eu possa lhe dar conselhos mais detalhados.