加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

NoSql简述

发布时间:2020-12-13 13:36:25 所属栏目:百科 来源:网络整理
导读:NoSQL并不是"No! SQL",你可以将其理解为"Not Only SQL",表示在关系型数据库不再好用的时候可以选择更加合适的数据存储。 NoSQL数据库是非关系的、水平可扩展、分布式并且是开源的。MongoDB的创始人Dwight Merriman表示NoSQL可作为一个Web应用服务器、内容管
NoSQL并不是"No! SQL",你可以将其理解为"Not Only SQL",表示在关系型数据库不再好用的时候可以选择更加合适的数据存储。
NoSQL数据库是非关系的、水平可扩展、分布式并且是开源的。MongoDB的创始人Dwight Merriman表示NoSQL可作为一个Web应用服务器、内容管理器、结构化的事件日志、移动应用程序的服务器端和文件存储的后备存储。
分布式数据库公司VoltDB的首席技术官Michael Stonebraker表示NoSQL数据库可提供良好的扩展性和灵活性,但他们也有自己的不足。由于不使用SQL,NoSQL数据库系统不具备高度结构化查询等特性。NoSQL其他的问题还包括不能提供ACID(原子性、一致性、隔离性和持久性)的操作。另外不同的NoSQL数据库都有自己的查询语言,这使得很难规范应用程序接口。

NoSQL数据库按类型可以飞为键值数据库(Key-value)、文档数据库(Document)、列族数据库(Column store)、图数据库(Graph)等。

键值数据库

键值数据库就是一个简单的哈希表,主要用在所有数据库访问均通过主键来操作的场景下。由于键值数据库总是通过主键访问,所以一般性能较高,且易于扩展。
下面是Oracle和Riak的术语对照:
Oracle Riak
database instance Riak cluster
table bucket
row key-value
rowid key

键值数据库包括Aerospike、riak、redis、memcached等。
键值数据库的特征如下:
  • 不同的键值数据库产品,器"事务"的规范也不同,但一般来说,无法保证写入操作的“一致性”;
  • 所有的键值数据库都可以按关键字查询。如果想根据“值列”的某些属性来查询,需要应用程序自己读出值,并判断其属性是否符合查询条件;
  • 键值数据库并不关心键值对里的值,它可以是二进制块、文本、JSON、XML等;
  • 很多键值数据库都可以用“分片”技术扩展,通常键的名字就决定了负责存储该键的节点。

文档数据库

此类数据库可存放并获取文档,格式可以为XML、JSON、BSON(Binary JSON)等。数据库中的文档批次相似,但不必完全相同,文档相当于键值数据库所存放的“值”。下面是Oracle和MongoDB的术语对照:
Oracle MongoDB
database instance MongoDB instance
schema database
table collection
row document
rowid _id
join DBRef

文档数据库的文档可以包含子文档,形成一个树状结果,例如:
{
	"firstname": "Pramod","citiesvisited": ["Chicago","London","Pune","Bangalore"],"addresses": [
		{ "state": "AK","city": "DILLINGHAM","type": "R"
		},{ "state": "MH","city": "PUNE"		
		}
	]
	"lastcity": "Chicago"
}
文档数据库的文档没有空属性,若其中不存在某属性,则认为该属性值未设定或者与此文档无关,向文档中新增属性,无需预先定义,也不用修改已有文档内容。
当前流行的文档数据库有:MongoDB、CouchDB、Terrastore、OrientDB、RavenDB等。
文档数据库的特性如下:
  • 文档数据库通常仅包含“单文档级别”的“事务”,也称为“原子事务”。在默认情况下,所有写入操作都将顺利执行,在MongoDB中使用WriteConcern参数可以微调;
  • 文档数据库通过主从式数据复制技术来增强“可用性”,多个节点保存同一份数据,当主节点故障后,客户端可从从节点获取数据;
  • 各种文档数据库对查询提供了不同的支持,但通常都支持使用键值作为条件来查询,这个特性使得文档数据库的查询功能更接近关系型数据库的查询模型;
  • 对于写少读多的场景,文档数据库通过增加“读取从节点”(read slave)来扩展数据库应对频繁读取的能力;而如果要扩展写入能力,则可以把数据“分片”,“分片”操作需要根据特定字段来划分数据,为了让“分片”的负载保持均衡,需要在节点之间动态转移数据。

列族数据库

列族数据库可以存储关键字及其映射值,并且可以把值分为多个列,让每个列代表一张数据映射表。
Oracle Cassandra
database instance cluster
schema keyspace
table column family
row row
column column
当前流行的列数据库有:Cassandra、HBase、Hypertable、Amazon SimpleDB等。
列族数据库将数据存储在列族中,而列族里的行则把许多列数据关联起来,例如下面的结构:

在Cassandra中,基本存储单元叫做“列”,列中包含列名、值和时间戳,时间戳用于数据过期、解决写入冲突、处理陈旧数据等操作,结构如下:
{
	name: "name",value: "Mike",timestamp: 1234567890
}
行是列的集合,列都属于某个关键字下,由相似行构成的集合就是列族:
//列族
{
	//行
	"pramod-sadalage" : {
		firstName: "Pramod",lastName: "Sadalage",lastVisit: "2012/12/12"
	}
	//行
	"martin-fowler" : {
		firstName: "Martin",lastName: "Fowler",location: "Boston"
	}
}
列族数据库的各行不一定要具备完全相同的列,并且可以随意向其中某列加入一行,而不用把它添加到其他行中。
列族数据库具有如下特性:
  • 通常仅支持“行”级别的“原子性”;
  • 可以根据应用需求来设置读/写操作的可用性:要么提高写入操作的“可用性”,要么提高读取操作的“可用性”;
  • 可支持部分的类SQL的查询功能,但功能有限,不支持join和subquery操作,wehere子句通常也比较简单;
  • 可通过增加节点来扩展数据库。

图数据库

图数据库可存放实体及实体间关系。实体也叫“节点”(node),具有属性,关系又叫做“边”(edge),也具有属性,边具备方向性,节点间通过关系组织起来。用图将数据一次性组织好,后续便可根据“关系”以不同方式解读它。
在图数据库中,节点间的关系不在查询时计算,而是在创建时就已经持久化好了。节点间可有多种不同的关系类型,由于节点关系的数量及类型不限,所以这些关系可存放在同一图数据库中。
常用的图数据库包括:Neo4j,Infinite Graph、OrientDB等。
图数据的特性如下:
  • 图数据通过事务来保证“一致性”,不允许出现“悬挂关系”:所有关系必须具备起始节点与终止节点,在删除节点前,必须先移除其上的关系;
  • 支持主从节点或者分布式节点存储;
  • 可以使用Gremlin等查询语言,Gremlin是一门可以遍历图的领域特定语言,可以遍历所有实现了Blueprints属性图的图数据库;
  • 可以用“所以服务”来编定节点属性索引,也可以索引关系或边的属性;
  • 图数据库有三种扩展方式:
    1. 给服务器配备足量内存,完全容纳“工作集”中的全部节点与关系;
    2. 增加仅能读取数据的从节点,所有写入操作仍由主节点负责;
    3. 若数据集太大,可用“领域特定知识”在应用程序端对其分片。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读