挑选正确的数据存储可以简化您的应用程序。错误的选择可以增加摩擦。本文将帮助您扩展您的已知恶魔列表。它涵盖以下内容:
- 定义数据存储特性的数据库成分。
- 按数据类型分类的数据存储:非结构化,结构化(表格)和各种半结构(NoSQL)类型。
- 专门用于各种用例的数据存储。
- 决策流程图导航在预级和云替代方向上的景观。
数据库
对数据库工作原理有助于评估替代方案的高级了解。数据库有5个组件:接口,查询处理器,元数据,索引和存储:
- 接口语言或API:每个数据库定义了一种与之交互的语言或API。它涵盖了数据和事务的定义,操作,查询和控制。
- 查询处理器:数据库的“CPU”。它的工作是处理传入的请求,执行所需的操作,并返回结果。
- 存储:存储数据的磁盘或内存。
- 索引:数据结构快速定位存储中查询的数据。
- 元数据:数据的元信息,存储。和索引(例如,目录,架构,大小)。
查询处理器为每个传入请求执行以下步骤:
- 解析请求并将其验证为元数据。
- 创建一个利用索引的有效执行计划。
- 读取或更新存储。
- 更新元数据和索引。
- 计算并返回结果。
要确定数据存储区匹配您的应用程序需求,您需要仔细检查:
- 接口支持的操作。如果您需要的计算是内置的,则需要编写更少的代码。
- 块存储 Blob Storage.
在下一节中,让我们在数据存储中检查各种数据类型的数据存储中的操作和索引。
块存储 Blob Storage.
文件系统是最简单和最旧的数据存储。我们每天都使用它来存储各种数据。Blob Storage是一种用于存储非结构化数据的超级分布式版本文件系统。
- Blob是二进制大对象。您可以存储任何类型的数据。因此,Blob数据存储在解释数据时没有角色:
- Blob在文件级别支持CRUD(创建,读取,更新,删除)操作。
目录或文件路径是索引。
因此,您可以快速查找并读取文件。但是在文件中找到某些内容需要顺序扫描。文档,图像,音频和视频文件存储在Blob中。
表格数据存储
表格数据存储适用于存储结构化数据。每个记录(行)具有相同类型的属性(列)的相同类型。
有两种应用:
- 在线事务处理(OLTP):捕获,存储和从事务中实时处理数据。
- 在线分析处理(OLAP):从OLTP应用程序分析聚合的历史数据。
OLTP应用程序需要数据存储,支持低延迟读取和单个记录的写入。OLAP应用程序需要支持高吞吐量的数据存储读取大量(只读)记录。
关系或导向的数据库
关系数据库管理系统(RDBMS)是最早的数据存储之一。数据在表中组织。表格归一化以降低数据冗余和更好的数据完整性。
表可能具有主要和外键:
- 主键是一个最小的属性(列),它唯一的标识表中的记录(行)。
- 外键在表格之间建立关系。它是一个表中的一组属性,指的是另一个表的主键。
关系数据库针对事务操作进行了优化。事务通常更新多个表中的多个记录。索引针对频繁的低延迟写作ACID进行了优化:
- 原子性:更新多行的任何事务被视为单个单元。成功的交易执行所有更新。失败的事务执行任何更新,即数据库不变。
- 一致性:每个事务将数据库从一个有效状态带到另一个。它保证维护所有数据库不变性和约束。
- 隔离:多次事务的并发执行在与事务顺序执行的情况下以与事务执行相同的状态离开数据库。
- 耐用性:承诺的交易是永久性的,即使系统崩溃也是生存的。
有很多可供选择:
- 非云:Oracle,Microsoft SQL Server,IBM DB2,PostgreSQL和MySQL
- AWS:在关系数据库服务(RDS)中托管PostgreSQL和MySQL
- Microsoft Azure:托管SQL Server作为Azure SQL数据库
- Google云:托管PostgreSQL和MySQL在Cloud SQL中,以及水平缩放云扳手
面向列的数据库
虽然交易是行(记录),但在列(属性)上计算分析属性。OLAP应用程序需要在表上进行优化的列读取操作。
通过将面向列的索引添加到关系数据库来实现它的一种方法。例如:
- Microsoft SQL Server中的ColumnStore索引
- postgreSQL中的ColumnStore索引
但是,主RDBMS操作是低延迟的高频率酸事务。这不会扩展到分析应用程序中常见的大数据规模。
对于大数据,存储在Blob存储数据湖中变得流行。部分分析摘要计算并维持在OLAP多维数据集中。列储存的规模和性能的进步使OLAP多方面过时。但概念仍然与设计数据管道有关。
现代数据仓库是基于列存数据库构建的。数据由列而不是行存储。可用选择是:
- AWS:redshift
- Azure:synapse.
- 谷歌云:bigquery
- Apache:Druid,kudu,pinot
- 其他:Clickhouse,Snowflake
Databricks Delta Lake在数据湖泊中的数据上提供类似列存性能。
SQL与NoSQL:NoSQL和SQL之间的差异
非关系NoSQL数据存储有两个原因:
- RDBMS没有为大数据水平扩展
- 并非所有数据都适合严格的RDBMS架构
NoSQL数据存储在各种CAP定理权衡中提供水平刻度。根据CAP定理,分布式数据存储可以在以下3个保证中提供最多2个保证:
- 一致性:每次读取都会收到最近的写入或错误。
- 可用性:无论节点的各个状态如何,每个请求都会获得(非错误)响应。
- 分区容忍:尽管在节点之间的网络丢弃(或延迟)丢弃了任意数量的消息,但群集不会失败。
请注意,CAP定理和ACID事务中的一致性定义是不同的。ACID一致性是关于数据完整性的(数据是一致的w.r.t.每个交易后的关系和约束)。CAP是关于在任何给定时间彼此一致的所有节点的状态。
只有少数NoSQL数据存储是ACID。大多数NoSQL数据存储支持基础模型:
- 基本可用性:数据在许多存储系统上复制,大部分时间都可用。
- 软状态:复制品一直不是一致;因此,国家可能只会部分正确,因为它可能尚不融合。
- 最终的一致性:数据将在未来某些时候一致,但没有保证。
NoSQL和SQL数据库之间的差异是:
- 数据:SQL DBS用于严格遵守关系模式的标准化结构化(表格)数据。
- 事务:所有SQL DBS支持酸事务,但大多数NoSQL数据存储提供基础事务。
- CAP权衡:SQL DBS优先考虑到其他一切的一致性。但是,NoSQL数据存储通常优先考虑可用性和分区公差(水平缩放)并提供最终的一致性。
NoSQL用于半结构化数据类型:
NoSQL数据存储迎合半结构数据:键值,宽柱,文档(树)和图形。
键值数据存储
键值存储是字典或哈希表数据库。它专为CRUD操作而设计,每个记录都有一个唯一的键:
- create(key,value):将键值对添加到数据存储区
- 读(键):查找与密钥关联的值
- 更新(键,value):更改密钥的现有值
- 删除(键):从数据存储区中删除(键,值)记录
值没有固定的模式,并且可以是从原始值到复合结构的任何内容。键值存储是高度分区的(因此水平缩放)。Redis是一个受欢迎的钥匙价值商店。
宽列数据存储
宽列商店具有表,行和列。但是列的名称及其类型对于同一表中的每一行可能是不同的。逻辑上,它是一个具有多维映射的版本的稀疏矩阵(行 - 值,列值,时间戳)。它就像一个二维键值存储,每个单元格值都有一个时间戳。
宽列数据存储是高度分区的。它具有存储在一起的列族的概念。单元格的逻辑坐标是:(行键,列名,版本)。物理查找如下:区域字典⇒列族目录⇒行键⇒列姓名⇒列限定符⇒版本。因此,宽列存储实际上是面向行的数据库。
Apache HBase是第一个开源广域数据存储。在实践中查看HBase,用于宽柱数据存储的核心概念。
文档数据存储
文档存储用于存储和检索由嵌套对象组成的文档。树结构,如XML,JSON和YAML。
在键值存储中,该值是不透明的。但是文档存储利用该值的树结构来提供更丰富的操作。MongoDB是文档商店的一个流行示例。
图形数据存储
图表数据库就像文档存储,但是为图形而不是文档树设计。例如,图形数据库将适合存储和查询社交连接网络。
neo4j是一个突出的图表数据库。在宽列商店上使用Janusgraph类型的索引也是很常见的。
用例
各种类型的NoSQL数据存储之间的样本是模糊的。偶尔,即使是SQL和NOSQL之间的线条是模糊的(PostgreSQL作为键值存储和PostgreSQL为JSON文档DB)。
数据存储可以通过为该数据类型添加索引和操作来传动以提供另一种类似的数据类型。初始柱状OLAP数据库是具有列存储索引的RDBMS。NoSQL商店相同,用于支持多种数据类型。
这就是为什么要考虑用例并选择适合您的应用程序的数据存储。用于多个用例的数据存储可能有助于减少开销。
具有适用于用例的内置操作的数据存储是首选(而不是在每个应用程序中实现这些操作)。
内存密钥值数据存储
与键值存储相同,但数据位于内存而不是磁盘上。它消除了磁盘IO开销,并用作快速缓存。
时间序列数据存储
时间序列是一系列数据点,由时间戳索引和订购。时间戳是时间序列数据存储中的关键。
时间序列可以建模:
- 键值:相关对时间戳和值对
- 宽柱:使用时间戳作为表的钥匙
具有来自编程语言的日期时间函数的宽专栏存储通常用作时间序列数据库。
在分析应用程序中,柱状数据库也可用于时间序列数据。
不可变分类帐数据集
不可变分类帐用于维护中央可信任权限所拥有的不变和(加密)可验证的交易日志。
从存储角度来看,一个宽的列商品就足够了。但是数据存储行动必须是不可变和可验证的。很少有数据存储(例如Amazon QLDB和Hyperlowger Fabric)目前满足这些要求。
地理空间数据存储
地理空间数据库是一个数据库,用于存储地理数据(例如国家,城市等)。它针对地理空间查询和几何操作进行了优化。
具有地理空间查询的宽列,键值,文档或关系数据库通常用于此目的:
- postgis扩展到postgreSQL
- MongoDB的Geojson对象
文本搜索数据存储
非结构化(自然)或半结构化文本的文本搜索是许多应用程序中的常见操作。文本可以是普通或富有的(例如pdf),存储在文档数据库中,或存储在Blob Store中。弹性搜索是一个流行的解决方案。
数据存储选择作弊表
鉴于这么多的数据类型,使用案例,选择,应用程序注意事项和云/ inum / insum约束,它可能会耗时来分析所有选项。下面的决策流程图是帮助您快速签名少数候选人。
等待学习做出选择所需的一切是不切实际的。这个作弊表将很少有合理的选择开始。它是通过设计简化的,并且不存在一些细微差别和选择。它针对召回而不是精度进行了优化。
概括
本文通过各种数据存储选择,并解释了如何根据以下方式选择:
- 应用:交易或分析
- 数据类型(SQL VS. NOSQL):结构化,半结构,非结构化
- 用例
- 部署:主要云提供商,在附近,供应商锁定考虑因素
资源:
- AWS上的数据库服务
- AWS白皮书:亚马逊Web服务概述 - 数据库
- 如何选择合适的数据库 - AWS技术内容系列
- 了解Azure数据存储型号
- Azure上的数据库类型
- 谷歌云数据库服务
- Google云平台上的数据生命周期和数据库选择
原文链接:https://towardsdatascience.com/datastore-choices-sql-vs-nosql-database-ebec24d56106)