MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Projeto de esquema do MongoDB:sempre há um esquema

Design de esquema do MongoDB

Quando o MongoDB foi lançado há alguns anos, um dos recursos importantes divulgados era a capacidade de ser “sem esquema” – O que isso significa para seus documentos?


O design do esquema MongoDB não impõe nenhum esquema nos documentos armazenados em uma coleção. O MongoDB armazena essencialmente documentos JSON e cada documento pode conter qualquer estrutura que você desejar. Considere alguns exemplos de nossa coleção de “contatos” abaixo. Aqui está um documento que você pode armazenar:

{
  'name':'user1',
  'address':' 1 mountain view',
  'phone': '123-324-3308',
  'SSN':'123-45-7891'
}

Agora o segundo documento armazenado na coleção pode ser deste formato:
{
  'name': ' user2',
  'employeeid': 546789
}

É muito legal que você possa armazenar esses dois documentos na mesma coleção. O problema, no entanto, começa quando você precisa recuperar esses documentos da coleção. Como você sabe se o documento recuperado contém o formato 1 ou o formato 2? Você pode verificar se o documento recuperado contém o campo 'ssn' e tomar uma decisão. Outra opção é armazenar o tipo do documento no próprio documento:

{
  'type': xxx,
  'name': ....
  ...
}

Em ambos os casos, o que você conseguiu foi mover a imposição do esquema do banco de dados para o aplicativo -

Há sempre um esquema, é apenas uma questão de onde ele é implementado.

Se você tiver os índices corretos, isso alivia o problema até certo ponto. Se a maioria de suas consultas for por ‘employeeid’, você sabe que o documento recuperado é sempre do segundo formato – porém, o restante do seu código que não usa esse índice ainda terá o problema mencionado acima. Além disso, se você estiver usando um ODM como o mongoose, ele automaticamente já aplica um esquema para você no MongoDB.

Existem vários aplicativos que se beneficiam dessa flexibilidade. Um cenário que vem à mente é o caso de um esquema onde há vários campos/colunas opcionais. No MongoDB, não há penalidade por ter algumas colunas ausentes. Cada documento pode conter apenas os campos necessários.

Validação do documento


A partir da versão 3.2.x, o MongoDB agora suporta o conceito de validação de esquema usando a construção “validator”. Isso fornece muitos níveis de validação – para que você possa escolher o nível que funciona para você. O comportamento padrão se você não usar o validador é o comportamento anterior sem esquema. Normalmente você criará os “validadores” no momento da criação da coleção
db.createCollection( "contacts",
   { validator: { $or:
      [
         { employeeid: { $exists: true }},
         { SSN: { $exists: true } }
      ]
   }
} )
Crie validações de esquema no MongoDB para que você possa escolher o nível necessárioClique para Tweet

Coleções existentes


As coleções existentes podem ser atualizadas usando o comando ‘collMod’:
db.runCommand( {
  collMod: "contacts”,
  validator: { $or: [ { employeeid: { $exists: true }}, { SSN: { $exists:true} } ] }
} )

Nível de validação

O MongoDB suporta o conceito de ‘ValidationLevel’. O nível de validação padrão é 'estrito', o que significa que inserções e atualizações falham se o documento não atender aos critérios de validação. Se o nível de validação for ‘Moderado’, ele aplica a validação aos documentos existentes que atendem aos critérios de validação. Os documentos que existem atualmente e não atendem aos critérios não são validados. Embora conveniente, o nível de validação 'Moderado' pode causar problemas no futuro - por isso, ele precisa ser usado com cuidado.

Ação de validação

Por padrão, a ação de validação é 'Erro'. Se o seu documento falhar na validação, é um erro e a atualização/inserção falha. No entanto, você também pode definir a ação de validação para 'avisar' que basicamente registra a violação de esquema no log , mas não falha na inserção.

Quais exemplos de design de esquema ajudariam você em seu próximo projeto, informe-nos!