非关系型数据库-程序员宅基地

技术标签: MySQL  数据库  nosql数据库  

“数据库”起源于20世纪60年代后期,1970年IBM的研究员E.F.Codd博士连续发表论文提出关系模型,在之后的几十年中,关系模型的概念得到了充分的发展并逐渐成为主流数据库结构的主流模型。

关系型数据库的瓶颈

关系型数据库的最大特点就是事务的一致性,但是,在网页应用中,尤其是SNS应用中,一致性却显得不是那么重要,用户A看到的内容和用户B看到的内容更新不一致是可以容忍的,或者说,两个人看到同一好友的数据更新的时间差那么几秒是可以容忍的,因此,关系型数据库的最大特点在这里已经不是那么重要了。
相反地,关系型数据库为了维护一致性所付出的巨大代价就是其读写性能比较差,而像微博、facebook这类SNS的应用,对并发读写能力要求极高,关系型数据库已经无法应付(在读方面,传统上为了克服关系型数据库缺陷,提高性能,都是增加一级memcache来静态化网页,而在SNS中,变化太快,memchache已经无能为力了),因此,必须用新的一种数据存储结构来代替关系数据库。

关系数据库的另一个特点就是表结构的存储结构,因此其扩展性极差,而在SNS中,系统的升级,功能的增加,往往意味着数据结构巨大变动,这一点关系型数据库也难以应付,需要新的结构化数据存储。

于是,非关系型数据库应运而生,NoSQL指 “Not Only SQL”,也被解释为“non-relational”,泛指非关系型的数据库,区别于关系数据库,它们不保证关系数据的ACID特性。

NoSQL有如下优点:易扩展,NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。无形之间也在架构的层面上带来了可扩展的能力。大数据量,高性能,NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。

非关系型数据库的分类

键值(Key-Value)存储数据库

键值数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说的优势在于简单、易部署、高并发。但是如果数据库管理员(DBA)只对部分值进行查询或更新的时候,Key/value就显得效率低下了。

典型产品有Tokyo Cabinet/Tyrant, Redis, Voldemort, MemcacheDB、BerkeleyDB。

列存储数据库

列存储数据库将数据存在列族(column family)中,一个列族存储经常被一起查询的相关数据。这部分数据通常是用来应对分布式存储的海量数据。键仍然存在,但是他们的特点是指向了多个列。
在这里插入图片描述
对于大多数的分析场景中,实际关注的数据很多时候都只有那么一列或者少数几列的数据。所以在列存储数据库的设计中,大部分的分析查询都只需要读取某一个(或者几个)表的几列,而不需要像传统以行为导向的数据库那样需要扫描整个表的数据。
在这里插入图片描述

  • 列存储数据库在增加数据时IO不连续,需要在每个列后面追加数据,写入性能不佳,绝大多数是读取操作。
  • 数据是批量导入的,导入后不修改。
  • 每个表有很多列,分析操作经常只涉及小部分列。

典型产品有Cassandra, HBase, Riak。

什么情况下用column-oriented存储:

  1. 在较少的列上aggregate跨多行:列式存储只读全部数据集的一个子集,而不用扫描全部table;
  2. 当需要一次在一个列上insert/update多行new values。
  3. Storage efficiency:压缩效率远高于行式存储。由于列数据是uniform type,可以利用similarity of adjacent data进行压缩。(但是这种adjacent compression,相应地造成了random access的困难性,需要额外的机制来保证对压缩数据的访问。)

什么情况下用row-oriented存储:

  1. 当需要一次操作单行的多列,尤其当单行size较小时,可以retrieved with a single disk seek;
  2. 当insert一整行时。

文档型数据库

文档型数据库的灵感是来自于Lotus Notes办公软件的,可以看作是键值数据库的升级版,一般用于存储半结构化的数据。在文档数据库中文档是处理信息的基本单位,一般采用XML、YAML 、JSON作为存储协议。由于文档数据库中的文档也需要一个唯一的key来标识文档(当然key可以是JSON、XML结构),文档的内容可以看做value,因此一般把文档数据库也归到Key-Value Store Database中,当然所有的XML数据库其实也可以归成文档数据库。

