乐趣区

关于数据库:面对不同数据库类型如何进行数据库选型

数据库的选型始终是一个困扰着洽购人员和 DBA 的问题,既须要立足于当下,提供高可用的服务,又须要着眼于将来,给予足够的扩大空间以适应我的项目的发展壮大。针对这个问题,本文尝试着从数据库类型的角度谈一谈数据库选型的最佳实际。

一、引言

如前所述,为我的项目进行数据库选型着实是一件头疼的事,不同的角色在选型时可能会有不同的考量。洽购人员会更关注于老本及供应商资质,而 DBA 则会更多思考数据库自身的性能、稳定性、扩展性等。不可否认的是,很多状况下咱们可能会遇到上面这种情境。

如果你已经应用过某类数据库,你可能会说“我只会抉择 X,那是我所晓得并应用过的数据库”,当然,如果性能不是重要考量规范的话,这是齐全能够的。否则,当我的项目规模倒退时,谬误的数据库可能会成为我的项目的阻碍,并且有时还很难修复。即便你正在负责一个曾经应用某个特定的数据库一段时间的成熟我的项目,理解其局限性并分明何时应在堆栈中增加另一种类型的数据库(多个数据组合工作是很常见的)也是很重要的。

理解不同数据库及其属性的另一个加分起因是,它是面试中的一个常考题!

在下文的内容中,咱们将会探讨两种次要的数据库类型:

* 关系型数据库(基于 SQL)

* NoSQL 数据库

咱们将探讨不同类型的 NoSQL 数据库以及何时应用它们。最初,咱们还会探讨关系型数据库与 NoSQL 数据库的优缺点。这篇文章将不会波及对同类型数据库的不同产品之间的比拟。

二、关系型数据库(基于 SQL)

关系型数据库由一组连接起来的表(比方 CSV 表)组成。表中的每一行代表一条记录。

为什么叫关系型? 在这种数据库中存在的“关系”是什么?假如你有一个学生信息表和一张课程成绩表(课程,问题,学生证),每个问题行都与学生信息表的一条记录相干。参见下图,课程成绩表中“Student ID”列的值通过“ID”列的值指向“Students”表中的行。

所有关系型数据库都应用相似 SQL 的语言进行查问,这些语言很罕用,并且自带 JOIN 操作(即连贯操作,用于把来自两个或多个表的行联合起来,如上文的学生信息表和课程成绩表)。这种数据库反对对列进行索引,使得基于这些列能进行更快的查问。

因为其结构化的个性,关系型数据库的 schema(schema 指数据库中数据的组织和构造)是在插入数据之前确定好的。

常见的关系型数据库: MySQL、PostgreSQL、Oracle、MS SQL Server

三、NoSQL 数据库

尽管在关系型数据库中,所有内容都是按行和列进行结构化好的,但在 NoSQL 数据库中,并没有针对所有记录通用的结构化的 schema。大多数 NoSQL 数据库存储的是 JSON 记录,不同的记录能够蕴含不同的字段。

实际上,应将 NoSQL 数据库称为“not only SQL”—— 因为许多 NoSQL 数据库反对应用 SQL 进行查问。

NoSQL 数据库依照存储构造次要分为 4 种类型:

1. 文档存储数据库

文档存储数据库的原子单位是一个文档(document)。每个文档都是一个 JSON,不同文档能够有不同的 schema,蕴含不同的字段。文档存储数据库容许对文档中的某些字段建设索引,从而可能基于这些字段进行更快的查问(这将会强制所有文档都具备该字段)。

文档型数据库实用于数据分析 ,因为不同的记录之间并不相互依赖(在逻辑和构造方面),所以这种数据库 反对并行计算。咱们能够借助它来轻松地对数据进行大数据分析。

常见的文档存储数据库:MongoDB、CouchDB、DocumentDB

2. 列存储数据库

列存储数据库的原子单位是表中的一列,这意味着数据是按列存储的。它的列存储特点使得基于列的查问十分高效,并且因为每列上的数据简直领有雷同的构造,因而能够更好地压缩数据。

列存储数据库 偏向于查问数据中的一个列子集 时(每次查问的数据不须要都是雷同的子集!)。列存储数据库执行此类查问的速度十分快,因为它只须要读取这些特定的列(而基于行存储的数据库则必须读取整个数据)。

  • 这在数据迷信中很常见,其中每一列代表一个特色。作为一名数据科学家,我常常应用特色子集来训练我的模型,并且通常还会查看特色和得分之间的关系(相关性、方差、显著性)。
  • 这在日志中也很常见 —— 咱们通常在日志数据库中存储很多字段,但在每个查问中只应用几个字段。
    常见的列存储数据库: Cassandra

3.key-value 存储数据库

