- NoSQL,全名为Not Only SQL,指的是非关系型的数据库
-
过去,关系型数据库(SQL Server、Oracle、MySQL)是数据持久化的唯一选择,但随着发展,关系型数据库存在以下问题。
-
问题1:不能满足高性能查询需求
我们使用:Java、.Net等语言编写程序,是面向对象的。但用数据库都是关系型数据库。存储结构是面向对象的,但是数据库却是关系的,所以在每次存储或者查询数据时,我们都需要做转换。类似Hibernate、Mybatis这样的ORM框架确实可以简化这个过程,但是在对高性能查询需求时,这些ORM框架就捉襟见肘了。
-
问题2:应用程序规模的变大
网络应用程序的规模变大,需要储存更多的数据、服务更多的用户以及需求更多的计算能力。为了应对这种情形,我们需要不停的扩展。
扩展分为两类:一种是纵向扩展,即购买更好的机器,更多的磁盘、更多的内存等等。另一种是横向扩展,即购买更多的机器组成集群。在巨大的规模下,纵向扩展发挥的作用并不是很大。首先单机器性能提升需要巨额的开销并且有着性能的上限,在Google和Facebook这种规模下,永远不可能使用一台机器支撑所有的负载。鉴于这种情况,我们需要新的数据库,因为关系数据库并不能很好的运行在集群上。
- 随着访问量的上升,网站的数据库性能出现了问题,于是nosql被设计出来
-
优点/缺点
- 优点:
- 高可扩展性
- 分布式计算
- 低成本
- 架构的灵活性,半结构化数据
- 没有复杂的关系
- 缺点:
- 没有标准化
- 有限的查询功能(到目前为止)
- 最终一致是不直观的程序
- 优点:
- 分类
- 列存储(Hbase,Cassandra,Hypertable):顾名思义,是按列存储数据的。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩,对针对某一列或者某几列的查询有非常大的IO优势。
- 文档存储(MongoDB,CouchDB):文档存储一般用类似json的格式存储,存储的内容是文档型的。这样也就有有机会对某些字段建立索引,实现关系数据库的某些功能。
- key-value存储(Tokyo Cabinet / Tyrant,Berkeley DB,MemcacheDB,Redis):可以通过key快速查询到其value。一般来说,存储不管value的格式,照单全收。(Redis包含了其他功能)
- 图存储(Neo4J,FlockDB):图形关系的最佳存储。使用传统关系数据库来解决的话性能低下,而且设计使用不方便。
- 对象存储(db4o,Versant):通过类似面向对象语言的语法操作数据库,通过对象的方式存取数据。
- xml数据库(Berkeley DB XML,BaseX):高效的存储XML数据,并支持XML的内部查询语法,比如XQuery,Xpath。