Apache CouchDB
NoSQLEn 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