大家好,我是安图新,最近听说有不少刚入门的小伙伴总是困惑数据库的选型,什么数据库还分关系型数据库和非关系型数据库(反正就脱不了关系哈哈...), 傻傻分不清。
今天我来简单说说这两者的关系和区别,希望能够给大家更好地拥抱(需求)变化...
数据库(Database)是按照一定数据结构来存储和管理数据的仓库,按照 数据结构的不同 可以分为 关系型数据库 (SQL)与 非关系型数据库 (NoSQL)。
关系型数据库
基本概念
关系型数据库是指采用了关系模型来组织数据的数据库,关系模型指的就是二维表格模型,数据按照表的形式存储,然后多组表构成了一个数据库。
关系模型中常用的概念有:
1. 关系 :指代一张二维表格,每张表格都有一个关系名,即 表名 ;
2. 元组 :二维表格中的一行,在数据库中被称为 记录 ;
3. 属性 :二维表格中的一列,在数据库中被称为 字段 (包括字段名,数据类型);
4. 域 :二维表格中每一列的取值范围;
5. 关键字 :表示特定元组(某一行)的属性,数据库中常称为 主键 ,由一列或多列的值组成;
6. 关系模型 :对关系的描述其格式为:关系名(属性 1,属性 2,…,属性 N),在数据库中为表结构;
优点
1. 存储方式 :采用表格的储存方式,数据以行和列的方式进行存储,要读取和查询都十分方便,并且容易理解;
2. 存储结构 :按照结构化的方法存储数据,每个数据表都必须先对各个字段定义好(也就是先定义好表的结构),再根据表的结构存入数据这样做的好处就是由于数据的形式和内容在存入数据之前就已经定义好了,所以整个数据表的可靠性和稳定性都比较高;
3. 存储规范 :为了避免重复、规范化数据以及充分利用好存储空间,把数据按照最小关系表的形式进行存储,这样数据管理的就可以变得很清晰、一目了然;
4. 查询方式 :使用结构化查询语言(SQL)对数据库进行查询,SQL 能够支持数据库的 CRUD(增删查改)的操作,具有非常强大的功能;
5. 规范化 :在关系型数据库中,一个数据实体(包括数组、列表和嵌套数据)一般首先要分割成多个部分,然后再对分割的部分进行规范化,规范化以后再分别存入到多张关系型数据表中,这是一个复杂的过程;
6. 事务性 :强调 ACID 规则(原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)),可以满足对事务性要求较高或者需要进行复杂数据查询的数据操作,而且可以充分满足数据库操作的高性能和操作稳定性的要求因为关系型数据库十分强调数据的强一致性,所以其对于事务的操作有很好的支持并且关系型数据库可以控制事务原子性细粒度,一旦操作有误或者有需要,可以马上回滚事务;
缺点
1. 表结构难修改 :因为关系型数据库在存储数据前,需要先对各个字段定义好,而在存入数据后,如果需要修改数据表的结构就会十分困难,所以在对数据库系统进行升级和扩展时,往往需要停机维护和数据迁移;
2. 难扩展 :由于关系型数据库将数据存储在数据表中,所以当数据表越多时,越难于进行数据操作如果要缓解这个问题,只能提高处理能力,也就是选择速度更快性能更高的计算机,这样的方法虽然可以一定的拓展空间,但这样的拓展空间一定有非常有限的,也就是关系型数据库只具备纵向扩展能力;
3. 难管理 :主要是针对多张关联数据表的情况如果需要操作的数据涉及到多张数据表,数据表之间又会存在着复杂的关系,所以随着数据表数量的增加,数据管理会越来越复杂,这会降低数据库的性能;
4. 高并发事务瓶颈 :当用户并发性非常高的时候,对于传统关系型数据库来说,硬盘 I/O 是一个很大的瓶颈;除此之外,在一张包含海量数据的表中查询,效率是非常低的;
常见的关系型数据库
当今十大主流的关系型数据库有 Oracle,Microsoft SQL Server,MySQL,PostgreSQL,DB2,
Microsoft Access, SQLite,Teradata,MariaDB(MySQL 的一个分支),SAP。
非关系型数据库
基本概念
非关系型数据库是指非关系型的,分布式的,且一般不保证遵循 ACID 原则的数据存储系统。非关系型数据库以键值对存储,且结构不固定,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对,不局限于固定的结构,可以减少一些时间和空间的开销。所以,非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合。
优点
1. 易扩展 :NoSQL 的数据之间无关系,这样就非常容易扩展这可以通过给资源池添加更多普通的数据库服务器(节点)来分担负载;
2. 数据存储模式灵活 :无须事先为要存储的数据建立字段,随时可以存储自定义的数据格式这使得它非常适用于 SNS(SocialNetworkingServices)中,例如 facebook,微博这些需要经常进行更新与用户数据更新的系统;
缺点
1. 只适合存储一些较为简单的数据,较难查询复杂的数据;
2. 不适合持久存储海量数据;
常见的非关系数据库
非关系型数据库都是针对某些特定的应用需求出现的,因此,对于该类应用,具有极高的性能。依据结构化方法以及应用场合的不同,主要分为以下几类:
1. 面向高性能并发读写的 key-value 数据库 :key-value 数据库的主要特点是具有极高的并发读写性能,主流代表为 Redis,AmazonDynamoDB,Memcached,MicrosoftAzureCosmosDB 和 Hazelcast;
2. 面向海量数据访问的面向文档数据库 :文档存储通常使用内部表示法,可以直接在应用程序中处理,主要使用的是 JSONJSON 文档也可以作为纯文本存储在键值存储或关系数据库系统中主流代表为 MongoDB,AmazonDynamoDB,Couchbase,MicrosoftAzureCosmosDB 和 CouchDB;
3. 面向搜索数据内容的搜索引擎 :搜索引擎是专门用于搜索数据内容的 NoSQL 数据库管理系统,主要是用于对海量数据进行近实时的处理和分析处理,可用于机器学习和数据挖掘主流代表为 Elasticsearch,Splunk,Solr,MarkLogic 和 Sphinx;
4. 面向可扩展性的分布式数据库 :这类数据库的主要特点是具有很强的可拓展性可以适应数据量的增加以及数据结构的变化,将数据存储在记录中,能够容纳大量动态列由于列名和记录键不是固定的,并且由于记录可能有数十亿列,因此可扩展性存储可以看作是二维键值存储主流代表为 Cassandra,HBase,MicrosoftAzureCosmosDB,DatastaxEnterprise 和 Accumulo;
对比
1. 数据存储方式不同关系型数据天然就是 表格式 的,因此存储在数据表的行和列中数据表可以彼此关联协作存储,也很容易提取数据;与其相反,非关系型数据通常存储在 数据集 中,就像文档、键值对或者图结构;
2. 数据模式不同在 sql 中,必须先定义好表结构,才能够添加数据,例如定义表的主键、索引、外键等表结构可以在定义之后更新,但是如果有比较大的结构变更,就会变的比较复杂;在 Nosql 数据库中,数据可以在任何时候任何地方添加,不需要预先定义;
3. 扩展方式不同要支持更多并发量,SQL 数据库是 纵向扩展 ,也就是说提高处理能力,使用速度更快速的计算机,这样处理相同的数据集就更快了,但这种方式最终肯定会达到纵向扩展的上限;而 NoSQL 数据库是 横向扩展 的,其扩展可以通过给资源池添加更多普通的数据库服务器(节点)来分担负载;
4. 对事务性的支持不同 SQL 数据库支持对事务原子性细粒度控制,并且易于回滚事务;在 Nosql 中没有事务这个概念,每一个数据集都是原子级别的;
5. 查询速度不同关系型数据库将数据存储在硬盘中,查询速度较慢;Nosql 数据库将数据存储于缓存之中,而且不需要经过 SQL 层的解析,查询速度快;
关注公众号: 程序员安仔 ,回复: " 面试题"
注意,不要乱回复
(一定要回复 **" 面试题"
)** 否则啥得不到
安仔唯一官方公众号
点击下方 小卡片 回复: " 面试题"