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"}