文档数据库很适合CMS、知识库、OA系统,用于存储新闻稿件、电子邮件、书籍、Web页面、多媒体文件等半结构化的数据。

典型产品有CouchDB, MongoDb.,国内也有文档型数据库SequoiaDB,已经开源。

图形(Graph)数据库

图形结构的数据库是使用灵活的图形模型,并且能够扩展到多个服务器上。它将数据以图的方式存储,实体会被作为顶点,而实体之间的关系则会被作为边。主要存储关于图形、网络的信息,例如社会关系、路线图、交通链接等。

典型产品有Neo4J, InfoGrid, Infinite Graph。
在这里插入图片描述

常用的非关系型数据库软件

  1. MongoDB(Document-oriented)
    在这里插入图片描述
    MongoDB是一个面向文档的开源NoSQL数据库,使用JSON之类的文档来存储任何数据,它是用c++写的。在MongoDB中,JavaScript可以作为查询语言使用。通过使用sharding MongoDB水平伸缩。它在流行的JavaScript框架中非常有用。

特点:提供高性能;自动分片;运行在多个服务器上;支持主从复制;数据以JSON样式文档的形式存储;索引文档中的任何字段;由于数据被放置在碎片中,所以它具有自动负载平衡配置;支持正则表达式搜索;在失败的情况下易于管理。

优点:易于安装;MongoDB Inc.为客户提供专业支持;支持临时查询;高速数据库;无模式数据库;横向扩展数据库;性能非常高。

缺点:不支持连接;数据量大;嵌套文档是有限的;增加不必要的内存使用。
2. Cassandra(Column-oriented)
在这里插入图片描述
Cassandra是Facebook为收件箱搜索开发的,是一个用于处理大量结构化数据的分布式数据存储系统。通常,这些数据分布在许多普通服务器上,还可以添加数据存储容量。由于集群中的所有节点都是相同的,因此不需要处理复杂的配置。Cassandra是用Java编写的。Cassandra查询语言(CQL)是查询Cassandra数据库的一种类似sql的语言。因此,Cassandra在最佳开源数据库中排名第二。Facebook、Twitter、思科(Cisco)、Rackspace、eBay、Twitter、Netflix等一些最大的公司都在使用Cassandra。

特点:线性可伸缩;保持快速响应时间;支持原子性、一致性、隔离性和耐久性(ACID)等属性;使用Apache Hadoop支持MapReduce;分配数据的最大灵活性;高度可伸缩;点对点架构。

优点:高度可伸缩;无单点故障;Multi-DC复制;与其他基于JVM的应用程序紧密集成;更适合多数据中心部署、冗余、故障转移和灾难恢复。

缺点:对聚合的有限支持;不可预知的性能;不支持特别查询。
3. Redis(Key-Value)
在这里插入图片描述
Redis是高性能的Key-Value型数据库,用C语言编写的。Redis的数据都是缓存在内存中。区别是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件。

特点:自动故障转移;将其数据库完全保存在内存中;事务;Lua脚本;将数据复制到任意数量的从属服务器;钥匙的寿命有限;LRU驱逐钥匙;支持发布/订阅。

优点:支持多种数据类型;很容易安装;非常快(每秒执行约11万组,每秒执行约81000次);操作都是原子的;多用途工具(在许多用例中使用)。

缺点:不支持连接;存储过程所需的Lua知识;数据集必须很好地适应内存。
4. HBase(Column-oriented)
在这里插入图片描述
HBase是谷歌为BigTable数据库设计的分布式非关系数据库,主要目标之一是托管数十亿行X数百万列。可以随时添加服务器来增加容量,多个主节点将确保数据的高可用性。HBase是用Java 8编写的,它是在Apache下授权的。Hbase还简单地利用Java API进行客户访问。

特点:支持自动故障;线性可伸缩;提供了数据复制;与Hadoop集成,作为源和目标。

