RDBMS构建的先决条件是,数据的属性可以预先定义好,它们之间的相互关系非常固定而且被系统的引用。
面向列的有序存储
与RDBMS面向行的存储不同,Google Bigtable数据支持面向列的存储,如果列值不存在,就不会存储,避免因为null造成的浪费。
每个数据单元看做一组键值对集合,单元通过主标识符标识,主标识符又称为主键,或者称为行健(row-key)
假设存储联系人的信息,包括:名字、姓名、职业等
first_name: John
last_name: Doe
zip_code: 10001
gender: male
另一组数据
first_name: Jane
zip_code: 94303
第1条数据的行健为1,第2条的行健为2.
在类Bigtable的面向列存储中,数据按列族(column-family)存储。
如上面的first_name
和last_name
是列族name的成员。
列族通常需要在配置或启动时定义好,而列则不需要预先定义或声明。
HBase
而HBase是以Google Bigtable为蓝本创建的开源的有序列族存储,其中的数据可以通过MapReduce处理。
HBase由Java实现,存在Thrift、Avro、REST和protobuf客户端。
Hypertable
Hypertable是由C++实现,使用Google RE2正则表达式类库,承诺性能高于HBase。
它支持Thrift,HQL是一种用于查询Hypertable的类SQL抽象。
键/值存储
哈希表(HashMap)或关联数组(associative array)是可以容纳键/值对的最简数据结构。
Oracle的Berkeley DB键/值存储是纯粹的存储引擎,键和值都是字节数组。
另一种常用的键/值存储是缓存,它提供应用中使用最多的数据的内存快照。
EHCache
开源的分布式缓存系统广泛应用于各类Java应用,可以将其看做NoSQL方案。
Memcached
在Web应用中非常流行,是开源的高性能对象缓存系统。
Membase
Membase基于Memcached,支持Memcached的文本和二进制协议,并在其之上增加新特性,包括磁盘持久化、数据复制、在线集群重新配置和数据动态平衡等。
Membase通过Erlang、C、C++实现。
Redis
Redis主要由C实现,支持众多语言,包括Java、Python、Ruby、C、C++等。
Cassandra
Facebook开发,通过Java实现,支持众多语言,支持Hadoop集成。
文档数据库
文档数据库不同于文档管理系统。文档通常是指松散结构的键/值对集合,通常是JSON。最为出名的是MongoDB和CouchDB。
图形数据库
Neo4j是兼容ACID的图形数据库,便于快速遍历图形。