Code前端首页关于Code前端联系我们

NoSQL 还是 SQL?不同业务领域下存储技术选型参考

terry 2年前 (2023-09-26) 阅读数 80 #数据库

本文将分析传统数据库存在的一些问题,以及有多少种NoSQL可以解决这些问题。希望为您提供不同业务情况下的存储技术选择。表明。

传统数据库的缺点

传统数据库有以下缺点:

  • 大数据领域I/O较高,因为数据只存储在一行中,所以相关数据会读取到整行数据从存储设备进入内存,产生高I/O。
  • 存储行记录,不能存储数据结构。
  • 表的结构难以扩展。 如果要更改表结构,需要执行DDL(数据定义语言)和更改语句。变更期间,表将被锁定,部分服务将不可用。
  • 全文检索功能较弱,在链接数据下,只能进行子箭头匹配查询。由于表中的数据增长缓慢,即使有索引,匹配相同的查询也会很慢。向下。此外,关系数据不应引用文本字段。
  • 存储和处理复杂关系数据的能力较弱,许多应用程序需要理解和导航大量关系数据之间的关系,以实现社交应用、引擎呈现、欺诈检测、知识图谱、生命科学和IT/网络等用例。然而,传统的关系数据库不擅长管理数据点之间的关系。表格数据模型和严格的模式使他们难以添加新的或相关类型的信息。

NoSQL解决方案

NoSQL,泛指非关系型数据库,可以认为是SQL的补充。

虽然NoSQL的性能在很多方面都比非关系型数据库好很多,但它往往会缺少一些特性。最常见的是商业图书馆缺乏交易功能。

正确执行数据库事务的四个基本ACID要素如下:

NoSQL还是SQL?不同业务场景下存储技术选型方面的参考

下面介绍NoSQL的5大类数据为传统关系数据库提供的错误和解决方案: 列 列数据采用列关系存储系统进行数据存储的数据库,特别适合实时处理数据和请求。

兼容行数据。数据是在存储系统中相对于行分配的空间。它最适合小数据处理,通常用于在线事务数据处理。

基于列式数据库的列式存储特性,可以解决关系型数据库在某些情况下的高I/O问题。

基本原理

传统关系数据库按照行存储数据,称为“行数据库”,而列式数据库按照列存储数据。

存储系统中存储表的方式有两种,我们大多数使用行存储。行存储将行放置到连续的物理位置,例如标准文件和记录系统。

列存储方式将数据按照列存储在数据库中,与行存储类似。下图是两种存储方式的图解说明:

NoSQL还是SQL?不同业务场景下存储技术选型方面的参考

常见列式数据库

NoSQL还是SQL?不同业务场景下存储技术选型方面的参考

HBase:是一个开源非关系型分布式数据库(NoSQL),参考Google BigTable建模。使用的编程语言是Java。

它是Apache软件基金会Hadoop项目的一部分,运行在HDFS文件系统上,为Hadoop提供BigTable风格的服务。因此它可能会错误地存储大量数据。

NoSQL还是SQL?不同业务场景下存储技术选型方面的参考

BigTable:是一个基于Google文件系统(GFS)的稳定、高性能、高可扩展的数据存储系统,用于存储大规模结构化数据,适用于云计算。

相关特性

优点如下:

高效的存储空间利用: 由于算法不同,列式数据往往比行式数据具有更高的容量。更高的生产率。

典型的行数据压缩比约为3:1至5:1,而压缩比约为8:1至30:1。列数据的压缩。

比较常见的是使用字典表来压缩数据:以下是表的实际形式。字典表中的数据经过压缩后,表中的所有字符串都变成了数字。

由于每个字符串在字典表中只出现一次,因此达到了压缩(如Normalize和Denormalize规范化和反规范化)的目的。

NoSQL还是SQL?不同业务场景下存储技术选型方面的参考

高级查询行为:从多个数据库读取同一列非常高效,因为这些列存储在一起,并且所有指定的列都可以读入一个磁盘上的内存中。

下图通过查询过程展示了列式存储(以及数据压缩)的优势。

