NOSQLI数据库是什么?

术语NOSQL包括了范固普遍的数据库,每一种数据库都有本身的优点和不足,并且年夜多都有异常分歧的目的和用例。在不雅察今天的NOSOL共生体系时,可以将数据库划分为5年夜类:纯洁的键/值、数据构造、图、面向文档、高度散布。每种类其余数据库都面向分歧的运用情形,并且每个类别也都做了分歧的折中。我们将分离考核这些数据库,并看看个中的折中情形。

纯洁的键/值

纯洁的键值数据库现实上已经存在很长时光了。甚至在SQL数据库风行之前,dbm(一个纯洁的键/值数据库)就活着界上的许多UNX体系中应用了。之后是BerkeleyDB,今朝仍然是一个保护中的富有性命活气的数据库解决计划。今天,这些纯洁的键值存储库正在从新风行起来,部门原因是所有的NOSQL数据库都在变得风行起来,但也是因为开辟了一些速度更快、更为现代的数据库实现,如TokyoCabinet、KyotoCabinet、Memcachedb。

恰是它们的简略性界说了这组数据库。向数据库存入一个键和一个值,然后用统一个键查询数据库,则会获得雷同的值。没有构造或类型体系一一平日所处置的只是字节或字符串。因为这种简略性,这些数据库的开销极小,所以异常快。事实上,这些数据库平日都是实现为磁盘上的B树或哈希表。

对一个纯洁的键值数据库进行分片是直截了当的一一简略地选一个哈希算法,以键作为参数运行该算法,输出就是要查询或写入的数据库节点。另一方面,对于庞杂查询就完整不是这么简略了。醫如对于如许的查询:年纪年夜于50的用户,就无法直接查询,不得不保持别的一个键/值对,个中值是一个序列化的用户键列表,这些用户的年纪年夜于50,每次要创立新用户或更新用户信息,都要更新这个列表。

对于纯料的键/值存储库,可能的运用包含HTTP会话、用户爱好以及URL缩写(shorteners)。我在前面已经描写过HTTP会话,HTTP会话应当以一种异常直接的方法存储在能/值摩中。个中键就是用户的会话症结字(sessionkey),而值是包括用户会话信息的一个序列化了的对象。对于用户爱好,可以如许来实现:键是用户1D衔接上用户爱好的名称,值就是用户现实的爱好。对于URL缩写,URL路径就是键,而值就是路径重定向的地位。

数据构造

数据构造数据库对键/值数据库做了些修正。在纯洁键值数据库中,平日只是将键和值作为字符串或字节来存储,而数据构造数据库则将其存储为特定的数据构造,如列表、聚集或哈希表。因为有了这些附加的构造,就可以对值履行一些原子操作。对于列表,可以对值进行压入或弹出操作。对于聚集,可以履行并集和交集操作。可以对数据库履行在运用法式中对数据构造进行的各类操作。实质上,这些都是运用法式已经在应用的数据构造只不外由外部过程保护罢了。

现实上这个范畴独一的竞争者就是Redis。某些实现细节使得Redis很有。Redis默认是在内存中存储其全体内容的,只是周期性地将内容的快照存储到磁盘。这使得Redist出奇得快,但假如数据库瓦解了,就会对数据造成一些丧失。同时也意味着必需有足够的内存(RAM)存储全部数据库。值得指出的是,这些默认设置是可以转变的一可以以速度为价值来增长数据的可连续性,还可以应用虚拟内存模式,如许就可以存储比现实内存更多的数据(固然仍然是有限制的)。

数器、义务队列或趋向剖析,是很幻想的。想象一下,给每个登录进来的用户一个独一的鍵,映射到一张空表上,该用户拜访的每个页面的每个URL都从尾部压人这张表。然后就可以获取任何用户的这些信息,不雅察该用户的拜访路径,并对该路径进行剖析。经由过程这张表的长度就可以得出该用户的活泼水平。这是一小我为的例子,但仍然展现了极快的内存操作和丰硕的数据构造能做什么工作。