优点:为较大的表提供快速查找;提供对来自数十亿条记录的单行的低延迟访问;简单的Java API为客户端;自动分片;License-free;处理HDFS文件存储之上的大型数据集;灵活的模式设计;高速。

缺点:不支持事务;没有权限或内置身份验证;仅按键索引和排序;单点故障(当只使用一个HMaster时);不支持SQL结构;集群上的内存问题。
5. neo4j(Graph)
在这里插入图片描述
Neo4j被称为原生图数据库,因为它有效地实现了属性图模型,一直到存储层。这意味着数据完全按照白板的方式存储,数据库使用指针导航和遍历图。Neo4j有数据库的社区版和企业版。企业版包括Community Edition必须提供的所有功能,以及额外的企业需求,如备份、集群和故障转移功能。

特点:它支持唯一的约束;Neo4j支持完整的ACID(原子性、一致性、隔离性和持久性)规则;Java API: Cypher API和本机Java API;使用Apache Lucence索引;简单查询语言Neo4j CQL;包含用于执行CQL命令的UI: Neo4j Data Browser。

优点:容易检索其相邻节点或关系细节,无需连接或索引;易于学习Neo4j CQL查询语言命令;不需要复杂的连接来检索数据;非常容易地表示半结构化数据;大型企业实时应用程序的高可用性;简化的调优。

缺点:不支持分片。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/kejiayuan0806/article/details/123689349

智能推荐

Elastic:机器学习的原理及实践 - single metric job_es 机械学习的应用-程序员宅基地

文章浏览阅读6.4k次,点赞2次,收藏18次。在Elasticsearch中,可以将机器学习视为搜索和分析的自然扩展。它是对时间序列数据的分析。 Elasticsearch支持的机器学习功能可以通过运行metric任务来自动分析时间序列数据,该metric任务包含一个或多个定义了将要分析的字段的检测器。 它可以帮助我们识别单变量时间序列数据中的异常,并向我们显示正常情况。在Elasticsearch中,我们可以通过机器学习来检测时间系列中的异..._es 机械学习的应用

Android的log保存到文件上查看_android log.v 存为文件-程序员宅基地

文章浏览阅读2.1w次。在调试的时候一般都是在logcat中看日志的信息,以便找出BUG和调试信息,但是如果在真机上的话不可能一直连接电脑查看日志,所以生成日志文件并保存,是一个比较普遍的需求,下面就是最近实现的一个例子。欢迎大家讨论并给出别的思路。 import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream_android log.v 存为文件

c语言--printf--scanf--运算符_c语言带运算scanf-程序员宅基地

文章浏览阅读1.4k次。printf将变量的内容输出到显示器。四种用法:printf("字符串\n");printf("输出控制符",输出参数);printf("输出控制符1 输出控制符2...",输出参数1,输出参数2); //输出控制符和输出参数个数必须一一对应printf("输出控制符 非输出控制符",输出参数,输出参数);以%开头一般都是输出控制符,输出控制符包含如下%d %ld %f %c %lf %x %X %#X %o %s为什么需要输出控制符。01组成的代码可以表示数据也可以表示指_c语言带运算scanf

初试 Kubernetes 动态卷配置使用 RBD 作为 StorageClass_failed to provision volume with storageclass-程序员宅基地

文章浏览阅读3.7k次。目录Kubernetes StorageClass 介绍环境、软件准备Kubernetes 使用 RBD 作为 StorageClass1、Kubernetes StorageClass 介绍Kubernetes 集群存储 PV 支持 Static 静态配置以及 Dynamic 动态配置,动态卷配置 (Dynamic provisioning) 可以根据需要动态的创建存储卷。我们知道,之前的静态配..._failed to provision volume with storageclass

三元组存放的稀疏矩阵的转置_三元组存储稀疏矩阵进行转置-程序员宅基地