查问仅基于键 —— 当你申请一个键,便会拿到对应的值。不反对跨不同记录值之间的查问,比方“select all records where city == New York”。这种数据库中一个有用的个性是 TTL 字段(time to live),当记录将要从数据库中删除时,这个字段能够为每个记录和状态设置不同的值。

key-value 数据库的 劣势在于其处理速度很快 。首先是因为应用惟一键,其次是因为大多数 key-value 存储数据库将数据存储在内存(RAM)中,从而能够快速访问。它的 毛病是须要定义惟一的键,这些键是很好的标识符,是在查问时依据您所已知的数据创立的。通常比其余类型的数据库更加低廉(因为它是在内存上运行的)。

key-value 数据库次要 用于缓存,因为它十分快,并且不须要简单的查问,而且 TTL 个性对缓存十分有用。它还能够用于须要疾速查问并满足 key-value 格局的任何其余类型的数据。

常见的 key-value 存储数据库: Redis、Memcached

4. 图存储数据库

图存储数据库蕴含代表实体的节点和代表实体之间关系的边。如果数据是相似于 常识图谱和社交网络 这种图时适宜抉择图数据库。

常见的图存储数据库:Neo4j、InfiniteGraph

四、关系型数据库 VS 文档存储数据库

鉴于文档型数据库,尤其是 MongoDB 近年来的炽热,咱们简要剖析一下关系型数据库和文档型数据库各自的优劣势。当然,这两者之间不存在优胜劣汰的关系,没有一个数据库可能解决所有问题,抉择适宜本身需要的数据库才是上上之选。

关系型数据库的长处

  • 数据结构简略,能够匹配我的项目中常见的大多数类型的数据
  • 应用 SQL。SQL 很罕用,并且天生反对连贯操作
  • 容许数据的疾速更新。所有数据库都保留在一台机器上,记录之间的关系用作指针,这意味着您能够一次更新一条记录,而它的所有相干记录也将立刻更新
  • 关系型数据库也反对原子事务。什么是原子事务:假如我想把 X 美元从 Alice 账户转移到 Bob 账户。我想执行 3 个操作:缩小 Alice 账户 X 刀,减少 Bob 账户 X 刀,最初记录下这个交易事务。我想把这些动作当作一个原子单位 —— 要么所有的动作产生要么一个都不产生

关系型数据库的毛病

  • 因为每个查问都在表上实现 —— 查问执行工夫取决于表的大小。这是一个重要的限度,要求咱们放弃表绝对较小,并在咱们的数据库上进行优化以实现可伸缩性
  • 在关系型数据库的扩大中,能够通过向运行数据库的计算机减少更多的计算能力来进行扩大,这种办法称为“纵向扩大”。为什么这是一个毛病呢?这是因为计算机可能提供的计算能力无限,而且向计算机扩大资源可能须要一些停机工夫
  • 关系型数据库 不反对 OOP,不反对面向对象,即便示意简略的列表也是非常复杂的

文档存储数据库的长处

  • 能够保留具备不同构造的对象
  • 能够应用 JSON 示意简直所有的数据结构,包含基于对象的 OOP、列表以及字典
  • 尽管 NoSQL 实质上是无模式的(指不须要像关系型数据库一样将预约义的构造,即 schema,向数据库阐明),但它通常反对模式验证,这意味着您能够使一个数据汇合模式化,此模式不会像表那么简略,它是一个带有特定字段的 JSON schema。(译者注:这里所说的模式就是 schema)
  • NoSQL 查问十分快,每条记录都是独立的,因而查问工夫与数据库大小无关,并且反对并行性
  • 在 NoSQL 中,通过增加更多的机器并在它们之间调配数据来扩大数据库,这种办法称为“程度扩大”。这容许咱们在须要时主动向数据库扩大资源,并且不会导致任何停机

文档存储数据库的毛病

  • 在文档存储数据库中更新数据是一个迟缓的过程,因为数据会在不同的机器之间进行划分、复制。
  • 大部分文档数据库不反对原子事务。能够通过应用验证和复原机制将其增加到代码中,然而因为记录是在机器之间划分的,所以它不可能是一个原子过程,并且可能会呈现竞争情况(注:MongoDB 4.0 版本曾经提供了原生的事务操作)

五、总结

总的来说,数据库的选型是一个较为简单的过程,除了思考我的项目自身的需要以确定适合的数据库类型之外,还要联合数据库的运维老本、性能、稳定性、扩展性、平安等因素进行综合研判。从数据库机构方面,咱们对于数据库的选型提供如下参考:

  • 对于缓存 —— 应用 key-value 数据库
  • 对于相似图形的数据 —— 应用图数据库
  • 如果偏向于查问列子集以及查问特色 —— 应用列存数据库
  • 对于所有的其余用例 —— 应用关系型数据库或者文档存储数据库**
退出移动版