MVCC(Multiversion concurrency control)
javascript
CouchDB一個支持多版本控制的系統,此類系統一般支持多個結點寫, 而系統會檢測到多個系統的寫操做之間的衝突並以必定的算法規則予以解決。java
水平擴展性mysql
在擴展性方面,CouchDB使用replication去作。
CouchDB的設計基於支持雙向的複製(同步)和離線操做。 這意味着多個複製可以對同一數據有其本身的拷貝,能夠進行修改,以後將這些變動進行同步。web
REST API(Representational State Transfer,簡稱REST,表述性狀態轉移)算法
全部的數據都有一個惟一的經過HTTP暴露出來的URI。
REST使用HTTP方法 POST,GET,PUT和DELETE來操做對應的四個基本 CRUD(Create,Read,Update,Delete)操做來操做全部的資源。sql
數據查詢操做數據庫
CouchDB不支持動態查詢,你必須爲你的每個查詢模式創建相應的視圖,並在此視圖的基礎上進行查詢。
視圖是CouchDB中文檔的呈現方式,在CouchDB 中保存的是視圖的定義。
CouchDB 中有兩種視圖:永久視圖和臨時視圖。 永久視圖保存在設計文檔的views字段中。 若是須要修改永久視圖的定義,只須要經過文檔 REST API 來修改設計文檔便可。 臨時視圖是經過發送 POST 請求到 URL/dbName/_temp_view 來執行的。在POST請求中須要包含視圖的定義。 通常來講,臨時視圖只在開發測試中使用,由於它是即時生成的,性能比較差; 永久視圖的運行結果能夠被 CouchDB 緩存,所以通常用在生產環境中。緩存
原子性curl
支持針對行的原子性修改(concurrent modifications of single documents),但不支持更多的復瑣事務操做。性能
數據可靠性
CouchDB是一個」crash-only」的系統,你能夠在任什麼時候候停掉CouchDB並能保證數據的一致性。
最終一致性
CouchDB保證最終一致性,使其可以同時提供可用性和分割容忍。
離線支持
CoucbDB可以同步複製到可能會離線的終端設備(好比智能手機),同時當設置再次在線時處理數據同步。 CouchDB內置了一個的叫作Futon的經過web訪問的管理接口。
mysql
經過show查詢,示例以下:
show databases; 返回結果: +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | test | +--------------------+
couchDB
經過GET請求訪問URL/_all_dbs能夠獲取數據庫列表。
示例以下:
curl -X GET http://127.0.0.1:5984/_all_dbs 返回結果: ["_replicator","_users","db1","db2"]
mysql
經過create語句實現,示例以下:
create database testdb;
couchDB
經過PUT請求訪問URL/dbName能夠建立名稱爲dbName的數據庫。
示例以下:
curl -X PUT http://127.0.0.1:5984/testdb 返回結果: {"ok":true}
mysql
經過create語句實現,示例以下:
create table tb1( id int, name varchar(20) );
couchDB
沒有表的概念,數據直接以文檔的形式存儲在數據庫中,每一個數據庫是一個獨立的文檔集合。
mysql
經過insert語句實現,示例以下:
insert into tb1 (id,name) values (1,'mike');
couchDB
經過PUT請求訪問 URL/dbName/doc_id 能夠在名稱爲dbName的數據庫中建立ID爲doc_id的文檔。
經過POST請求訪問 URL/dbName/ 也能夠建立新文檔,不過是由 CouchDB 來生成文檔的ID。
好比經過PUT方法添加uuid爲1925a2a284289df9b55b390525001ca1文檔到數據庫:
curl -X PUT http://127.0.0.1:5984/testdb/1925a2a284289df9b55b390525001ca1 -d '{"id":1,"name":"mike"}' 返回結果: {"ok":true,"id":"1925a2a284289df9b55b390525001ca1","rev":"1-0c1f72feabb29905ed205d25fbcbf3b3"}
mysql
一、單條數據查詢
經過select語句實現,示例代碼:
select * from tb1 where id =1; 查詢結果: +------+------+ | id | name | +------+------+ | 1 | Mike | +------+------+
二、多條數據查詢
經過select語句實現,示例代碼:
select * from tb1 where id > 1; 查詢結果: +------+------+ | id | name | +------+------+ | 2 | mike | | 3 | mike | +------+------+
三、查詢該表全部數據
經過select語句實現,示例代碼:
select * from tb1;
查詢結果: +------+------+ | id | name | +------+------+ | 1 | Mike | | 2 | mike | | 3 | mike | +------+------+
couchDB
一、單條數據查詢
經過GET請求訪問 URL/dbName/doc_id 能夠獲取名稱爲dbName的數據庫中ID爲doc_id文檔的內容。
文檔的內容是一個JSON對象,其中以「 _ 」做爲前綴的頂層字段是由CouchDB保留使用的,如_id和_rev。
示例以下:
curl -X GET http://127.0.0.1:5984/testdb/1925a2a284289df9b55b390525001ca1 返回結果: {"_id":"1925a2a284289df9b55b390525001ca1","_rev":"2-1b70c2faffc36cde06f29f16580ae668","name":"Mike"}
二、多條數據查詢
couchDB經過視圖進行查詢。
示例以下:
建立視圖: { "_id": "_design/example", "language": "javascript", "views": { "getdata": { "map": "function(doc){ if(doc.id>1){emit(doc.id, doc.name)}}" } } } 執行查詢: curl -X GET http://127.0.0.1:5984/testdb/_design/example/_view/getdata 返回結果: {"total_rows":2,"offset":0,"rows":[ {"id":"25e1a898ee71465309b209d8e9036a73","key":2,"value":"mike"}, {"id":"25e1a898ee71465309b209d8e9037a05","key":3,"value":"mike"} ]}
三、查詢全部文檔
方法一:
經過視圖進行查詢。
示例以下:
建立視圖: { "_id": "_design/example", "language": "javascript", "views": { "getall": { "map": "function(doc){ emit(doc.id, doc.name)}" } } } 執行查詢: curl -X GET http://127.0.0.1:5984/testdb/_design/example/_view/getall 返回結果: {"total_rows":3,"offset":0,"rows":[ {"id":"1925a2a284289df9b55b390525001ca1","key":1,"value":"mike"}, {"id":"25e1a898ee71465309b209d8e9036a73","key":2,"value":"mike"}, {"id":"25e1a898ee71465309b209d8e9037a05","key":3,"value":"mike"} ]}
方法二:
couchDB沒有表的概念,能夠經過GET請求訪問 URL/dbName/_all_docs 查詢某個庫中的全部文檔。
該命令也只能列出該數據庫中全部的key列表,具體數據的查詢須要從新進行GET操做。
示例以下:
curl -X GET http://172.16.10.2:5984/testdb/_all_docs 返回結果: {"total_rows":2,"offset":0,"rows":[ {"id":"1925a2a284289df9b55b390525001ca1","key":"1925a2a284289df9b55b390525001ca1","value":{"rev":"2-1b70c2faffc36cde06f29f16580ae668"}}, {"id":"dae18eb4f907f706d92666223d003c94","key":"dae18eb4f907f706d92666223d003c94","value":{"rev":"1-967a00dff5e02add41819138abb3284d"}} ]} curl -X GET http://127.0.0.1:5984/testdb/1925a2a284289df9b55b390525001ca1 curl -X GET http://127.0.0.1:5984/testdb/dae18eb4f907f706d92666223d003c94
mysql
經過update語句實現,示例以下:
update tb1 set name='Mike' where id = 1;
couchDB
經過PUT請求訪問 URL/dbName/doc_id 能夠更新已有的文檔。
在PUT請求內容的文檔中須要包含_rev字段,表示文檔的修訂版本號。
CouchDB使用該字段來作更新時的衝突檢測。
若是該字段的值與 CouchDB 中保存的該文檔的修訂版本號一致,則代表沒有衝突,能夠進行更新。
當更新完成以後,返回 HTTP 狀態代碼 201 ;
不然返回 HTTP 狀態代碼 409,表示有版本衝突。
好比更新uuid爲1925a2a284289df9b55b390525001ca1文檔:
curl -X PUT http://127.0.0.1:5984/testdb/1925a2a284289df9b55b390525001ca1 -d '{"_rev":"1-0c1f72feabb29905ed205d25fbcbf3b3","id":1,"name":"Mike"}' 返回結果: {"ok":true,"id":"1925a2a284289df9b55b390525001ca1","rev":"2-dd2a105c56897b5b55cb1fa15331071a"}
mysql
經過delete語句實現,示例以下:
delete from tb1 where id = 1;
couchDB
經過DELETE請求訪問 URL/dbName/doc_id?rev=rev_id能夠刪除數據庫databasename中 ID 爲doc_id,而且修訂版本號爲rev_id的文檔。
示例以下:
curl -X DELETE http://127.0.0.1:5984/testdb/1925a2a284289df9b55b390525001ca1?rev=2-dd2a105c56897b5b55cb1fa15331071a 返回結果: {"ok":true,"id":"1925a2a284289df9b55b390525001ca1","rev":"3-aa8b9d239a4a42e78483dc1d6f424f71"}