NoSQL还是SQL?不同业务场景下存储技术选型方面的参考

执行步骤如下:

  • 去字典表中查找与字符串匹配的数字(只进行一次字符串比较)。
  • 使用数字来匹配列表,并将相应位置设置为1。
  • 使用此订阅来收集最新产品。

列数据适合采集操作,适合大数据而不是小数据。

缺点如下:

  • 不适合小数据扫描。
  • 不适合随机更新。
  • 不适合删除、更新等实时操作。
  • 单线是酸性的。对于多行事务,不支持事务回滚。它支持I(Isolation)隔离(串行事务提交)、D(Durability)持久性、A(Atomicity)不安全。 )原子性,C(一致性)。

使用场景

以HBase为例:

  • 数据量大(100s TB数据),需要快速随机访问。
  • 编写应用程序,每天写入量较大但读取量较小的应用程序,例如IM历史消息、游戏日志等。数据。
HBase 仅支持基于 rowkey 的查询。对于HBase来说,单条记录或者小查询是可以接受的。由于分段原因,大型查询可能会影响性能。 HBase不适合具有聚合、多级索引和复杂表关系的数据模型。

  • 高性能、高可靠性的应用, 由于HBase本身没有单点故障,可用性非常高。
  • 对于数据量大、且增长不可预测的应用,需要优雅数据库扩展的HBase支持在线扩展。即使一段时间内数据量大幅增加,也可以使用HBase进行扩展来满足工作负载。
  • 存储结构化和半结构化数据。
  • K-V数据库

    是指采用键值存储的数据库,数据以键对的形式组织、索引、存储。

    K-V存储非常适合没有过多数据连接和商业连接的数据。同时可以有效减少磁盘读写次数。它比SQL数据库存储具有更好的读写能力,可以解决无法保存数据库结构的问题。问题。

    标准 K-V 数据库

    NoSQL还是SQL?不同业务场景下存储技术选型方面的参考

    Redis: 是一个开源、支持网络、基于内存、非脚本的成对数据库 ANSI C。

    从2015年6月起,Redis的开发由Redis Labs支持,2013年5月至2015年6月,其开发由Pivotal支持。

    2013年5月之前,其开发由VMware支持。根据每月排名网站 DB-Engines.com 的数据,Redis 是最重要的销售数据库。

    NoSQL还是SQL?不同业务场景下存储技术选型方面的参考

    Cassandra: Apache Cassandra(社区中通常称为C*)是一个开源分布式NoSQL数据库系统。

    它最初是由 Facebook 开发的,用于存储像收件箱一样的简单表单数据,结合了 Google BigTable 模型和 Amazon Dynamo 的完全分布式架构。

    Facebook 在 2008 年将 Cassandra 开源,从那时起,Cassandra 就因其良好的可扩展性和性能而被使用。

    受到Apple、Comcas、Instagram、Spotify、eBay、Rackspace、Netflix等热门网站的认可,成为流行的结构化数据存储解决方案。

    NoSQL还是SQL?不同业务场景下存储技术选型方面的参考

    LevelDB:是Google开发的Key/Value Pair嵌入式数据库管理系统库,在BSD开源许可下发布。

    相关特性

    以Redis为例,K-V数据库的优势如下:

    • 高性能:Redis可以支持超过10W的TPS。
    • 丰富的数据类型:Redis 支持包括 String、Hash、List、Set、Sorted Set、Bitmap 和 Hyperloglog。
    • 丰富的功能: Redis还支持发布/订阅、通知、密钥过期等功能。

    缺点如下:

    • 对于 ACID,Redis 事务不能支持原子性和持久性(A 和 D),仅支持隔离性和不变性(I 和 C)。

    特别说明,这里无法保证原子性是指Redis事务操作,因为事务不支持重试,而且由于Redis的单线程模型,正常的Redis操作都是原子性的。这。

    大部分​​公司不需要严格遵守ACID规则,比如实时比赛顺序、粉丝关注度等条件。即使某些数据保留失败,对业务的影响也很小。因此,在设计解决方案时,必须根据企业的特点和需求进行选择。

    应用领域

    适用领域:

    • 存储用户信息(如会话)、配置文件、参数、购物车等。

    不适用字段:

    • 需要按值查询,而不是按键查询。 无法查询Key-Value数据库中的值。
    • 数据之间的关系需要保留。 数据不能与键值数据库中的两个或多个键关联。
    • 需要谈判支持。 当Key-Value数据库出现故障时,无法恢复。

    文档数据库

    文档数据库(也称为文档数据库)是一种旨在将半结构化数据存储为文档的数据库。文档数据库通常以 JSON 或 XML 格式存储数据。

    由于文档数据的无模式性质,可以存储和读取任意数据。

    由于使用的数据格式是JSON或BSON,由于JSON数据是自描述的,因此在使用它们之前不需要定义字段。读取JSON中不存在的字段不会像SQL那样产生语法错误,并且可以解析连接。 Schema数据库表结构扩展不当的问题。

    通用文档数据库

    NoSQL还是SQL?不同业务场景下存储技术选型方面的参考

    MongoDB:是一个用C++编写的面向文档的数据库管理系统,用于解决应用程序开发社区中的许多实际问题。 2007年10月,MongoDB由10gen团队开发。它于 2009 年 2 月首次推出。

    NoSQL还是SQL?不同业务场景下存储技术选型方面的参考

    CouchDB: Apache CouchDB 是一个专注于易用性的开源数据库,已成为“Web 优先数据库”。

    这是一个NoSQL数据库,使用JSON作为存储格式,JavaScript作为查询语言,MapReduce和HTTP作为API。

    独特的功能之一是多​​主复制。 CouchDB 的第一个版本于 2005 年发布,并于 2008 年成为 Apache 项目。

    相关特性

    以MongoDB为例,文档数据库的优点如下:

    • 添加字段简单,无需更改DDL系统。就像关系型数据库一样,程序代码可以直接读写。
    • 轻松匹配历史数据。 对于历史数据,即使没有新增字段,也不会导致错误,只是返回空值。此时,代码可能是兼容的。
    • 易于存储复杂数据,JSON是一种功能强大的描述语言,可以描述复杂的数据结构。

    相比传统的关系型数据库,文档数据库的缺点是对多条数据记录的事务支持最弱,体现在以下几个方面:

    • Atomicity(原子性),支持单个数字/原子文档,并且不支持多个原子、多个文档或多条语句。
    • Isolation(隔离),隔离级别仅支持读提交级别,这会导致不可恢复读和幻读。
    • 不支持复杂查询,例如join查询。如果需要访问请求,则需要对数据库进行多次处理。

    MongonDB 还支持多个文档的收缩和事务持久化。虽然官方已经宣布MongoDB将在4.0版本正式开始支持多ACID事务,但最终的实现还有待观察。

    使用范围

    适用历史:

    • 数据量较大或将来会很大。
    • 表格结构模糊,领域不断增长,例如内容管理系统、信息管理系统。

    不适用的历史记录:

    • 交易需要添加到不同的文档中。 面向文档的数据库不支持文档之间的事务。
    • 多个文档之间需要复杂的问题,例如连接。
    全文搜索引擎

    传统关系数据库使用索引主要是为了达到快速查询的目的。在全文搜索引擎中,索引是无效的。这体现在:

    • 全文搜索条件可以随意排列组合。 如果对推荐满意,推荐的数量是非常多的。
    • 不能满足于索引全文检索的模糊匹配方式,所以只能作为查询使用,而查询就是查全表,效率很低。

    全文搜索引擎的出现就是为了解决关系型数据库全文检索操作弱的问题。

    基本原理

    全文搜索引擎的技术原理称为“倒排索引”,是一种索引的方法。基本规则是设置从单词到文档的指针。相反的是“前向索引”,其基本原则是用文字引用文档。

    目前有以下文档集合:

    NoSQL还是SQL?不同业务场景下存储技术选型方面的参考

    正向索引写法如下:

    NoSQL还是SQL?不同业务场景下存储技术选型方面的参考

    如上所示,正向索引适合查询文档内容。 -根据文档名称来查询文档。一个简单的反向索引如下:

    NoSQL还是SQL?不同业务场景下存储技术选型方面的参考

    带词频的反向索引如下:

    NoSQL还是SQL?不同业务场景下存储技术选型方面的参考

    由上可见,反向索引适合根据关键词查询文档内容。

    自定义全文搜索引擎

    NoSQL还是SQL?不同业务场景下存储技术选型方面的参考

    Elasticsearch:是一个基于Lucene的搜索引擎。它提供了一个可扩展、多租户的全文搜索引擎,具有 HTTP Web 和无架构 JSON 文件。

    Elasticsearch 使用 Java 开发,并根据 Apache 许可证条款作为开源发布。

    根据 DB-Engines 排名,Elasticsearch 是最受欢迎的企业搜索引擎,其次是基于 Lucene 的 Apache Solr。

    NoSQL还是SQL?不同业务场景下存储技术选型方面的参考

    Solr:是来自 Apache Lucene 项目的开源企业搜索平台。其主要功能是全文搜索、人工注释、模式搜索、动态聚类、数据集成和文本处理(如Word、PDF)。 Solr 具有高度可扩展性,并提供搜索和索引复制。

    相关特性

    以Elasticsearch为例,全文搜索引擎的优势如下:

    • 查询性能高,数据处理过程紧密。
    • 可扩展性,基于集群环境,可轻松水平扩展,可承载PB数据。
    • 高可用性,Elasticsearch集群弹性,它们会发现新的或故障的节点,组织和平衡数据,确保数据安全且可访问。

    缺点如下:

    • 缺乏ACID支持,单文档数据为ACID,多文档事务不支持正常恢复,支持基于乐观锁的I(Isolation)机制) ,D(durability)持久性,A(Atomicity)原子性,C(Consistency)不支持。
    • 对同一数据库上使用外键的复杂多表连接操作的支持较弱。
    • 读写有延迟。 写入的数据最快1秒下载完毕。
    • 更新操作较低,基本应用是先删除数据,然后插入新数据。
    • 占用大量内存,因为Lucene将索引部分加载到内存中。

    使用场景

    适用场景如下:

    • 搜索引擎和数据分析。
    • 全文搜索、结构化搜索、数据分析。
    • 它对海量数据进行近乎实时的处理,并且可以将大量数据分布在多个服务器上进行存储和检索。

    不适用的领域如下:

    • 数据需要经常更新。
    • 需要复杂的相关问题。
    图数据库

    NoSQL还是SQL?不同业务场景下存储技术选型方面的参考

    图数据库应用图论来存储有关实体之间关系的信息。最常见的例子是社交网络中人与人之间的关系。

    关系数据库在存储“关系”数据方面效率不是很高,而且它们的查询复杂、缓慢且超出预期。

    图数据库的独特设计填补了这一空白,解决了与存储和处理复杂关系数据相关的数据库漏洞问题。

    常用图数据库

    NoSQL还是SQL?不同业务场景下存储技术选型方面的参考

    Neo4j:是Neo4j, Inc.开发的图数据库管理系统。其开发人员将其描述为符合 ACID 的业务数据库,具有最流行的 graph4j 存储和处理功能。数据库按 DB-Engine 的顺序排列。

    NoSQL还是SQL?不同业务场景下存储技术选型方面的参考

    ArangoDB: 是由 triAGENS GmbH 开发的具有本机模型的数据库系统。数据库系统支持三种重要的数据模型(键/值、文档、图),其中包含基础架构和AQL语言(ArangoDB查询语言)。

    查询语言是声明性的,允许将不同的数据访问模式组合成单个查询。 ArangoDB 是一个 NoSQL 数据库系统,但 AQL 在很多方面与 SQL 相似。

    NoSQL还是SQL?不同业务场景下存储技术选型方面的参考

    Titan:是一个可扩展的图形数据库,用于存储和查询分布在多个机器集群上的数十亿个顶点和边的图形。

    Titan 是一个事务数据库,可以支持数千个用户实时执行复杂的图形导航。

    相关功能

    以Neo4j为例,Neo4j在模型中使用了数据结构图的概念。 Neo4j 中两个最基本的概念是节点和边。

    节点表示实体,边表示实体之间的关系。节点和边都有自己的属性。不同的实体通过各种关系连接起来,形成复杂的对象图。

    对于链接数据,两种数据存储结构是不同的:

    NoSQL还是SQL?不同业务场景下存储技术选型方面的参考

    Neo4j在存储节点时采用“无索引索引”,即每个节点都有一个指向“邻居节点”的指针,我们可以看到。 O(1) 时间内的邻居节点。

    另外,根据官方的说法,边是Neo4j中最重要的东西,即“第一类实体”,所以是单独存储的。这对于提高遍历图形时的速度很有用,并且可以轻松地向任何方向移动。做一个遍历。

    NoSQL还是SQL?不同业务场景下存储技术选型方面的参考

    优点如下:

    • 高性能,图遍历是数据图结构特有的算法,即从节点开始,根据其与连线的关系,可以快速、轻松寻找。相邻节点退出。这种搜索数据的方法不受数据库大小的影响,因为封闭查询总是搜索有限的本地数据库,而不是搜索整个数据库。设计灵活性
    • 、数据结构的自然可扩展性以及非结构化数据格式使图数据库设计具有可扩展性且易于理解。因为条件变化时添加的节点、关系和属性不会影响原始数据的正常使用。
    • 开发技巧,直观清晰的数据模型,从需求讨论,到程序开发实施,最后如何入库,看起来没有任何变化。 ,甚至可以说,本来就是一样的。
    • 完全支持ACID,与其他NoSQL数据库不同,Neo4j还具有完整的事务管理功能,完全支持ACID事务管理。

    的缺点如下:

    • 对支持的节点、连接和属性的数量有限制。
    • 不支持分区。

    使用领域

    适用场景如下:

    • 在密切相关的数据中,例如社交网络。
    • 推荐引擎。如果我们以图形方式呈现数据,将对制定建议非常有帮助。

    不适用的情况如下:

    • 记录基于事件的数据(例如日志条目或传感器数据)。
    • 制作一个大型分布式数据库,类似于Hadoop。
    • 适用于关系数据库中存储的结构化数据。
    • 二进制数据存储。

    总结

    在选择关系型数据库和NoSQL数据库时,往往需要考虑几个指标:

    • 数据量
    • 并发度
    • 实时读写板块及类型
    • 安全性
    • 服务及维护费用

    常用软件系统数据选择参考如下:

    • 内部使用的管理系统, 数据越来越少。第一个选项是考虑连接类型。
    • 对于大流量系统,比如电商单品页面,可以考虑选择后端的连接类型和前端的内存类型。
    • 日志类型结构,对于原始数据考虑列选择,对于日志搜索考虑反向索引。
    • 基于搜索的系统,例如站点搜索、非全局搜索,例如产品搜索,考虑选择反向链接类型,并考虑侧之间反向索引。
    • 事务系统,如枚举、事务、记账等,考虑关系型+缓存+一致性协议的选择。
    • 在线计算,对于广泛的数据分析,您还可以考虑选择列或关系类型。
    • 实时计算,实时监控,可以考虑选择内存或列中的数据。

    在设计的实施中,我们必须基于业务驱动的需求和架构。任何 RDB/NoSQL/DRDB 都必须基于查询。最终的数据存储解决方案应该是一个具有各种权衡的完整设计。 ? — Redis官方文档

  • MongoDB如何实现事务的ACID? ? 基本概念介绍
  • NoSQL数据库,为什么要使用它,应该选择哪些数据库
  • 传统关系数据库和分布式数据库的知识
  • 作者:陈彩华♻

    版权声明

    本文仅代表作者观点,不代表Code前端网立场。
    本文系作者Code前端网发表,如需转载,请注明页面地址。

    发表评论:

    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

    热门