NoSql产品按照功能和属性进行分类:
- 面向列的有序存储。Google Bigtable的数据存储模型支持面向列,与RDBMS面向行的存储格式不同,列值存在则储存,null就不储存,能避免浪费空间。每个数据单元都是键值对集合,主键叫行健。数据按列族存储,列族通常是在配置或启动时定义好的,列则不需要预先定义或声明。实际存储中,物理上一条数据的列族并不相互隔离,同一行健的所有数据存储在一起。在Bigtable和其他类似产品中,数据按顺序连续存储,数据存满一个节点后壳拆分成多个节点,数据不仅在每个节点上有序,而且还跨节点有序。数据持久化有容错考虑,利用分布式文件系统将数据持久化到磁盘上。因为有序,数据按行键查找效率极高。
HBase:java实现,使用者如Facebook,Yahoo!等
Hypertable:c++实现,使用者如百度等
Cloudata:java实现
- 键值存储。哈希表或关联数组是容纳键值对的最简单的数据结构。高效,访问数据的时间复杂度是O(1)。可以分散保存到集群节点中。
键值存储主要分为两种:内存或者持久化到磁盘。
- Oracle的Berkeley DB键值存储。
- 缓存。缓存系统:EHCache,Memcached
Membase:C和C++实现,Memcached替代品,使用者如Zynga,NHN。
Kyoto Cabinet:C++实现,Mixi公司。
Redis:C实现
以上都为数据储存提供了强一致性模型。但是可用性高于一致性。
Amazon Dynamo提出了最终一致性。过程中可能不一致。,下面是类似产品:
Cassandra:java实现,使用者如facebook,Digg,Reddit,Twitter等
Voldemort:java实现,使用者如LinkedIn。
Riak:Erlang实现。
- 文档数据库。不是文档/内容管理系统,是文档中松散结构的键值对集合,通常是JSON。
MongoDB:C++实现,使用者如Github。
CouchDB:Erlang实现,js执行环境,使用者如Apple,BBC等。
- 图形数据库。
Neo4j:java实现,
FlockDB:Scala实现,使用者如Twitter
- XML数据存储。