ArangoDB em um projeto real

ArangoDB é um banco de dados híbrido (documento e gráfico). Seus aspectos positivos incluem:







  • linguagem de consulta poderosa e conveniente AQL
  • JOIN (ainda mais poderoso do que bancos de dados relacionais)
  • replicação e fragmentação
  • ACID (funciona no cluster apenas na versão paga)


Recursos menos essenciais, mas não menos convenientes:







  • busca difusa
  • Motor de microsserviços Foxx integrado ao banco de dados
  • trabalhar no modo de assinatura para alterações no banco de dados


Para ser justo, também observarei as desvantagens:







  • sem ODM
  • baixa popularidade (em comparação com MongoDB, por exemplo)


Depois de analisar as capacidades do ArangoDB e, especialmente, depois de superar as deficiências nas versões mais recentes (como uma queda acentuada no desempenho quando o tamanho da coleção de RAM disponível é excedido) e o aparecimento de novos recursos (como pesquisa difusa) , é hora de testá-lo em um aplicativo real.







Recursos de AQL (ArangoDB Query Language)



Uma das principais questões que me preocupava era se a expressividade do AQL seria suficiente para executar toda a gama de consultas em uma aplicação real. E funcionará sem ORM / ODM ser confortável o suficiente.







Existem várias maneiras no ArangoDB de consultar dados. Existe uma API orientada a objetos que é familiar para aqueles que trabalham com MongoDB, mas este método é considerado obsoleto no ArangoDB e a ênfase principal está nas consultas AQL.







A consulta mais simples para uma coleção tem a seguinte aparência:







db.query({
  query: `for doc in managers
    filter doc.role == @role
    sort doc.@field @order
    limit @page * @perPage, @perPage
    return doc`,
  bindVars: { role, page, perPage, field, order },
});
      
      





, FOR, , , , role .







, . mongoose (MongoDB) populate(). ArangoDB AQL:







db.query({
   query: `
      for mall in malls
        for city in cities
          filter mall.cityId == city._key
      return merge(mall, { city })
  `,
  bindVars: { },
});
      
      





INNER JOIN. , city , , SQL.







LEFT JOIN — LET:







db.query({
  query: `
    for city in cities
      let malls=(
        for mall in malls
          filter mall.cityId==city._key
          return mall
      )
    return merge(city, {malls})`,
  bindVars: { },
});
      
      





malls array null. , LEFT JOIN SQL — , city, mall. mall . , . "" , SQL, , .







, . , , , , , SQL. - NoSQL , .









- ArangoDB . : _from _to. , . .







- . , update . . , .









: , . , Elacticsearch. . -, Elasticsearch. , , . , -, Elasticsearch , .







ArangoDB SEARCH VIEW :







  await db.createAnalyzer('fuzzy_brand_search_bigram', {
    type: 'ngram',
    properties: { min: 2, max: 2, preserveOriginal: true },
    features: ['position', 'frequency', 'norm'],
  });
  await db.createView('brandSearch', {
    links: {
      brands: {
        includeAllFields: true,
        analyzers: ['fuzzy_brand_search_bigram'],
      },
    },
  });
      
      





:







db.query({
    query: `
       for brand in brandSearch
          search NGRAM_MATCH(
              brand.name, 
              @brandName, 
              0.4, 
              'fuzzy_brand_search_bigram'
          )
          filter brand.mallId == @mallId
        return brand `,
    bindVars: { mallId, brandName },
});
      
      





ODM?



, , MongoDB ODM. , .







, , , AQL, . , Sequelize (ORM ), - RAW .







, , , ODM. , ODM ArangoDB. ODM . , ODM , . , , , .







, , . . - PATCH , , , . . , -, . issue . , , . , . .







Em meu artigo, descrevi e implementei minha biblioteca. Eu usei em um projeto real. Claro, houve momentos de estresse quando descobrimos que os recursos desta biblioteca não eram suficientes. Mas eles estavam quase todos resolvidos. Ainda assim, convido à cooperação aqueles que desejam promover a tecnologia ArangoDB.







apapacy@gmail.com

15 de março de 2021








All Articles