Apache CouchDB
NoSQLEn dokumentorienteret NoSQL-database der bruger JSON til data, JavaScript til forespørgsler og HTTP til API.
Foto: Anna Rozwadowska / Unsplash
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