数据库 3年前

常见数据库分类

作者头像 刘宇帅
3385 0

常见的数据库主要分为三类,SQL(关系型数据库)、NoSQL(非关系型数据库)、NewSQL。

SQL

SQL即关系型数据库(RDBMS — Relational Database Management System),SQL 是基于关系型数据模型设计的数据库,SQL用二维表格表示实体以及实体之间的关系,对数据的操作也几乎全部建立在一个或多个关系表格上,通过对这些关联的表格分组、合并、连接、选取等运算来实现数据库的管理。

常见的关系型数据库有:

  1. Orcale
  2. MySQL
  3. Microsoft SQL server
  4. PostgreSQL
  5. SQLLite
  6. MariaDB

关系型数据库特点

事务性

关系型数据库都很好的支持事务性,并满足ACID特性

A:原子性(Atomicity),一个事务中的所有操作,或者全部完成,或者全部不完成

C:一致性(Consistency),在事务开始之前和事务结束以后,数据库的完整性没有被破坏

I:事务隔离(Isolation),数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致

D:持久性(Durability):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失

规范化

关系型数据设计的时候需要遵循的三大范式

第一范式:确保每列保持原子性

第二范式:确保表中的每列都和主键相关

第三范式:确保每列都和主键列直接相关,而不是间接相关

查询语言

关系型数据库采用结构化查询语言(即SQL)来对数据库进行查询,SQL早已获得了各个数据库厂商的支持,成为数据库行业的标准,它能够支持数据库的CRUD(增加,查询,更新,删除)操作,具有非常强大的功能,SQL可以采用类似索引的方法来加快查询操作。

存储结构

关系型数据库按照结构化的方法存储数据,每个数据表都必须对各个字段定义好(也就是先定义好表的结构),再根据表的结构存入数据,这样做的好处就是由于数据的形式和内容在存入数据之前就已经定义好了,所以整个数据表的可靠性和稳定性都比较高,但带来的问题就是一旦存入数据后,如果需要修改数据表的结构就会十分困难。关系型数据库的行存储的结构下,某些数据类型和NULL值也会造成空间浪费。

扩展方式

由于关系型数据库将数据存储在数据表中,数据操作的瓶颈出现在多张数据表的操作中,而且数据表越多这个问题越严重,如果要缓解这个问题,只能提高处理能力,也就是选择速度更快性能更高的计算机,这样的方法虽然可以一定的拓展空间,但这样的拓展空间一定有非常有限的,也就是关系型数据库只具备纵向扩展能力。

读写性能

关系型数据库十分强调数据的一致性,并为此降低读写性能付出了巨大的代价,虽然关系型数据库存储数据和处理数据的可靠性很不错,但一旦面对海量数据的处理的时候效率就会变得很差,特别是遇到高并发读写的时候性能就会下降的非常厉害。

数据类型

关系型数据库支持的数据类型也比较简单,比如对文档类型如JSON、XML、PDF等,或者媒体文件比如图片、视频等格式数据的存储、查询、处理等支持很差。

灵活性

关系型数据库的结构化存储要求所有的数据都要有严格的表和字段定义,无法很好支持没有固定字段的场景

NoSQL

NoSQL即非关系型(Non-Relational),也有说是不仅仅是SQL(Not Only SQL)。互联网应用有着高并发读写、海量数据处理、数据结构不统一等特点,传统的关系数据库并不能很好地支持这些场景,就出现了NoSQL,没有明确的定义,但是一般都具有不支持事务、高并发读写、数据高可用性、海量数据存储和实时分析等特点。

常见的NoSQL有以下五类:

键值数据库

键值数据库(Key–value database)将数据存储为键值对集合,键作为唯一标识符,键和值都可以是从简单对象到复杂对象的任何内容,是一种最简单的NoSQL数据库,具有较高的容错性和可扩展性。该类数据库一般没有事务或者不能完全地支持ACID特性。

常见的键值数据库有:

  1. Redis
  2. Memcached
  3. etcd
  4. LevelDB
  5. Encache

搜索引擎

搜索引擎数据库(Search Engine)是一类专门用于数据内容搜索的非关系数据库。搜索引擎数据库使用索引对数据中的相似特征进行归类,并提高搜索能力。搜索引擎数据库经过优化,以处理可能很长、半结构化或非结构化的数据,它们通常提供专业的方法,例如全文搜索、复杂搜索表达式和搜索结果排名。

常见的搜索引擎:

  1. Elasticsearch
  2. Splunk
  3. Solr
  4. Sphinx

文档数据库

文档数据库(Document-Oriented Database)是用来管理文档的。在传统数据库中,信息被分割成离散的数据段,而在文档数据库中,文档是处理信息的基本单位。比如常见的文档格式有XML、YAML、JSON、BSON、PDF、Word 等。

常见的文档数据库:

  1. MongoDB
  2. Amazon DynamoDB
  3. Microsoft Azure Cosmos DB
  4. CouchDB

列簇式数据库

