Vou construir meu primeiro projeto real no Rails, que consiste em um aplicativo da Web composto por três partes principais:
- A parte estática em que nenhum banco de dados é usado
- A parte de registro do usuário que exigirá um banco de dados e eu posso usar o MySQL, pois a linha de cada usuário terá os mesmos campos
- O "App" onde os usuários poderão criar, organizar, editar ... itens em coleções e compartilhá-los com outros usuários
Haverá vários tipos de itens e cada um terá opções diferentes, por exemplo, eu posso ter itens de "vídeo" com as seguintes opções:
- Eu iria
- ID do usuário
- collection_id
- título
- plataforma (se incorporada)
- URL (se incorporado)
- nome do arquivo (se hospedado no meu aplicativo)
- tamanho do arquivo (ID hospedado no meu aplicativo)
e itens de "mapa":
- Eu iria
- ID do usuário
- collection_id
- título
- plataforma (google maps, bing maps ...)
- localização
- url
- tamanho do mapa
Como você pode fazer para os usuários, posso usar o MySQL para itens, a flexibilidade do MongoDB pode ser útil, pois cada item pode precisar de opções diferentes e outro item
Até agora, eu sempre usei PHP e MySQL (sempre em hospedagem compartilhada para pequenos projetos) e escalabilidade é uma palavra totalmente nova para mim.
Tenho tempo para aprender, mas gostaria de poder fazer algo concreto em algo como 1 mês.
Eu li muito sobre MongoDB e NoSQL vs RDMS e MySQL e, depois de experimentá-lo, tenho que dizer que gosto de como o MongoDB funciona: sem tabelas, linhas e documentos JSON da seguinte forma:
- Na minha situação, o que você recomendaria? porque?
- Sobre escalabilidade, pode haver problemas com o MongoDB? se sim, quando (em termos de tamanho do banco de dados) e esses problemas podem tornar meu aplicativo consideravelmente mais lento?
Editar: como o aplicativo funcionará
Como muitos perguntaram isso, é como eu gostaria que o aplicativo funcionasse:
- Um usuário se inscreve
- Ele está logado
- Ele criou sua primeira coleção, onde ele pode criar itens infinitos
- Os itens são de vários tipos e cada tipo precisa de dados diferentes para serem salvos no banco de dados e o tipo de itens pode ser adicionado ou modificado
Os usuários podem criar outras coleções e itens dentro dele.
Portanto, temos CRUD para coleções e itens dentro delas e cada coleção / item é encaminhada para um usuário específico
O principal problema com o MySQL é que ele não possui um esquema flexível, existe uma maneira de resolver isso (uma solução alternativa?)?
Pensando no NoSQL, a única dúvida que tenho é sobre associação, por exemplo, dada uma determinada coleção, eu quero recuperar dados relacionados ao campo Usuário com id = user_id na coleção
EDIT: Idéia para continuar usando o MySQL
Crie um campo na tabela "itens" com configurações opcionais, cada configuração dividida por um | ou outro símbolo.
Em seguida, salvarei em algum lugar uma estrutura das configurações opcionais de cada item, por exemplo, o tipo de item "notes" precisa de duas configurações opcionais "color" e "strange_setting". Quando eu obtiver os dados do MySQL, dividirei o campo para configurações opcionais em um matriz sabendo que o primeiro item da matriz é para "cor" e assim por diante.
O que você acha? há problema com essa solução? Você tem outras idéias?
Respostas:
Talvez não possamos ajudá-lo até que você nos diga o que pretende fazer com o aplicativo. Bancos de dados relacionais são bons para certas coisas, e bancos de dados NoSQL são bons para outros.
Como alguém me disse aqui no SO:
Isso significa que você também pode usar um banco de dados relacional se isso parecer adequado aos seus casos de uso. Não basta ir em frente com o MongoDB devido à sua flexibilidade / escalabilidade. Esta é a primeira linha sobre o MongoDB na Wikipedia:
Você realmente pretende usar um banco de dados orientado a documentos? Se houver alguma graficidade em seus casos de uso, é possível que você vá muito bem a um banco de dados de gráficos como o Neo4j. Ou você pode muito bem usar o melhor do SQL e do NoSQL juntos, como algumas pessoas fazem.
BTW, também estou fazendo um projeto no qual utilizo as melhores partes do SQL e do NoSQL.
EDIT: Eu digo mais uma vez:
Confira o Neo4j vs Hadoop seção sobre este artigo. Diz:
Referindo-se ao mesmo artigo, você realmente precisa de uma estrutura de dados simples para a qual você está indo para o MongoDB? Eventualmente, isso depende dos seus casos de uso detalhados, de como as etapas 3 e 4 serão executadas.
Além disso, convém consultar estas perguntas:
/programming/2124274/mongodb-what-to-know-before-using
/programming/1476295/when-to-use-mongodb-or-other-document-oriented-database-systems
( Confira com certeza a resposta principal / selecionada da segunda pergunta. Você está nesse dilema que isso pode resolver. )
Eu acho que essas perguntas têm todas as informações que você queria saber. No final, é você quem terá que decidir se é MongoDb ou algo mais, podemos apenas recomendar. As únicas pessoas que conhecem seus casos de uso detalhados são você e sua equipe.
EDITAR NOVAMENTE (para a parte MySQL): Como eu o entendi, você está planejando armazenar algo no banco de dados e separá-los através de um separador. Isso apresenta 2 problemas:
fonte
Eu vejo muito essa pergunta. Sempre parece ser considerado um ou outro. O MongoDB é uma ótima ferramenta nova. Às vezes, também parece ser a ferramenta brilhante para tudo e pode ser uma má escolha na minha experiência.
Eu acho que a melhor combinação é definitivamente AMBOS e gostaria de parabenizá-lo por sua abordagem de usar o mylsql para algumas partes, como usuários, mas use o MongoDB para outras, pois eu sinto que a autenticação e a autorização são melhor feitas com o mySQL e existem uma tonelada de exemplos e módulos que fazem isso muito bem.
Para a parte do 'grande número de itens', é nesse ponto que você gostaria de considerar o uso do mongoDB se o seu volume estiver alto e / ou for principalmente leitura e / ou dados não estruturados.
Eu recomendaria não basear sua decisão na flexibilidade sem esquema do Mongo. Os esquemas SQL e SQL surgiram da necessidade de ter dados estruturados e poder executar cálculos e transformações que só são possíveis com essa estrutura. Aprendi isso com 5 anos de trabalho em uma função de armazém de dados. Eu só procuraria no MongoBD o problema de desempenho. Se você está ou espera um grande volume de usuários e solicitações, digamos 100.000 usuários e 20 solicitações por segundo, eu usaria o mongoDB, caso contrário, tentaria permanecer com o sql. Em muitos casos, eu usaria o mySQL para baixo volume e, em seguida, como volume, receita e infraestrutura o suportam, alterne para o Oracle, antes de misturar o mongoDB. Concordo que você não deve tentar lidar com problemas de volume antes de enfrentá-los, no entanto, se tiver uma boa idéia de para onde está indo e não Não é necessário reescrever as coisas até o meio do caminho; faz muito sentido escolher as tecnologias certas logo no início. Lembre-se de que, se você realmente tem esse volume alto, há uma enorme quantidade de opções e tecnologias em todos os níveis da pilha que você procurará usar.
Existem desvantagens nos dados estruturados livremente. Eu uso a analogia do estacionamento aqui. nenhuma linha divisória é excelente para os três primeiros carros que entram, mas, à medida que mais carros entram, muitas desorganizações começam a acontecer e tentar estacionar ou contar facilmente carros e manter as faixas livres se torna um pesadelo. Organizar isso exige trabalho inicial - marcar linhas, divisores e fluxos de tráfego etc., mas vale a pena. Às vezes, as coisas mudam de rumo (os carros ficam maiores) e você precisa fazer algumas mudanças - repintar as linhas. Além disso, apenas o tempo de inatividade padrão para mudanças e manutenção anuais.
O aspecto do design do esquema provavelmente será o maior obstáculo para os usuários tradicionais do mysql. Acho que a página do MongoDb no design de esquema ajuda nisso. Meu ponto final é que toda tecnologia que você adiciona ao mix agrega complexidade. Muitas vezes, existem grandes defensores de qualquer peça que diga que você "precisa" usá-la, mas eu descobri que um fator realmente grande é exatamente quantas peças existem. Implica mais pontos possíveis de falha e, acima de tudo, mais uma base de conhecimento necessária para que alguém mais precise saber para trabalhar nela.
fyi Rick Obsorne tem um diagrama de comparação bastante surpreendente, que é único!
fonte
Eu vejo muitos argumentos válidos aqui para NoSQL vs MySQL. Um link ausente está relacionado à escala: se você realmente deseja escalar e deseja fazê-lo com um banco de dados interno, precisará de MUITO conhecimento sobre bancos de dados. Existem muitas histórias de horror por aí, onde as pessoas falharam ao tentar implementar um sistema que aumentaria infinitamente.
Se você realmente optar por seguir a rota NoSQL (e estiver pronto para assumir os custos que a acompanham - como nenhuma associação), considere o AWS DynamoDB (http://aws.amazon.com/dynamodb/). Aqui você pode esquecer toda a parte de dimensionamento do banco de dados e se concentrar em seu aplicativo. Boa sorte.
Isenção de responsabilidade: sou desenvolvedor da equipe do AWS DynamoDB, mas realmente acredito em nosso produto. Experimente :)
fonte
Portanto, seu design pode salvar em seu banco de dados dois tipos diferentes de objetos:
Uma coleção poderia ou não ser feita como um objeto diferente, pois é apenas uma tag para agrupar aplicativos diferentes. Por uma questão de argumento, digamos que não haja coleções e os usuários tenham apenas uma lista de aplicativos.
Enquanto eu acho que é possível no MySQL, no MongoDB você terá uma maior flexibilidade em termos de estrutura dos objetos de aplicativos, e provavelmente mapeará mais naturalmente sua representação no banco de dados, tornando o código mais simples.
No MySQL, você terá problemas para lidar com diferentes formatos para diferentes aplicativos, mas é possível. Algumas ideias:
No MongoDB, pode ser tão simples quanto usar duas coleções do MongoDB, uma para os usuários e outra para os aplicativos. Supondo algum tipo de limite (que não é o caso, como você descreveu, mas apenas para dizer), você pode até armazenar os aplicativos dentro do objeto de usuário, como uma lista. Armazenar e recuperar os dados é mais natural, pois você pode armazenar qualquer tipo de objeto, independentemente dos campos. Você pode pesquisar por user_id para obter todos os aplicativos que pertencem a um usuário. No MongoDB, você perde de qualquer maneira a possibilidade de fazer consultas de junção, mas, neste caso, acho que as consultas básicas recuperarão o usuário e os aplicativos relacionados ao usuário. Se você planeja fazer várias coisas como "forneça aos usuários que têm mais de duas coleções com três aplicativos ou menos em cada um", será necessário gerá-lo não como uma consulta de junção, mas como um processo no código, será menos natural do que em um banco de dados relacional e poderá levar mais tempo para processar. Se você deseja procurar por parâmetros (por exemplo, me dê todos os aplicativos que pertencem a um usuário em particular; me dê todos os aplicativos do tipo X), isso é bastante fácil no MongoDB e não precisa usar junções.
Não tenho certeza sobre o suporte do MongoDB on Rails. Eu uso em Python e JavaScript.
EDIT: Adicionado comentário sobre o tempo ao acessar duas tabelas e outra opção MySQL
fonte
Eu diria que use a tecnologia que você conhece melhor, especialmente se for um projeto real e você quiser avançar rapidamente. O uso do MySQL e do Mongo virá com seus próprios benefícios e dores de cabeça. Tendo trabalhado com os dois, também acrescentaria que não é muito difícil migrar do MySQL para o Mongo se você seguir bons princípios de design.
Dito isso, um bom motivo para usar o MongoDB no seu caso são os seus dados. Como você mencionou, você terá vários tipos diferentes de entrada para suas coleções: mapa, vídeo e assim por diante. Se você deveria implementar isso usando RDBMS, você tem 3 abordagens:
tabela por tipo: cada tabela contém colunas específicas para cada tipo de objeto
Desvantagens : N consulta para pesquisar em todos os tipos de dados.
Vantagens : bom design OO, de fácil manutenção
tabela única: uma tabela enorme contendo todos os atributos possíveis para todos os tipos, com a maioria nula para qualquer entrada específica
Desvantagens : Alterar para qualquer objeto exigirá alteração da tabela, dolorosa quando a tabela se tornar grande. Difícil de manter.
Vantagens : Fácil de implementar.
tabela principal com metadados: você tem uma única tabela com os atributos principais, como título, datas e uma tabela de metadados com pares de valores-chave para atributos adicionais
Desvantagens : Duas consultas para obter todos os dados para um único objeto.
Vantagens : Extremamente flexível, não muito difícil de implementar.
Eu já usei cada uma dessas abordagens antes e posso dizer que nenhuma é tão natural trabalhar com o Mongo. Seus dados provavelmente serão mais ou menos assim:
Mas você realmente não precisa se preocupar com o design do esquema, pois seus objetos de domínio podem ser diretamente persistidos como tal. O MongoDB é essencialmente o seu armazenamento de objetos que você pode consultar.
Percebi que deixei de fora qualquer discussão sobre a comparação de desempenho entre MySql e Mongodb. Embora você sempre tenha em mente o desempenho, não poderá tomar decisões efetivamente, a menos que conheça o padrão de acesso a dados. Qualquer bom projeto provavelmente passará por algumas iterações de refatoração à medida que cresce e novos desafios surgem. Não se preocupe com o desempenho prematuramente, escolha a ferramenta que você mais conhece e comece a codificar.
Editar
Para responder à sua pergunta específica sobre o uso do MySQL e manter os atributos no mesmo campo usando "|". Não faça isso. Essa abordagem fornecerá mais problemas do que resolve. Primeiro de tudo, você não poderá consultar atributos individuais usando o MySql. Segundo, adiciona muita complexidade à sua camada de acesso a dados. Use a abordagem tipo por tabela ou meta-dados. Se você trabalhou com o WordPress antes, ele usa a abordagem de metadados:
Isso torna a estrutura de dados extremamente flexível e ainda pode ser consultada com velocidade razoável.
fonte
O artigo abaixo fornece bons resultados comparando o MySQL e o MongoDB em termos de seleção, busca e inserção, considerando a quantidade de dados no banco de dados e a quantidade de dados recuperados. Os resultados mostram grande desempenho para o MongoDB em relação às "inserções", mas nos outros casos o MySQL vence. Ver abaixo:
http://www.moredevs.ro/mysql-vs-mongodb-performance-benchmark/
Tive uma experiência usando o MongoDB que considero uma boa solução. Usei-o para inserir milhares de coleções todos os dias. Combinado com a solução Solr (solução de cache, atualizada uma vez por dia), posso recuperar os dados do MongoDB pelo ID da coleção, quando necessário, para não precisar de seleções dinamicamente. Portanto, considerando que você precisa lidar com muitas inserções e não precisa se preocupar em selecionar e buscar, o MongoDB pode ser uma ótima idéia, isso depende de cada caso e faz uma boa análise.
fonte