1
resposta

Tentando pensar de forma não relacional.....

Olá pessoal, gostaria de uma dica conceitual mesmo...

vamos lá!

Imaginem que eu tenha no bom e velho Oracle (DB de macho!) três tabelas Cliente, Fornecedores e Endereços, no meu caso eu provavelmente teria uma sequence e ao cadastrar um Cliente ou Fornecedor eu usaria o ID dele para amarrar à tabela de endereço, quando entro no Mongo fico meio perdidão, não sei se eu deveria ter a Entidade Cliente com seus 1..N endereços como Array de endereços, no caso o mesmo se repete para os Fornecedores, ou devo fazer uma coleção chamada endereços e amarrar com o cliente, como se fosse no modelo relacional, logo surgem algumas dúvidas:

1) Entendo que cada elemento da coleção Clientes e da coleção Fornecedores terão seus ID automáticos, caso eu utilizasse uma coleção Endereços e dentro de cada elemento desta coleção eu fizesse a amarração pelo ID do Cliente ou Fornecedor para saber quem é o dono daquele endereço, eu tenho alguma garantia que não terei conflitos de ID entre as coleções Clientes e Fornecedores? Tenho que criar um gerador de IDs compartilhado?

2) Qual seria a abordagem recomendada? Meu feeling seria criar um modelo chamado Endereço e tanto os Clientes quanto Fornecedores terão um atributo chamado Endereços que será um Array do tipo Endereço.

Fico inseguro de como seria a manutenção disto se eu precisar colocar um campo adicional em todos os elementos, etc...

Obs. Ainda não terminei o curso, mas antes de terminar gostaria de não acumular muitas dúvidas e ficar perdido...

Quanto a operação básica estou tranquilo, o curso esta passando uma boa base.

Desde já obrigado.

1 resposta

Oi Mauricio, tudo bem? Primeiro, como a gerar dos IDs não obedecem uma ordem específica como os sequences dos oracle, você tem pelo menos duas vantagens ai: você não vai ter aquelas lacunas de números na sequência que não foram utilizados, ou foram removidos e tal, e não vai depender de uma sequência. Como o ID será aleatório e automático, você não precisará controlar isso.

O ID (ObjectID) na verdade não é tãoooo aleatório assim, ele considera várias coisas pra chegar naquele número. Primeiro que são uma sequência de 12 bytes (12 caracteres) e entre eles estão um contador números aleatórios, o número do processe atual, unix time etc. Da pra ver direitinho aqui: https://docs.mongodb.com/manual/reference/method/ObjectId/

Você pode ter conflito? Eu vou dizer que acredito que sim, mas essa possibilidade é beemmmm remota.

Sobre o seu segundo ponto, eu seguiria essa mesma linha.

Sobre o terceiro ponto, acredito que insegurança seja normal no começo do uso de qualquer ferramenta. Quanto a questão de adicionar um novo campo, o Mongo será flexível a isso, o seu modelo é quem dita o que vai ou não pra lá.

Em relação aos endereços, você não precisa ter uma coleção específica para isso. O endereço no modelo pode ser uma classe separada, com atributos nas outras classes, mas no mongo, a coleção Cliente e Fornecedor, podem refletir esse mesmo cenário, cada registro de cada coleção terão seu próprio endereço, podendo ter particularidades próprias ou não.

Espero ter ajudado!