← Tilbage til databaser

Apache CouchDB

NoSQL

En dokumentorienteret NoSQL-database der bruger JSON til data, JavaScript til forespørgsler og HTTP til API.

Beskrivelse

CouchDB er en dokumentorienteret database designet fra grunden til web. Den gemmer data som JSON-dokumenter, bruger MapReduce skrevet i JavaScript til forespørgsler og views, og eksponerer alt via en RESTful HTTP API - ingen specielle drivere nødvendige. CouchDB's motto er 'relax' fordi den er designet til at være nem at bruge og distribuere. En af dens stærkeste funktioner er multi-master replikering med automatisk konfliktdetektion og -løsning - perfekt til offline-first mobilapps. CouchDB bruger MVCC (Multi-Version Concurrency Control), som betyder at læsere aldrig blokerer skrivere og omvendt. Den har intet forespørgselssprog som SQL - i stedet definerer du views ved hjælp af MapReduce-funktioner, som prækompileres til inkrementelt opdaterede indekser. CouchDB's arkitektur gør den fremragende til scenarier hvor data skal synkroniseres mellem flere enheder (mobilapps) eller datacentre. PouchDB er en JavaScript-implementation der kan køre i browseren og synkronisere med CouchDB.

Features

  • JSON-dokumentlagring
  • RESTful HTTP API
  • Multi-master replikering
  • Automatisk konfliktdetektion
  • MVCC (ingen låse)
  • MapReduce views
  • Ændringsfeed-notifikationer
  • Understøttelse af vedhæftede filer (binære filer)

Query Eksempel

// CouchDB bruger HTTP API og MapReduce views

// 1. Opret database (HTTP PUT)
PUT http://localhost:5984/products

// 2. Indsæt document (HTTP POST)
POST http://localhost:5984/products
Content-Type: application/json

{
  "_id": "laptop-001",
  "type": "product",
  "name": "Lenovo ThinkPad",
  "price": 8999,
  "category": "laptops",
  "stock": 25,
  "tags": ["electronics", "computers"]
}

// 3. Hent document (HTTP GET)
GET http://localhost:5984/products/laptop-001

// 4. Definer view med MapReduce (design document)
PUT http://localhost:5984/products/_design/products
{
  "_id": "_design/products",
  "views": {
    "by_category": {
      "map": "function(doc) { if (doc.category) { emit(doc.category, doc.price); } }",
      "reduce": "_sum"
    },
    "by_price": {
      "map": "function(doc) { if (doc.price) { emit(doc.price, doc); } }"
    },
    "expensive_products": {
      "map": "function(doc) { if (doc.price > 5000) { emit(doc.name, doc.price); } }"
    }
  }
}

// 5. Query view
GET http://localhost:5984/products/_design/products/_view/by_category

// 6. Query med parameters
GET http://localhost:5984/products/_design/products/_view/by_category?key="laptops"

// 7. Range query
GET http://localhost:5984/products/_design/products/_view/by_price?startkey=5000&endkey=10000

// 8. Update document
PUT http://localhost:5984/products/laptop-001
{
  "_id": "laptop-001",
  "_rev": "1-967a00dff5e02add41819138abb3284d",
  "type": "product",
  "name": "Lenovo ThinkPad",
  "price": 7999,
  "category": "laptops",
  "stock": 20
}

// 9. Delete document
DELETE http://localhost:5984/products/laptop-001?rev=2-abc123...

// 10. Continuous changes feed
GET http://localhost:5984/products/_changes?feed=continuous

// JavaScript (Node.js) example med nano library
const nano = require('nano')('http://localhost:5984');
const db = nano.db.use('products');

// Insert
await db.insert({
  name: 'MacBook Pro',
  price: 15999,
  category: 'laptops'
});

// Query view
const result = await db.view('products', 'by_category', {
  key: 'laptops'
});

console.log(result.rows);

Anvendelsesområder

  • Offline-first mobilapplikationer
  • Datasynkronisering på tværs af enheder
  • Indholdsstyringssystemer
  • Brugerprofil- og indstillingslagring
  • Distribuerede systemer med eventual consistency

Fordele

  • Ingen specielle drivere - bare HTTP
  • Fremragende offline/sync-kapabiliteter
  • Skemafri fleksibilitet
  • Indbygget replikering og clustering
  • Webvenlig (JavaScript, JSON, HTTP)

Ulemper

  • MapReduce kan være komplekst
  • Ikke optimal til komplekse forespørgsler
  • Views skal prædefineres
  • Langsommere end nogle andre NoSQL-databaser
  • Begrænset ad hoc-forespørgselssupport

Bedst til

  • Offline-first mobilapps med synkronisering
  • Applikationer på flere enheder
  • Indholdsstyring med versionering
  • Distribuerede systemer med eventual consistency
  • Webapplikationer (JavaScript-stak)

Ikke anbefalet til

  • Komplekse relationelle forespørgsler
  • ACID-transaktioner på tværs af dokumenter
  • Realtidsanalyser
  • Højfrekvenshandelssystemer
  • Applikationer der kræver stærk konsistens

Relaterede databaser

MongoDBPouchDBCouchbaseRavenDB