草庐IT

2023年如何选择合适的数据库?

布加迪 2023-04-04 原文

译者 | 布加迪

审校 | 孙淑娟

数据库常常是应用系统中最大的性能瓶颈。一旦部署到生产环境中,就很难迁移,因此为应用系统选择合适的数据库至关重要。

做出正确决定的一个重要部分是知道面临哪些选择。数据库领域在过去几年迅速发生了变化,本文将试图探讨以下几个主题

  • 概述2023数据库生态系统。
  • 从技术角度阐述到底是什么因素使不同类型的数据库有不同的性能
  • 何时使用专用数据库何时使用通用数据库

2023年的数据库格局​

在深入研究之前,不妨看一下当前数据库生态系统以及各类数据库的市场份额

如您所,尽管NoSQL数据库被大肆宣传关系数据库仍是最常用的数据库类型。如果我们看看最近的趋势,排名告诉我们略有不同的情形

显示,在过去的两年中,关系数据库已被几种不同类型的数据库模型多少抢去了地盘。以下是一些日益被开发人员采用的主要数据库模型

  • 文档数据库
  • 图形数据库
  • 时间序列数据库
  • 列式数据库
  • 内存数据库
  • -值数据库
  • 搜索引擎数据库

什么让数据库有不同的性能?​

谈到数据库性能,没有什么神奇的因素使一数据库的性能优于另一数据库。计算机科学的所有事情一样,归结为让企业可以针对特定用例优化性能的权衡。具体就数据库而言,CAP定理很好地介绍了为调优性能而可能做出的一些权衡。

比如在NoSQL数据库的早期阶段其可扩展备受炒作,但代价通常是牺牲标准关系数据库提供的数据一致性保证。

影响数据库性能的其他一些设计因素包括如下:

  • 磁盘存储格式——数据库如何在硬盘驱动器上实际存储和组织数据对性能有重大影响。随着更多的公司开始存储用于分析工作负载的大量数据,以Parquet等基于列的格式在磁盘上存储数据越来越受欢迎。
  • 主索引数据结构——数据库如何索引数据也会对性能产生重大影响。数据库通常有存储引擎使用的主索引,然后允许用户定义辅助索引。简单来说,索引有助于提升读取性能,但为写入新数据点增加了开销。
  • 数据压缩——如何压缩数据将会影响到存储数据的成本以及数据库的查询性能。一些压缩算法旨在尽可能数据的大小。其他算法的压缩比可能较低,但在解压缩数据时速度更快,这意味着您可以获得更好的数据查询性能。
  • 热存储和冷存储——现在许多数据库系统允许数据在更快速更昂贵的热存储和更缓慢更便宜的存储之间移动。理论上,这可以为频繁查询的数据提供更好的性能,并节省存储成本,同时仍允许访问冷存储中的数据,而不是直接删除。
  • 持久性/灾难恢复——数据库如何处理灾难恢复对性能也有影响。设计数据库以应对各种故障通常会降低性能,因此对于些用例数据不是关键,偶尔丢失数据点也没关系)而言,数据库可以摈弃一些安全保证以获得更好的性能。

所有这些因素以及本文未提到的许多其他因素都会影响数据库的性能。通过调整这些因素,就可以针对非常具体的性能特征优化数据库,牺牲某些方面实际上不会成为问题,因为某些情况下不需要它们。

何时为您的应用系统使用专门的数据库?​

决定为您的应用系统使用哪个数据库牵涉很多因素。不妨看看为应用系统选择数据库时需要考虑的几个主要因素。

  • 数据访问模式

选择数据库的主要因素是如何创建和使用应用系统中的数据。最常见的入手途径莫过于确定您的工作负载是在线分析处理OLAP)还是在线事务处理(OLTP。OLAP工作负载以分析为中心,与关系数据库旨在处理的标准的OLTP工作负载相比,OLAP工作负载有不同的访问模式。OLAP查询通常只触及少数列来执行计算,可以通过使用为此设计的列式数据库进行优化。举例说,由于性能优势,大多数数据仓库构建在面向列的数据库之上。

旦大致确定了工作负载的类型,现在就需要考虑查询的延迟需求和写入数据的频率等方面。如果您的用例需要对监测之类的任务进行低延迟的近实时查询,可以考虑使用时间序列数据库,这种数据库旨在处理高写吞吐量,同时还允许在摄取数据后很快查询数据。

对于OLTP类型的工作负载而言,通常需要选择关系数据库还是文档数据库。这里的关键因素是查看数据模型,确定您是想要NoSQL文档数据库提供的模式灵活性,还是更喜欢关系数据库提供的一致性保证。

可能考虑的最后一是,您是否预计工作负载在一天中相当一致,还是会呈“突发式”,要求数据库偶尔处理大得多的读写量。在后一种情况下,就有必要使用这种数据库很容易扩增或缩减硬件,这样您不会大多数时候不需要的硬件而面临停运或高昂成本。

  • 内部知识

在决定使用什么数据库时,应该考虑到团队现有的技能组合。您需要确定使用专用数据库的潜在好处是否值得为此投入资源来培训团队学习如何使用它,是否值得为了学习新技术而牺牲生产力。

如果您知道构建的服务不需要针对性能全面优化,可以使用团队最熟悉的数据库来完成工作。另一方面,如果您知道性能很重要,克服采用新数据库带来的困难可能是值得的。

  • 架构复杂性

确保软件架构尽可能简单理想,因此系统添加另一个组件(比如新数据库应该与管理数据库将给系统增添的额外复杂性进行权衡。

如果您的应用系统非常适合专门的数据库,它可以充当应用系统数据的主数据库,那么这不是一个大问题。另一方面,如果您将使用通用的数据库作为应用系统的主存储,那么为一小部分数据添加一种额外的数据库可能不值得,除非您面临严重的性能问题。

结论​

数据库生态系统在迅速发展。虽然选择自己的数据库始终是不错的选择,但开发人员有必要密切关注一些新发布的技术,看看它们是否适合自己构建的系统搭建一种专门的数据库可以从许多方面帮助应用系统取得成功比如节省成本、为用户提升性能更容易扩展以及提高开发人员的生产力

原文标题:How to Choose the Right Database in 2023,作者:Charles Mahler​

链接:​https://thenewstack.io/how-to-choose-the-right-database-in-2023/​

有关2023年如何选择合适的数据库?的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  4. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  5. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  6. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  7. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  8. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  9. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  10. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

随机推荐