文章浏览阅读1.7k次。稀疏矩阵: 非零元素很少,但是分布没有规律的矩阵。(即可以用三元组来存放每个非零元)。三元组顺序表的定义:#define size 3typedef int Elemtype;typedef struct{ int i,j;//非零元的行,列 Elemtype e;//非零元元素 }Triple;//三元组 typedef struct{ Triple date[size+1]..._三元组存储稀疏矩阵进行转置

java判断熟数字_java大牛须知道的25点-程序员宅基地

文章浏览阅读49次。1. 你需要精通面向对象分析与设计(OOA/OOD)、涉及模式(GOF,J2EEDP)以及综合模式。你应该了解UML,尤其是class、object、interaction以及statediagrams.2. 你需要学习Java语言的基础知识以及它的核心类库(collections、serialization、streams、networking、multithreading、reflection..._熟门熟码是什么数字

随便推点

MSYS2安装和使用_pacman windows-程序员宅基地

文章浏览阅读546次,点赞14次,收藏12次。msys2是一款跨平台编译套件,它模拟linux编译环境,支持整合mingw32和mingw64,能很方便的在windows上对一些开源的linux工程进行编译运行。更重要的是它支持pacman包管理器;这意味着你可以很方便的安装所需要的软件包和开发库,而不需要自己去找源码编译。_pacman windows

JDK8 日期格式化_jdk date pattern-程序员宅基地

文章浏览阅读1w次。为什么要格式化我们中国人习惯 yyyy-MM-dd HH:mm:ss 这种格式的日期,但奈何框架是歪国大佬们写的,他们的日期格式与我们相差甚远,好在 Spring Boot 提供了 spring.jackson.date-format,但它只能格式化 java.util.Date。那么解决办法是什么呢?在 JDK8 中,一个新的重要特性就是引入了全新的时间和日期API,它被收录在 java..._jdk date pattern

不是python中用于开发用户界面的第三方库-Python计算生态习题(50题)-程序员宅基地

文章浏览阅读6k次,点赞3次,收藏36次。1、Python网络爬虫方向的第三方库是A. requestB. jiebaC.itchatD.time答案:A2、Python网络爬虫方向的第三方库是A、numpyB、scrapyC、ArcadeD、FGMK答案:B3、Python数据分析方向的第三方库是A、BokehB、dataswimC、scipyD、Gleam答案:C4、Python数据分析方向的第三方库是A、PlotlyB、PyQtDa..._python第三方库习题

线程的状态-Thread的状态包括:New、Runnable、Blocked、Waiting、Timed Waiting和Terminated_thread terminated-程序员宅基地

文章浏览阅读544次。在Java程序中,一个线程对象只能调用一次start()方法启动新线程,并在新线程中执行run()方法。一旦run()方法执行完毕,线程就结束了。因此,Java线程的状态有以下几种:New:新创建的线程,尚未执行; Runnable:运行中的线程,正在执行run()方法的Java代码; Blocked:运行中的线程,因为某些操作被阻塞而挂起; Waiting:运行中的线程,因为某些操作在等待中; Timed Waiting:运行中的线程,因为执行sleep()方法正在计时等待; Termina_thread terminated

【AI视野·今日CV 计算机视觉论文速览 第259期】Tue, 3 Oct 2023_humannorm: learning normal diffusion model for hig-程序员宅基地

文章浏览阅读543次。AI视野·今日CS.CV 计算机视觉论文速览Tue, 3 Oct 2023 (showing first 100 of 167 entries)Totally 100 papers上期速览更多精彩请移步主页Daily Computer Vision PapersGPT-Driver: Learning to Drive with GPT Authors Jiageng Mao, Yuxi Qian, Hang Zhao, Yue Wang我们提出了一种简单而有效的方法,可以将 O_humannorm: learning normal diffusion model for high-quality and realistic 3d

vivado仿真器文件没有针对VCS的,这个时候将ip文件夹下的sim 和simulation文件夹给到VCS就可以_vivado不支持vcs-程序员宅基地

文章浏览阅读1k次。这个时候将ip文件夹下的sim 和simulation文件夹给到VCS就可以_vivado不支持vcs

推荐文章

热门文章

相关标签