Estou pensando em criar um aplicativo multilocatário usando MongoDB. Não tenho nenhuma estimativa em termos de quantos inquilinos eu ainda teria, mas gostaria de poder chegar aos milhares.
Posso pensar em três estratégias:
- Todos os inquilinos na mesma coleção, usando campos específicos do inquilino para segurança
- 1 coleção por inquilino em um único banco de dados compartilhado
- 1 banco de dados por locatário
A voz na minha cabeça está sugerindo que eu escolha a opção 2.
Pensamentos e implicações, alguém?
mongodb
multi-tenant
Braintapper
fonte
fonte
Respostas:
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:
Eu escolheria a variante 3 se:
Se você postar detalhes adicionais sobre sua inscrição, talvez eu possa lhe dar conselhos mais detalhados.
fonte
Encontrei uma boa resposta nos comentários deste link:
http://blog.boxedice.com/2010/02/28/notes-from-a-production-mongodb-deployment/
Basicamente, a opção nº 2 parece ser a melhor opção.
Citação do comentário de David Mytton:
fonte
Há um artigo razoável no MSDN sobre arquitetura de dados multilocatário que você pode querer consultar. Alguns tópicos principais tocados por este artigo:
Também abordamos alguns padrões de configuração de Software como Serviço (SaaS).
Além disso, vale a pena dar uma olhada em um artigo interessante do pessoal do SQL Anywhere .
Minha opinião pessoal - a menos que você tenha certeza da segurança / confiança aplicada, eu escolheria a opção 3, ou se as questões de escalabilidade proibirem o fallback para a opção 2, no mínimo. Dito isso ... Não sou profissional com MongoDB. Eu fico muito nervoso usando um "esquema" compartilhado - mas ficarei feliz em adiar para praticantes mais experientes.
fonte
Eu escolheria a opção 2.
No entanto, você pode definir a opção de linha de comando mongod.exe --smallfiles. Isso significa que o maior tamanho de arquivo de uma extensão será de 0,5 gigabyte e não 2 gigabyte. Eu testei isso com o mongo 1.42. Portanto, a opção 3 não é impossível.
fonte
De acordo com minha pesquisa no MongoDB. Trucos y consejos. Aplicaciones multitenant. essa opção não é recomendada se você não sabe quantos inquilinos você pode ter, podem ser milhares e seria complicado quando se trata de sharding, imagine também ter milhares de coleções em um único banco de dados ... Então no seu caso. é recomendado usar a opção um. Agora, se você vai ter um número limitado de usuários, já é diferente e sim, você pode usar a opção dois como você pensou.
fonte
Embora a discussão aqui seja sobre NoSQL e principalmente sobre MongoDB, nós da Citus estamos usando PostgreSQL e construindo um banco de dados multi-tenant distribuído / fragmentado.
Nosso guia de caso de uso mostra um aplicativo de exemplo, cobrindo o esquema e vários recursos específicos de multilocação.
Para dados mais não estruturados, usamos a coluna JSONB do PostgreSQL para armazenar esses dados específicos do locatário.
fonte