我读的关于NoSQL的越多,它就越像听起来像是一个面向列的数据库.
NoSQL(例如CouchDB,Cassandra,MongoDB)和面向列的数据库(例如Vertica,MonetDB)之间有什么区别?
NoSQL是用于Not Only SQL的术语,它涵盖四个主要类别 - 键值,文档,列族和图数据库.
键值 数据库非常适合频繁进行小读写和简单数据模型的应用程序.使用唯一标识记录的密钥存储和检索这些记录,并用于快速查找数据库中的数据.
例如Redis,Riak等.
文档数据库 能够存储不同的属性以及大量数据
例如MongoDB,CouchDB等.
列族数据库专为大量数据,读写性能和高可用性而设计
例如Cassandra,HBase等.
图形数据库是一个数据库,它使用图形结构进行语义查询,其中包含节点,边和属性来表示和存储数据
例如Neo4j,InfiniteGraph等
在了解NoSQL之前,您必须了解一些关键概念.
一致性 - 系统中的所有服务器都将具有相同的数据,因此无论哪个服务器响应其请求,使用该系统的任何人都将获得相同的副本.
可用性 - 系统将始终响应请求(即使它不是最新数据或在整个系统中保持一致,或只是一条消息说系统不工作).
分区容差 - 即使单个服务器出现故障或无法访问,系统仍将继续作为一个整体运行.
大多数情况下,NoSQL数据库只满足三个属性中的两个.
从你的问题,
CouchDB :AP(可用性和分区)和文档数据库
Cassandra:AP(可用性和分区)和列族数据库
MongoDB :CP(一致性和分区)和文档数据库
Vertica :CA(一致性和可用性)和列族数据库
MonetDB : ACID(原子一致性隔离持久性) 和关系数据库
来自:http://blog.nahurst.com/visual-guide-to-nosql-systems
看看这第一条,第二条和PPT的各种场景来选择特定类型的数据库.
一些NoSQL数据库是面向列的数据库,一些SQL数据库也是面向列的.数据库是列还是行是数据库的物理存储实现细节,对于关系数据库和非关系数据库(NoSQL)都是如此.
例如,Vertica是一个面向列的关系数据库,因此它实际上不符合NoSQL数据存储区的要求.
"NoSQL移动"数据存储区更好地定义为非关系型,无共享,水平可伸缩数据库,没有(必然)ACID保证.一些面向列的数据库可以通过这种方式表征.除了列存储,NoSQL实现还包括文档存储,对象存储,元组存储和图形存储.
NoSQL数据库是与传统的基于模式的数据库不同的范例.它们旨在扩展和保存json数据等文档.显然他们有一种查询信息的方法,但你应该期望像eval("person =*and age> 10)这样的语法来检索数据.即使它们支持标准的SQL接口,它们也是用于其他东西的,所以如果你喜欢SQL你应该坚持传统的数据库.
面向列的数据库与传统的面向行的数据库不同,因为它们存储数据的方式.通过将整列存储在一起而不是一行,可以在从包含许多列的行中选择几列时最小化磁盘访问.在面向行的数据库中,如果只选择一行中的一个或所有字段,则没有区别.
你必须支付更昂贵的插件.插入新行将导致许多磁盘操作,具体取决于列数.
但是在SQL,ACID,外键和类似的东西方面与传统数据库没有区别.