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?
, , , 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