O MongoDB é a escolha certa no meu caso? [fechadas]


9

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:

  1. Um usuário se inscreve
  2. Ele está logado
  3. Ele criou sua primeira coleção, onde ele pode criar itens infinitos
  4. 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?


4
As perguntas Matteo sobre recomendações de tecnologia estão fora de tópico, a menos que você nos apresente um problema específico que está tentando resolver. Você precisará nos fornecer um pouco mais de informação sobre seu projeto e por que acha que precisa usar outro banco de dados que não seja o MySQL (que é o que você está familiarizado). Por exemplo: Há algum problema de escalabilidade e quanto tempo você tem para investigar novas tecnologias. Considere revisar sua pergunta e, se o fizer, sinalize-a para atenção com moderação, para que possamos revisar suas edições.
22612 yannis

Respostas:


10

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:

a parte relacional de um banco de dados relacional é muito mais otimizada do que algumas outras partes

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:

O MongoDB (de "humongous") é um sistema de banco de dados NoSQL de código aberto orientado a documentos.

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:

Em princípio, o Hadoop e outros armazenamentos de valor-chave preocupam-se principalmente com estruturas de dados relativamente planas . Ou seja, eles são extremamente rápidos e escaláveis ​​em relação à recuperação de objetos simples, como valores, documentos ou até objetos.

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:

  1. Além disso, você precisa lidar com qualquer entrada que tenha o separador.
  2. A parte do armazenamento relacional de um banco de dados relacional é muito mais otimizada do que a parte correspondente à string. Eu não iria para um esquema em que preciso fazer a correspondência de strings em um banco de dados para obter algum resultado específico. Mais uma vez estou enfatizando:

    a parte relacional de um banco de dados relacional é muito mais otimizada do que algumas outras partes (por exemplo, correspondência de string)

  3. Não use atributos com valores múltiplos. As pessoas geralmente os temem.

principalmente eu ia usar o MongoDB por seu esquema flexível, mas tenho algumas dúvidas, pois ele não tem associação. De qualquer forma, em meu aplicativo eu vou ter um dtabase para os usuários e, em seguida, um creud básica onde cada elemento está associado a um usuário e um conjunto de elementos
Matteo Pagliazzi

Você não precisará ingressar no mongo, mas precisará planejar seu esquema. Pense em termos de objetos em vez de tabelas se você usar o mongo. Então pense em como você acessará seus objetos.
ltfishie

8

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!


esse é o meu primeiro projeto real em trilhos: é um hobby e, por enquanto, não sei se será bem-sucedido ou fracassado, meu primeiro objetivo aqui é conhecer os trilhos, para que eu não possa falar de tráfego. Lê não será primária, eu vou ter também um monte de novas datas e um atualizado ...
Matteo Pagliazzi

11
Uma coisa boa sobre o mongodb é que não há esquema fixo; portanto, para um projeto de hobby, há menos trabalho de configuração. O esquema pode evoluir com o tempo e você não precisa executar a etapa extra de atualizar as tabelas SQL.
22412 Kevin

não tenho certeza sobre o meu -1 ou por que 0 conselho ruim ou discorda?
Michael Durrant

Enfim, se este é seu primeiro projeto em trilhos, eu ficaria com o mySQL. Há muito o que aprender nos trilhos, vale muito mais do que 1 mês quando você começa a fechar as cortinas.
Michael Durrant

@michael ver minha última atualização
Matteo Pagliazzi

3

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 :)


1

Portanto, seu design pode salvar em seu banco de dados dois tipos diferentes de objetos:

  • Objeto de usuário (que sempre possui os campos).
  • Objetos de aplicativos (que podem ter campos diferentes). Um aplicativo pertencerá apenas a um usuário.

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:

  • Você pode criar uma tabela intermediária com todas as informações comuns entre todos os objetos (id, user_id, title, etc) e, em seguida, o tipo, para pesquisá-la em outra tabela apenas com os campos não comuns para esse formato (por exemplo, file_name e file_size para arquivos). Você precisará criar uma tabela diferente para cada formato diferente. Se as duas tabelas forem indexadas por app_id (chave primária), será rápido o suficiente, pois o acesso a uma tabela por um valor indexado é rápido.
  • Você pode codificar os dados em algum formato e armazenar padronizados. Por exemplo, codifique os dados não comuns no JSON como uma sequência e armazene-os em um campo VARCHAR. Tenha cuidado com o tamanho desse campo para não ficar sem espaço. O formato pode ser complexo (JSON) ou simples (apenas valores separados por vírgulas)
  • Você pode criar campos "genéricos" diferentes, como int1, int2, str1, str2, e definir que str1 para um tipo de aplicativo é "file_name", enquanto que para um tipo diferente pode ser "location".

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


Eu não gosto da segunda opção para usar o MySQL para armazenar configurações opcionais porque acho que ela pode carregar cada linha com muitos bytes não necessários ... para a segunda: desacelerará muito meu aplicativo para carregar duas linhas de duas tabelas diferentes para carregar um item?
Matteo Pagliazzi 13/03/12

por favor, veja minha última atualização
Matteo Pagliazzi 13/03/2012

Sobre sua pergunta sobre velocidade, ela não deve ser muito mais lenta (você está acessando-a através de um valor exclusivo indexado). Também editei minha resposta, pois a última proposta editada é semelhante à primeira ideia e adicionei outra opção.
Khelben

1

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:

{_id:"collection1",
 name:"My first Collection",
 owner: "user123243342",
 entries: [
    {type:"video",
     url: "http://www.youtube.com/234324",
     tags: ["roadtrip", "fun", "camera"]
     },
    {type:"map",
     coordinates: [LOC: [38, –102], LOC: [43, –33], LOC: [228, –102]],
     description: "Road trip to nowhere",
 ]
}

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:

  • tabela de usuário + usemeta para usuário
  • post table + postmeta post da tabela

Isso torna a estrutura de dados extremamente flexível e ainda pode ser consultada com velocidade razoável.


eu não gosto da opção de metadados ... mas estou pensando em uma única tabela com campos deixados nulos se não forem usados
Matteo Pagliazzi

A abordagem de tabela única é provavelmente a pior de todas. Embora você possa fazer tudo em uma única consulta, qualquer alteração em qualquer tipo de dados exigirá uma alteração na tabela. E é uma dor no mysql uma vez que sua tabela fica grande.
ltfishie

0

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.