当前位置: 首页 > 科技观察

SQL或NoSQL:如何从12种数据存储中进行选择?

时间:2023-03-14 19:09:39 科技观察

如何选择数据库?也许,您评估用例是否需要关系数据库。根据答案,您可以选择您喜欢的SQL或NoSQL数据存储并使其运行。这是一个谨慎的策略:已知的魔鬼胜过未知的天使。选择正确的数据存储可以简化您的应用程序。错误的选择会增加摩擦。本文将帮助您扩展已知恶魔的列表。它包括以下内容:定义数据存储特征的数据库组件。按数据类型存储数据:非结构化、结构化(表格)和各种半结构化(NoSQL)类型。专用于各种用例的数据存储。决策流程图在预阶段和云替代方案的方向上导航景观。数据库深入了解数据库的工作原理有助于评估备选方案。数据库有5个组件:接口、查询处理器、元数据、索引和存储:接口语言或API:每个数据库定义一种语言或API来与之交互。它涵盖了数据和事务的定义、操作、查询和控制。查询处理器:数据库的“CPU”。它的工作是处理传入的请求、执行所需的操作并返回结果。存储:存储数据的磁盘或内存。索引:一种数据结构,可以在存储中快速定位查询到的数据。元数据:存储的数据的元数据。和索引(例如目录、模式、大小)。查询处理器对每个传入请求执行以下步骤:将请求作为元数据进行解析和验证。创建一个利用索引的高效执行计划。读取或更新存储。更新元数据和索引。计算并返回结果。为确保数据存储符合您的应用程序需求,您需要仔细检查:接口支持的操作。如果你需要的计算是内置的,你需要写更少的代码。块存储Blob存储。在下一节中,让我们检查各种数据类型的数据存储中的操作和索引。块存储Blob存储。文件系统是最简单、最古老的数据存储方式。我们每天都用它来存储各种数据。BlobStorage是一种超分布式版本化文件系统,用于存储非结构化数据。Blob是二进制大对象。您可以存储任何类型的数据。因此,Blob数据存储在解释数据方面没有任何作用:Blob支持文件级别的CRUD(创建、读取、更新、删除)操作。目录或文件路径是索引。因此,您可以快速查找和读取文件。但是在文件中查找内容需要顺序扫描。文档、图像、音频和视频文件存储在blob中。表格数据存储表格数据存储适用于存储结构化数据。每条记录(行)具有相同类型的相同类型的属性(列)。有两种应用程序:联机事务处理(OLTP):实时捕获、存储和处理来自事务的数据。联机分析处理(OLAP):分析来自OLTP应用程序的聚合历史数据。OLTP应用程序需要支持低延迟读取和写入单个记录的数据存储。OLAP应用程序需要支持高吞吐量读取大量(只读)记录的数据存储。关系数据库或面向数据库关系数据库管理系统(RDBMS)是最早的数据存储之一。数据以表的形式组织。用于减少数据冗余和更好的数据完整性的表规范化。一个表可能有主键和外键:主键是一个最小的属性(列),它唯一标识表中的一条记录(行)。外键建立表之间的关系。它是一个表中的一组属性,这些属性引用另一个表的主键。关系数据库针对事务操作进行了优化。事务通常会更新多个表中的多个记录。索引针对频繁的低延迟写入进行了ACID优化:原子性:更新多行的任何事务都被视为一个单元。成功的事务执行所有更新。失败的事务不执行任何更新,即数据库未更改。一致性:每个事务都会使数据库从一种有效状态变为另一种有效状态。它保证维护所有数据库不变量和约束。隔离性:在事务顺序执行的情况下,多个事务的并发执行使数据库处于与事务执行相同的状态。持久性:提交的事务是永久性的,并且在系统崩溃后仍然存在。有很多选择:非云:Oracle、MicrosoftSQLServer、IBMDB2、PostgreSQL和MySQLAWS:在关系数据库服务(RDS)中托管PostgreSQL和MySQLMicrosoftAzure:将SQLServer托管为AzureSQL数据库GoogleCloud:在CloudSQL中托管PostgreSQL和MySQL,并水平扩展CloudSpanner列式数据库虽然事务是行(记录),但分析属性是在列(属性)上计算的。OLAP应用程序需要对表进行优化的列读取操作。一种方法是将面向列的索引添加到关系数据库中。例如:MicrosoftSQLServer中的ColumnStore索引ColumnStore索引在postgreSQL中但是,主要的RDBMS操作是具有低延迟的高频酸性事务。这不会扩展到分析应用程序中常见的大数据规模。对于大数据,存储在blob存储数据湖中已变得流行。部分分析摘要在OLAP多维数据集中进行计算和维护。列存储的大小和性能的进步已经使OLAP在许多方面都过时了。但是这些概念仍然是关于设计数据管道的。现代数据仓库建立在列式数据库之上。数据按列而不是行存储。可用选项有:AWS:redshiftAzure:synapse。GoogleCloud:bigqueryApache:Druid、kudu、pinot其他:Clickhouse、SnowflakeDatabricksDeltaLake为数据湖中的数据提供类似的列存储性能。SQL与NoSQL:NoSQL和SQL之间的差异NoSQL非关系数据存储有两个原因:RDBMS不能针对大数据进行水平扩展并非所有数据都适合严格的RDBMS架构NoSQL数据存储在各种CAP定理权衡中提供水平扩展。根据CAP定理,分布式数据存储最多可以提供以下3种保证中的2种:一致性:每次读取都会收到最近的写入或错误。可用性:无论节点的各个状态如何,每个请求都会得到(非错误)响应。分区容错性:尽管节点之间的网络丢弃(或延迟)了任意数量的消息,集群也不会失败。请注意,CAP定理和ACID事务中一致性的定义是不同的。ACID一致性是关于数据完整性的(数据在每次事务后与关系和约束保持一致)。CAP是关于在任何给定时间彼此一致的所有节点的状态。只有少数NoSQL数据存储是ACID。大多数NoSQL数据存储都支持一个底层模型:基本可用性:数据在许多存储系统之间进行复制,并且大部分时间都可用。软状态:副本并不总是一致的;因此,状态可能只是部分正确,因为它可能尚未融合。最终一致性:数据在未来某个时间点是一致的,但不保证。NoSQL和SQL数据库之间的区别是:数据:SQLDBS适用于严格遵守关系模式的标准化结构化(表格)数据。事务:所有SQLDBS都支持酸性事务,但大多数NoSQL数据存储都提供底层事务。CAP权衡:SQLDBS将一致性放在首位。但是,NoSQL数据存储通常优先考虑可用性和分区容错性(水平缩放)并提供最终一致性。NoSQLforsemi-structureddatatypes:NoSQL数据存储迎合半结构化数据:键值、宽列、文档(树)和图形。键值数据存储键值存储是字典或哈希表数据库。它是为CRUD操作而设计的,每条记录都有一个唯一的键:create(key,value):将键值对添加到数据存储中read(key):查找与键关联的值update(key,value):更改delete(key)的现有值:从数据存储中删除一条(key,value)记录值没有固定的模式,可以是从原始值到复合结构的任何值。键值存储是高度分区的(因此可以水平扩展)。Redis是一种流行的键值存储。宽列数据存储宽列存储有表、行和列。但是对于同一表中的每一行,列的名称及其类型可能不同。从逻辑上讲,它是一个具有多维映射版本(行值、列值、时间戳)的稀疏矩阵。它就像一个二维键值存储,每个单元格值都有一个时间戳。宽列数据存储是高度分区的。它具有存储在一起的列族的概念。单元格的逻辑坐标为:(行键、列名、版本)。物理查找如下:RegionDictionary?ColumnFamilyDirectory?RowKey?ColumnName?ColumnQualifier?Version。因此,宽列存储实际上是面向行的数据库。ApacheHBase是第一个开源广域数据存储。查看HBase实践,宽列数据存储的核心概念。文档数据存储文档存储用于存储和检索由嵌套对象组成的文档。树结构,如XML、JSON和YAML。在键值存储中,值是不透明的。但是文档存储利用值的树结构来提供更丰富的操作。MongoDB是文档存储的一个流行示例。图形数据存储图形数据库类似于文档存储,但专为图形而不是文档树而设计。例如,图数据库适合存储和查询社交网络。neo4j是一个著名的图形数据库。在宽列存储上使用Janusgraph类型索引也很常见。各种类型的NoSQL数据存储之间的用例示例是模糊的。有时,甚至SQL和NoSQL之间的界限也很模糊(PostgreSQL作为键值存储,PostgreSQL作为JSON文档数据库)。数据存储可以通过向该数据类型添加索引和操作来提供另一种类似的数据类型。最初的列式OLAP数据库是带有列存储索引的RDBMS。NoSQL存储对于支持多种数据类型是相同的。这就是为什么考虑您的用例并为您的应用程序选择正确的数据存储很重要。多个用例的数据存储可能有助于减少开销。首选具有适合用例的内置操作的数据存储(而不是在每个应用程序中实现这些操作)。内存中的键值数据存储与键值存储相同,但数据驻留在内存中而不是磁盘上。它消除了磁盘IO开销并充当快速缓存。时间序列数据存储时间序列是一系列数据点,按时间戳进行索引和排序。时间戳是时间序列数据存储的关键。时间序列可以建模:key-value:相关的时间戳对和值对widecolumn:使用时间戳作为表的键widecolumnstorewithdatetimefunctionsfromprogramminglanguages通常被用作时间序列数据库。在分析应用中,列式数据库也可以用于时间序列数据。不可变分类账数据集不可变分类账用于维护由中央可信机构拥有的不可变且(加密)可验证的交易日志。从存储的角度来看,一个宽列项目就足够了。但是数据存储操作必须是不可变的和可验证的。目前很少有数据存储(例如AmazonQLDB和HyperlowgerFabric)满足这些要求。地理空间数据存储地理空间数据库是存储地理数据(如国家、城市等)的数据库。它针对地理空间查询和几何操作进行了优化。具有地理空间查询的宽列、键值、文档或关系数据库通常用于此目的:postgis扩展到postgreSQLMongoDB的Geojson对象文本搜索数据存储非结构化(自然)或半结构化文本的文本搜索是许多应用程序程序中的常用操作。文本可以是普通的或丰富的(例如pdf),存储在文档数据库中,或存储在blob存储中。Elasticsearch是一种流行的解决方案。数据存储选择备忘单鉴于如此多的数据类型、用例、选择、应用注意事项和云/inum/insum限制,分析所有选项可能很耗时。下面的决策流程图是为了帮助您快速签下少量候选人。等待学习你需要的一切来做出选择是不现实的。这个备忘单将从很少的合理选择开始。它通过设计进行了简化,并且缺少一些细微差别和选项。它针对召回率而非精确率进行了优化。本文概述了各种数据存储选择,并解释了如何根据以下因素进行选择:应用程序:事务性或分析性数据类型(SQLVS.NOSQL):结构化、半结构化、非结构化用例部署:主要云提供商,在附近,供应商锁定-inConsiderationsResources:DatabaseServicesonAWSAWSWhitePaper:AmazonWebServicesOverview-DatabasesHowtoChoosetheRightDatabase-AWSTechnicalContentSeriesLearnaboutAzureDataStorageModelsDatabaseTypesonAzureGoogleCloudDatabaseServicesGoogleCloudPlatform原文上的数据生命周期和数据库选择链接:https://towardsdatascience.com/datastore-choices-sql-vs-nosql-database-ebec24d56106)