列簇式数据库或宽列式存储(wide column store)中数据表示为多维映射,列被分组为列族(通常存储相同类型的数据),并且在每个列族中,数据被逐行存储。此布局最适合存储由一个键或一组键来检索的数据。传统数据库有列数的限制,而列簇式数据库通过列簇的概念来降低这一限制。列簇式数据库不应与面向列的数据库相混淆。

常见的列簇式数据库:

  1. Cassandra
  2. HBase
  3. Microsoft Azure Cosmos DB

图数据库

图数据库(Graph database)是一个使用图结构进行语义查询的数据库,它使用节点、边和属性来表示和存储数据。该系统的关键概念是图,它直接将存储中的数据项,与数据节点和节点间表示关系的边的集合相关联。

常见的图数据库:

  1. Neo4j
  2. Microsoft Azure Cosmos DB
  3. ArangoDB
  4. Virtuoso

NewSQL

NewSQL是各种具有分布式可扩展功能的数据库的简称,NewSQL继承了NoSQL对海量数据的处理能力,同时还保持了传统关系型数据库对SQL和ACID事务的支持。NewSQL的关注重点在于混合式数据库,更倾向于找寻不再区分OLTP和OLAP查询的多模式数据库构建方案。

NewSQL就是要在SQL的基础上像NoSQL一样做分片,通过分片将数据或计算打散到不同的节点,来摆脱单机硬件对容量和计算能力的限制,从而获得更高的可用性、性能以及弹性。常见的有两种实现方案,数据库访问中间件和原生分布式数据库。

数据库访问中间件

数据库访问中间件(分布分表),是新型分布式数据库的过度阶段。常见的数据库访问中间件有两种形式:客户端程序库和数据库代理服务中间件。

常见的客户端程序库:

  1. TDDL
  2. sharding-jdbc
  3. MySQL Fabric

常见的数据库代理服务中间件:

  1. MyCat
  2. Cobar
  3. TDSQL
  4. MySQL-proxy
原生分布式数据库

原生分布式数据库是指从架构设计、底层存储和查询处理均面向分布式数据管理需求,数据库集群作为一个整体对外提供服务,用户无需关注集群内部的实现细节。

常见的原生分布式数据库:

  1. Spanner
  2. F1
  3. OceanBase
  4. TiDB
  5. SequoiaDB
作者头像

刘宇帅

非著名程序员,全栈开发工程师,长期专注系统开发与架构设计。

提示

功能待开通!


暂无评论~

相关文章

杀掉 MySQL 慢查询

show processlist show processlist 用来查看 MySQL 正在运行的线程,如果使用 root 账号可以看到所有用户的线程或者只能看到所使用账号自己的线程,当然如果该用户被赋予了 Process 权限也是可以查看所有用户的线程的。 命令使用展示: mysql> show processlist; +-----+------+-----------+------+---------+------+----------+------------------+ | Id | User | Host | db | Command | Time | S

我是如何成功删库并手动进行数据恢复的

事情起因 有个同事需要一个管理系统,需要管理一些图片什么的,我就想着让他用我写的这套系统,然后就想着把代码和库复制一份出来给他用就可以了,然后我顺便可以把一些需要写到配置里的东西提炼下,让这套系统成为一个可复制部署的 CMS 系统。 实操删库过程 第一步 很熟练的把代码复制一份,nginx 配置复制并修改一份。 第二步:删库 登陆数据库 新建库、切到新建库 删库:因为我部署这个博客系统的时候有把初始化数据库的 sql 文件放到服务器上,我看了下还在。然后直接source init.sql。 3步完成之后,有种莫名的感觉涌上心头,然后打开我的博客,发现里面数据已经空了。。其实我这里使用了Ph

MySQL 字符串比较不区分大小写

最近做了一个简单的短链接服务,短链接使用自增 id 转化为 62 进制(10 个数字+26个小写字母+26个大写字母),但是发现插入数据库报了索引插入重复。 展示 创建测试表 CREATE TABLE `test` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `short_url` varchar(255) NOT NULL COMMENT '测试', PRIMARY KEY (`id`), UNIQUE KEY `short_url` (`short_url`) ) ENGINE=InnoDB AUTO_INCREMENT

SQL 查询如何按 in 后面的数组列表的顺序返回数据

今天要查询一个根据手机号返回用户的姓名,但是想要的 SQL 查询的结果的顺序和 in 后面数组里手机号顺序一样,使用 order by field(phone,111,222) select name,phone from users where phone in (18800000000,18800000000001) order by field(phone, 18800000000,18800000000001)

MySQL修改表的存储引擎

MySQL修改表的存储引擎有三种方式 alter table 该方式需要执行很长时间 mysql> alter table mytable engine=InnoDB; 导入导出 使用mysqldump导出表,修改导出文件里的create table后面表的名称。 创建新的表。 mysqldump导出的表里会包含drop table,所以要注意!删除该句。防止数据丢失 创建和查询 mysql> create table new_table_name like table_name; mysql> alter table new_table_name engin