图数据库几乎就是数据构造数据库的一个特定实现,因为图本就是一种数据构造。差别是图数据库不再是基于键/值,数据是作为图的节点和边存储的。图数据库不是用键来查询值,而是给出根节点的句柄,然后就可以遍历全部图以找到须要的节点或者边。这会异常有价值,因为许多运用法式都年夜量应用了图这种数据构造,将这些数据构造映射为图数据库上的操作是相当轻易的。就像数据构造数据库一样,数据库的图也跟运用法式应用的图是一样的,只不外是由外部过程保护的罢了。

这个范畴的重要竞争者是Neo4j,这是是一个嵌入式的ava图数据库,但可以用好几种说话进行访同。除了Neo4之外,其他开源的图数据库包含Hypergraphdb、Infogrid、VertexdbHypergraphdb定位在对图的一种更为通用的表现上,个中之一就是边可以指向多个节点。Vertex的有趣之处是出现了一个RESTFULL的HTTPAPI,经由过程这个API可以直接拜访数据库,而其他几种数据库重要都是经由过程Java办法来拜访的。

图数据库的优势应当恰是你所期望的:存储图或树形的数据。例如,假如网站想要保护一个社交图(socialgraph),则应用图数据库会发生一些有趣的运用。警如,发明或向用户推举新同伙,传统上实现起来既庞杂,速度又慢,而应用图数据库则既简略,效力又高一一仅仅运行一下宽度优先搜刮或最短路径遍历,工作就搞定了。

面向文档

面向文档的数据库又相似于键值数据库,但值不再是字节、字符串、列表、聚集,而是文档”。什么是文档?在我们要谈到的两个面向文档数据库COUCHDB和MONGODB中,文档是作为JSON(或相似于JSON)对象存储的,实质上是一种哈希表或字典。这些值都有雷同的构造,意味着可以用查询来探测这种构造,并只返回所须要的文档。要记住的是,这种查询才能是树立在经由过程键来查找文档的才能之上的。

COUCHDB是一个面向文档的数据库,是用Erlang开辟的,有一些有趣的实现细节,警如说是一种只附加(append-only)的数据构造,而且可以或许在数据库中直接向运用法式供给办事。Mongodb是另一个面向文档的数据库,是用C++开辟的,在速度上做了许多优化,供给了一个加倍传统的查询层。固然这两个体系在纸上看起来很像,但目的倒是分歧的。在我写这些器械的时刻,COUCHDB的趋向是作为桌面数据库或阅读器中的数据库,由用户下载安装,而Mongodb则趋势于更多地用在数据中间。

在不克不及确实地知道能获得什么数据时,如在生涯串流运用中那样,面向文档的数据库就异常适合了。在如许的运用中,从一个风行的照片网站上检索的文档应当包括照片属性,而来自微博网站的文档可能有一些地舆属性,而来自博客网站的文档将不会有这些信息。面向文档数据库的另一个不错的运用是内容治理体系,在如许的体系中,每个文档都表现一个页面,或页面的一部门。

高度散布

高度散布的数据库若干有些分歧一一有些实质上更接近于键/值存储,其他则更像年夜型的多维哈希图。它们的配合点是都为多节点安排优化过。在这些体系中,简略地在集群中增长一个新节点就会增长更多的容量。个中一个节点掉效并不会导致数据丧失,但会掉失落一些容量。多半这种体系都邑许可用户就义失落一些一致性而包管高可用性和分区容错性。

Hbase是一个高度散布式的数据库,源自于Hadoop-项目,而且受到BigTable(Google专有的高度散布式数据库)的直接影响。Cassandra是另一个高度散布式数据库,最初是在Facebook开辟的,固然数据模子异常相似于Hbase,但集中在不发生单点故障以及写操作机能上。Hbase和Cassandra都将数据存储为年夜型的多维哈希图。Basho公司的Riak是另个高度散布式数据库,应用Erlang开辟,可以经由过程RESTFULL的HTTPAPE来拜访,和Hibase与Cassandra比起来,是一个加倍简略的键值模子。Voldemort和Hypertable项目是别的两个值得说起的高度散布式数据库。

为什么要应用高度散布的网站扶植数据库呢?噢,平日都是没有其他选择的成果。这些数据库都是用在如许的场所,就是其他的数据库(基于SQL的数据库或其他数据库)或者对数据无法处置,或者无法处置那些查询。几乎每个问题范畴(problemdomain)都可以用这些数据库体系来建模,但有时刻会比很多传统数据库更为诡异。

相關文章: