简介

  • Not Only Sql,指非关系型数据库。
  • 我们常用的mysql、sqlserver都是关系型数据库,这些数据库一般都用来存储重要信息,应对普通的业务是没有问题的。但是,随着互联网的高速发展,传统的关系型数据库在应该超大规模、超大流量和高并发时力不从心,此时,Nosql则得到了高速的发展。
  • 存储方式:关系型数据库是表格式的,存储在表的行列中,各表之间很容易关联协作存储,提取数据也方便。而Nosql则是大块的组合在一起,通常存储在数据集中,包括文档、键值对和图结构。
  • 存储结构:关系型数据库对应的是结构化数据,数据表先定义好结构,描述好数据的形式和内容。虽然预定义结构带来了可靠性和稳定性,但是修改这些数据比较困难。而Nosql基于动态结构,使用非结构化数据,可以很容易地适应数据类型和结构的变化。
  • 存储规范:关系型数据库为了更高的规范性,把数据分割为最小的关系表以避免重复,获得精简的空间利用。虽然管理起来很清晰,但是单个操作涉及到多张表时。就显得很麻烦。而Nosql数据存储在平面数据集中,数据经常可能会重复。单个数据库很少被分开,而是存储成一个整体,这样整块数据更便于读写。
  • 参考文章

Nosql代表

  • MongoDB、Redis、Memcache。

适用场景

  1. 数据库表schema经常变化。比如在线商城,产品的属性经常要添加字段,这就意味着ORmapping(object relation mapping,对象关系映射)层的代码和配置要更改,如果该表的数据量过百万,新增这段就会带来额外的开销(重建索引等)。Nosql应用在这种场景,可以极大地提升db的可伸缩性。
  2. 数据表字段是复杂数据类型。比如xml类型的字段,不管是查询还是更改,效率都非常一般。主要是db层对xml字段很难建高效索引,应用层又要做从字符流到dom节点的解析转换。Nosql以json方式存储,提供了原生态的支持,在效率方面元高于关系型数据库。
  3. 高并发数据库请求。关系型数据库的事务以及大表join反而成了性能杀手。大多数情况下,用Nosql会更快。
  4. 海量数据的分布式存储。海量数据的存储如果选用大型商用数据库,如Oracle,成本将非常高。而Nosql分布式存储,可以部署在廉价的硬件上,性价比非常高。

Nosql和sql的结合

  • 实际上Nosql只是sql在性能、扩展上的一个弥补,单从功能上讲,sql能实现其所有功能。
  • 所以我们一般会把Nosql和sql结合起来使用,需要关系特性时我们使用关系型数据库,而需要Nosql特性时我们才使用Nosql。
  • 比如用户评论的存储,字段大概有主键id、评论对象aid、内容content和用户uid等字段。我们能确定的是评论内容content肯定不会在数据库中用where content = ‘’查询,因为这是一个大文本字段。
  • 那么我们可以把id、aid和uid存储在sql,content存储在Nosql,这样数据库就节省了存储content占用的磁盘空间,从而节省大量io,对content也更容易做cache。
  • 查询content时,先从mysql中查询主键id集合:commentIds=DB.query(“SELECT id FROM comments where aid=’评论对象id’ LIMIT 0,20”);然后根据主键id集合从Nosql取出评论内容CommentsList=NoSQL.get(commentIds)。
  • 列入一些配置的关系键值对映射、用户名和密码、session会话存储等等,用Nosql完全可以代替sql。