← Tilbage til databaser

ArangoDB

NoSQL

En native multi-model database der kombinerer document, graph, og key-value data models i én unified query language.

Beskrivelse

ArangoDB er unik fordi den er en native multi-model database - i stedet for at vælge mellem document, graph, eller key-value database, får du alle tre i én. Data gemmes som JSON documents i collections, men du kan også definere edges (connections) mellem documents for at lave property graphs. Dette betyder du kan køre document queries, graph traversals, og key-value lookups alt sammen i samme database med samme query language (AQL - ArangoDB Query Language). AQL ligner SQL men med extensions til graph traversals og document manipulation. ArangoDB understøtter ACID transactions, sekundære indexes, full-text search, og geospatial queries. Den kan deployes som single-server eller distributed cluster med automatic sharding og replication. Foxxes er microservices der kører direkte i databasen og giver dig mulighed for at skrive custom APIs i JavaScript. ArangoDB's multi-model approach er perfekt til komplekse domæner hvor data naturligt har både hierarkiske (documents) og relationelle/network (graphs) strukturer.

Features

  • Multi-model (document, graph, key-value)
  • AQL query language
  • ACID transactions
  • Graph traversals
  • Full-text search
  • Geospatial queries
  • Foxx microservices
  • Distributed clustering

Query Eksempel

// ArangoDB Query Language (AQL)

// 1. Opret collections
db._create("users");
db._createEdgeCollection("follows");
db._create("posts");

// 2. Indsæt documents
db.users.insert({
  _key: "peter",
  name: "Peter Hansen",
  email: "peter@email.dk",
  age: 30
});

db.users.insert({
  _key: "maria",
  name: "Maria Nielsen",
  email: "maria@email.dk",
  age: 28
});

// 3. Opret edge (graph relation)
db.follows.insert({
  _from: "users/peter",
  _to: "users/maria",
  since: "2024-01-01"
});

// 4. Document query (like MongoDB)
FOR user IN users
  FILTER user.age > 25
  SORT user.name ASC
  RETURN user

// 5. Graph traversal
FOR vertex, edge, path IN 1..3 OUTBOUND "users/peter" follows
  RETURN {
    user: vertex.name,
    connection: edge,
    depth: LENGTH(path.edges)
  }

// 6. Find friends of friends
FOR user IN users
  FILTER user._key == "peter"
  FOR friend IN 2..2 OUTBOUND user follows
    FILTER friend._key != user._key
    RETURN DISTINCT friend.name

// 7. JOIN-like query
FOR post IN posts
  LET author = FIRST(
    FOR user IN users
      FILTER user._key == post.authorId
      RETURN user
  )
  RETURN {
    title: post.title,
    authorName: author.name
  }

// 8. Aggregation
FOR user IN users
  COLLECT ageGroup = FLOOR(user.age / 10) * 10
  AGGREGATE count = LENGTH(1)
  RETURN {
    ageGroup: ageGroup,
    count: count
  }

// 9. Shortest path (graph algorithm)
FOR path IN OUTBOUND SHORTEST_PATH
  "users/peter" TO "users/anders"
  follows
  RETURN path

// 10. Full-text search
FOR doc IN FULLTEXT(posts, "content", "database")
  RETURN doc

// JavaScript Driver
const { Database, aql } = require('arangojs');

const db = new Database({
  url: 'http://localhost:8529'
});
db.useDatabase('mydb');
db.useBasicAuth('root', 'password');

// Insert document
const users = db.collection('users');
await users.save({
  _key: 'john',
  name: 'John Doe',
  email: 'john@email.com'
});

// Query with AQL
const cursor = await db.query(aql`
  FOR user IN users
    FILTER user.age > ${25}
    RETURN user
`);

const result = await cursor.all();
console.log(result);

// Create edge
const follows = db.collection('follows');
await follows.save({
  _from: 'users/peter',
  _to: 'users/john',
  since: new Date().toISOString()
});

// Graph traversal
const traversal = await db.query(aql`
  FOR vertex IN 1..2 OUTBOUND ${'users/peter'} follows
    RETURN vertex.name
`);

const friends = await traversal.all();
console.log(friends);

// Transaction
const trx = await db.beginTransaction({
  write: ['users', 'posts']
});

try {
  await trx.step(() => 
    users.save({ name: 'Transaction User' })
  );
  
  await trx.step(() => 
    db.collection('posts').save({ title: 'Post' })
  );
  
  await trx.commit();
} catch (err) {
  await trx.abort();
}

// Named graph creation
const graph = db.graph('social_network');
await graph.create({
  edgeDefinitions: [{
    collection: 'follows',
    from: ['users'],
    to: ['users']
  }]
});

// Foxx microservice (runs in database)
// manifest.json
{
  "name": "my-api",
  "version": "1.0.0",
  "engines": {
    "arangodb": "^3.0.0"
  }
}

// index.js
const { context } = require('@arangodb/locals');
const router = context.createRouter();

router.get('/users', (req, res) => {
  const users = db._query(
    'FOR user IN users RETURN user'
  ).toArray();
  res.json(users);
});

Anvendelsesområder

  • Social networks (users som documents, connections som graphs)
  • Recommendation engines
  • Fraud detection (graph analysis)
  • Content management med komplekse relationer
  • Knowledge graphs

Fordele

  • Én database for multiple data models
  • Kraftfuld graph traversal capabilities
  • Fleksibel query language (AQL)
  • ACID transactions across models
  • God performance til både document og graph queries

Ulemper

  • Mindre community end MongoDB eller Neo4j
  • Learning curve for AQL
  • Overhead fra multi-model support
  • Færre managed cloud offerings
  • Documentation kan være fragmenteret

Bedst til

  • Social networks med graph relationships
  • Fraud detection systems
  • Recommendation engines
  • Knowledge management systems
  • Master data management

Ikke anbefalet til

  • Simple CRUD apps (overkill)
  • Pure key-value workloads (brug Redis)
  • Pure document storage (brug MongoDB)
  • Pure graph (brug Neo4j hvis kun graph)
  • Teams uden graph database erfaring

Relaterede databaser

MongoDBNeo4jOrientDBDgraphJanusGraph