Estou trabalhando em um projeto não Grails usando MongoDB.
Vou te passar algumas das lições que aprendi da pior forma possível.
1) Esqueça o ACID: não necessáriamente você terá no MongoDB. Na realidade, você tem pouquíssimo disto.
2) Pare de pensar em relacionamentos e comece a pensar em agregações. Torna sua vida muito mais fácil.
3) Evite documentos ultra complexos, isto é, com muito documento embutido e, pior ainda, quando você tem listas com documentos embutidos. As consultas ficam muito complicadas e os comandos para editar apenas parte dos documentos se torna infernal.
4) Tire proveito do modelo documental. Você não tem esquema, então pode incluir MUITO MAIS metadados nos seus documentos. Por metadados digo informações que só a lógica interna do seu sistema usa, e que seu usuário sequer precisa saber que existe. Eu tiro muito proveito disto: torna sua vida tão mais simples, que olhar pro relacional de novo fica esquisito.
5) Integridade referencial: crie a sua a mão. MongoDB não tem isto, e as bibliotecas de acesso também não. Eu obtenho integridade por AOP por exemplo, a nível de aplicação.
6) Esqueça lazy loading. Você pode criar relacionamento entre os objetos, mas nas bibliotecas que usei (driver nativo e Spring Data) você sempre carrega o grafo inteiro. E isto é uma merda.
7) Crie índices: as pessoas se esquecem, mas índice não é algo existente só no modelo relacional. Conforme a base de dados cresce, estes se tornam fundamentais.
Falando de MongoDB, caso interesse alguém:
https://education.10gen.com/
Recomendo o MongoDB for developers, é em python =)
Fala Mussato, tudo bem?
Cara, estou começando agora um projeto Grails que usa o mongoDB como uma de suas bases.
O sistema possui um banco relacional convencional para os objetos do negócio, e o mongo entra para servir como base de dados para persistir endereços. O mongo provê algumas funcionalidades pois possui index Geográfico, ou seja, a aplicação persiste no mongo Lat e Long, e depois eu consigo fazer buscas geoespaciais, tais como ponto mais próximo, raio, etc...
Bom, estou usando o GORM para gerenciar isso. Não tirei todo o proveito do mongo, pois uso ele "basicamente" como banco geográfico, então não sei lhe dizer como ele se comporta como base dados única no sistema.
Eu achei muito fácil utilizá-lo com o grails, e o plugin mongo. Pelo que vi na documentação, mesmo que você tenha se documento bem definido (Seu domínio), o plugin lhe permite alterações na estrutura do documento em tempo de execução, que seria tranquilo de fazer fora do Grails.
Como estou no início do projeto, ainda não tenho muitas informações. Mas caso tenha alguma novidade, ou algo bacana, compartilho aqui para vocês!
Em seu projeto o mongo será a única base de dados?
[]'s
Luciano, já deu uma olhada no projeto PostGIS? http://postgis.net/
Ele te fornece funcionalidades de geo referência no modelo relacional se estiver usando o PostgreSQL. Se bobear, facilita sua vida.
Poxa, bacana saber desta dificuldade na instalação Luciano.
Um amigo meu trabalhou com o PostGIS algum tempo atrás e me falou maravilhas a respeito, por isto indiquei. :)
O PostGIS é bem completo, bem robusto. Mas como ele é uma camada sobre o banco, não é tão tranquilo sua instalação. Então, decidi usar um banco simples, eficiente e que conseguisse cobrir o propósito de forma nativa, buscas por geolocalização.
Bom dia Luciano,
Estou cogitando fazer tudo em cima do MongoDB.
Algumas idéias ainda estão meio verdes, e não sei direito como modelar algumas coisas pra tirar o proveito, preciso aprender a pensar diferente ainda hehe
Vou fazer uma tentativa no plugin + GORM e posto a experiência aqui
e muito obrigado pelas dicas!
foram otimos pontos para levar quando estiver desenvolvendo