分享至

简介

数据库是许多现代应用程序和工具的重要组成部分。作为用户,您每天可能与数十或数百个数据库交互,例如访问网站、使用手机应用程序或在杂货店购买商品。作为开发人员,数据库是用于将数据持久化到应用程序生命周期之外的核心组件。但是,数据库到底是什么,为什么它们如此普遍?

在本文中,我们将介绍

  • 什么是数据库
  • 人们和应用程序如何使用它们来跟踪各种数据
  • 数据库提供了哪些功能
  • 他们做出了哪些类型的保证
  • 它们与其他数据存储方法相比如何

最后,我们将讨论应用程序如何依赖数据库来存储和检索数据,以实现复杂的功能。

什么是数据库?

数据库 是用于组织和存储数据以供将来处理、检索或评估的逻辑结构。在计算机环境中,这些结构几乎总是由称为 数据库管理系统DBMS 的应用程序管理。DBMS 管理计算机磁盘上的专用文件,并为用户和应用程序提供逻辑接口。

数据库管理系统通常被设计为根据特定模式组织数据。这些模式称为 数据库类型 或数据库模型,是决定如何存储和管理各个数据片段的逻辑和结构基础。数据库类型有很多种,每种类型都有其自身的优点和局限性。 关系模型(将数据组织到交叉引用的表格、行和列中)通常被认为是默认范式。

DBMS 可以通过多种方式访问它们管理的数据库,包括命令行客户端、API、编程库和管理界面。通过这些渠道,可以将数据导入系统、根据需要进行组织,并在需要时返回。

数据持久化与瞬态存储

数据库将数据存储在磁盘或内存中。

磁盘存储通常被认为是 持久化 的,这意味着即使数据库应用程序或计算机本身重启,数据也会被可靠地保存以供以后使用。

相反, 内存存储 被认为是 瞬态易失性 的。瞬态存储在应用程序或系统关闭后不会保留。内存数据库的优点是它们通常速度非常快。

在实践中,许多环境将使用这两种类型的系统的混合,以获得每种类型的优势。对于接受写入瞬态层的系统,这可以通过定期将瞬态数据保存到磁盘来实现。其他系统使用持久化数据的只读内存副本来加快读取访问速度。这些系统可以随时从支持存储重新加载数据以刷新其数据。

支持存储类型数据在重启后会保留吗?优势示例
磁盘数据持久性MySQL
内存操作速度memcached

与数据库交互以管理您的数据

虽然数据库系统负责如何在磁盘或内存中存储数据,但它也为用户或应用程序提供接口。数据库的接口必须能够表示外部方可以执行的操作,并且必须能够表示系统支持的所有数据类型。

根据 维基百科,数据库通常允许以下四种类型的交互

  • 数据定义:创建、修改和删除数据结构的定义。这些操作会更改影响数据库如何接受和存储数据的属性。这在某些类型的数据库中比其他类型更重要。
  • 更新:在数据库中插入、修改和删除数据。这些操作会更改正在管理的实际数据。
  • 检索:提供对存储数据的访问权限。可以按原样检索数据,也可以经常对其进行过滤或转换以将其整理成更有用的格式。许多数据库系统理解丰富的查询语言来实现这一点。
  • 管理:其他任务,例如用户管理、安全、性能监控等,这些任务是必要的,但与数据本身没有直接关系。

让我们更详细地介绍以下内容。

数据定义控制系统内数据的形状和结构

在数据库中创建和控制数据的结构是数据库管理的重要组成部分。这可以帮助您在将数据导入系统之前控制数据的形状或结构。它还可以让您设置约束,以确保您的数据符合某些参数。

在以高度规范数据运行的数据库中,例如关系数据库,这些定义通常被称为数据库的模式。数据库模式是关于数据如何格式化才能被特定数据库接受的严格概要。这涵盖了单个记录中必须存在的特定字段,以及数据类型、字段长度、最小或最大值等值的特定要求。数据库模式是数据库所有者用来影响和控制将存储在系统中的数据的最重要工具之一。

重视灵活胜过规律的数据库管理系统通常被称为无模式数据库。虽然这似乎暗示这些数据库中存储的数据没有结构,但通常情况并非如此。相反,数据库的结构由数据本身以及应用程序对数据的了解和关系决定。数据库通常仍然遵循一定的结构,但数据库管理系统在实施约束方面参与较少。这是一个设计选择,在不同的情况下有优点和缺点。

数据更新,用于将数据导入、修改和从系统中删除数据

数据更新包括任何操作,即

  • 将新数据输入系统
  • 修改现有条目
  • 从数据库中删除条目

这些功能对任何数据库都至关重要,在许多情况下,构成了数据库系统处理的大多数操作。这些类型的活动——导致系统中数据发生更改的操作——统称为写入操作

写入操作对于任何会随时间推移而发生变化的数据源都非常重要。即使删除数据,一项破坏性操作,也被认为是写入操作,因为它修改了系统中的数据。

由于写入操作可以更改数据,因此这些操作可能很危险。大多数数据库管理员配置其系统以将写入操作限制为某些应用程序进程,以最大限度地减少意外或恶意数据损坏的可能性。例如,数据分析使用现有数据来回答有关网站性能或访问者行为的问题,只需要读取权限。另一方面,记录用户订单的应用程序部分需要能够将新数据写入数据库。

检索数据以提取信息或回答特定问题

除非您有办法在需要时检索数据,否则存储数据并没有什么用。由于返回数据不会影响当前存储在数据库中的任何信息,因此这些操作称为读取操作。读取操作是从数据库中收集已存储数据的首要方式。

数据库管理系统几乎总是有一种通过唯一标识符访问数据的方法,通常称为主键。这允许通过提供键来访问任何一个条目。

许多系统还拥有查询数据库以返回与特定条件匹配的数据集或返回有关条目的部分信息的复杂方法。这种查询灵活性有助于数据库管理系统除了其基本的数据存储功能之外,还能充当数据处理器。通过开发特定的查询,用户可以提示数据库系统仅返回他们需要的信息。此功能通常与写入操作一起使用,通过属性定位和修改特定记录。

管理数据库系统以确保一切顺利运行

数据库通常支持的最后类别是管理功能。这是一类广泛的通用操作,有助于支持数据库环境,而不直接影响数据本身。此组中可能包含的一些项目包括

  • 管理用户、权限、身份验证和授权
  • 设置和维护备份
  • 配置存储的备份介质
  • 管理复制和其他扩展注意事项
  • 提供在线和离线恢复选项

这组操作与任何现代应用程序中常见的基本管理问题一致。

管理操作可能不是核心数据管理功能的核心,但这些功能通常将类似的数据库管理系统区分开来。能够轻松备份和恢复数据、实施与现有系统挂钩的用户管理,或者扩展数据库以满足需求,对于在生产环境中运行来说都是必不可少的特征。未能关注这些领域的数据库往往难以在现实世界环境中获得采用。

数据库承担哪些责任?

鉴于上述描述,我们如何概括数据库承担的主要责任?答案很大程度上取决于使用的数据库类型和应用程序的要求。即使如此,所有数据库都试图提供的共同责任集是存在的。

通过忠实记录和重构来维护数据完整性

数据完整性是数据库系统的基本要求,无论其用途或设计如何。加载到数据库中的数据应该能够可靠地检索,而不会出现意外修改、操作或擦除。这需要可靠的加载和检索数据的方法,以及根据需要序列化和反序列化数据以将其存储在物理介质上。

数据库通常依赖于一些功能来验证数据写入或检索时的完整性,例如校验和,或者使用预写日志等技术来防止由于意外关机造成的问题,例如。随着数据存储的分布越来越广,数据完整性变得更具挑战性,因为系统的每个部分都必须反映每个数据项目的当前期望状态。这通常通过更严格的要求和多个成员在系统中更改数据时的响应来实现。

提供满足部署环境要求的性能

数据库必须具有足够的性能才能发挥作用。您需要的性能特征在很大程度上取决于应用程序的特定需求。每个环境都有独特的读写请求平衡,您将需要确定这两个类别中什么是可接受的性能。

数据库通常在执行某些类型的操作方面比其他操作要好。操作性能特征通常反映了使用的数据库类型、数据模式或结构以及操作本身。在某些情况下,诸如索引之类的功能(它创建了常用数据的替代性能优化存储)可以为这些项目提供更快的检索速度。其他时候,数据库可能只是不适合被请求的访问模式。在决定需要哪种类型的数据库时,这是需要考虑的事情。

设置进程以允许安全并发访问

虽然这不是一项严格的要求,但实际上,数据库必须允许并发访问。这意味着多个用户必须能够同时使用数据库。任何数量的用户都应能够同时读取记录,并且在未被其他用户锁定时可以写入记录。

并发访问通常意味着数据库必须实现一些其他基本功能,例如用户帐户、权限系统以及身份验证和授权机制。它还必须制定策略来防止多个用户尝试同时操作相同的数据。通常会实施记录锁定和事务来解决这些问题。

单独或聚合检索数据

数据库的基本职责之一是能够根据请求检索数据。请求可能是针对与单个记录相关的单个数据片段,也可能涉及检索在许多不同记录中找到的数据。在大多数系统中,这两种情况都必须是可能的。

在大多数数据库中,数据库本身在检索期间提供了某种程度的数据处理。这些可以包括以下类型的操作

  • 按条件搜索
  • 过滤和遵守约束条件
  • 提取特定字段
  • 平均、排序等。

这些选项可帮助您说明您想要的数据以及最有用格式。

数据库的替代方案

在继续之前,我们应该简要了解一下如果不使用数据库,您的选择是什么。

大多数存储数据的方法都可以归类为某种数据库。以下是一些例外。

本地内存或临时文件系统

有时应用程序会生成无用数据或仅与应用程序生命周期相关的數據。在这种情况下,您可能希望将这些数据保存在内存中或将其卸载到临时文件系统中,因为在应用程序退出后您将不需要它们。对于永远无用的数据,您可能希望完全禁用输出或将其记录到 /dev/null

将应用程序数据直接序列化到本地文件系统

不需要数据库的另一个情况是,少量数据可以被直接序列化和反序列化。这仅适用于少量数据,这些数据具有可预测的使用模式,且不涉及大量(如果有的话)并发。这不能很好地扩展,但在某些情况下很有用,例如输出本地日志信息。

将文件类对象直接存储到磁盘或对象存储

有时,应用程序的数据可以直接写入磁盘或替代存储,而不是存储到数据库中。例如,如果数据已经组织成面向文件的格式,例如图像或音频文件,并且不需要额外的元数据,那么将其直接存储到磁盘或专用对象存储中可能是最简单的。

数据库用于什么?

几乎所有不是完全静态的应用程序和网站都在其环境中的某个地方依赖数据库。数据库的主要用途通常决定了所用数据库的类型、存储的数据以及采用的访问模式。通常会部署多个数据库系统来处理具有不同要求的不同类型的数据。某些数据库足够灵活,可以根据不同数据集的性质来充当多种角色。

让我们看一个例子,讨论一个典型的 Web 应用程序可能与数据库的接触点。我们假设应用程序包含一个基本的店面,并出售其在库存中跟踪的商品。

存储和处理站点数据

数据库的主要用途之一是存储和处理与站点相关的数据。这些项目会影响网站上信息组织方式,并且在许多情况下构成了站点的大部分“内容”。

在上面提到的示例应用程序中,数据库将填充站点的大部分内容,包括产品信息、库存详细信息和用户资料信息。这意味着每次需要显示产品列表、产品详细信息页面或用户资料时,都会咨询数据库或某些中间缓存。

数据库还将参与显示当前和过去的订单、计算运费以及通过检查折扣代码或计算常客奖励来应用折扣。我们的示例站点将使用数据库系统通过结合产品信息、库存和用户信息来正确构建订单。记录在订单中的复合信息将再次存储在数据库中,以跟踪订单处理,允许退货,取消或修改订单,或实现更好的客户支持。

分析信息以帮助做出更好的决策

最后一类中的操作与网站的基本功能有关。虽然这些对于处理应用程序层的数据需求非常重要,但它们并不代表全部内容。

一旦您的 Web 应用程序开始注册用户和处理订单,您可能希望能够回答有关不同产品销售情况、最有利可图的用户以及哪些因素影响您销售的详细信息。这些是分析问题,可以随时运行以收集有关您组织趋势和绩效的最新信息。

这些类型的操作通常被称为商业智能分析。它们共同帮助组织了解过去发生了什么,并做出明智的改变。数据库系统存储了这些过程中使用的大部分数据,并且必须提供适当的工具或查询功能来回答有关这些数据的问题。

在我们的示例应用程序中,可以查询数据库以回答有关产品趋势、用户注册数量、我们最常运往哪些州或我们最忠诚的用户是谁的问题。这些相对基本的问题可以用来构成更复杂的问题,以更好地理解和控制影响产品性能的因素。

管理软件配置

某些类型的数据库用作网络上其他软件的配置值的存储库。这些充当网络上配置值的中央真相来源。随着新服务的启动,它们被配置为检查配置数据库网络地址处的特定键的值。这使您能够在一个位置存储启动服务所需的所有信息。

启动后,应用程序可以配置为监视与其配置相关的键的变化。如果检测到更改,应用程序可以重新配置自身以使用新配置。此过程有时由管理进程协调,该进程通过在新的服务启动时逐渐停止旧的服务来逐步推出新值,随着时间的推移更改活动配置以保持可用性。

我们的应用程序可以使用这种类型的数据库来存储整个应用程序环境的持久配置数据。我们的应用程序服务器、Web 服务器、负载均衡器、消息队列等等都可以配置为引用配置数据库来获取其生产设置。然后,应用程序的开发人员可以通过调整中央位置的配置值来修改环境的行为。

收集日志、事件和其他输出

运行积极服务请求的应用程序会生成大量的输出。这包括日志文件、事件和其他输出。这些可以写入磁盘或其他未管理的位置,但这会限制其实用性。在数据库中收集此类数据,可以更轻松地处理数据、发现模式并在出现意外情况或需要了解历史性能时分析事件。

我们的示例应用程序可能会在一个数据库中收集来自我们每个系统的日志,以便更轻松地进行分析。如果我们尝试分析问题的根源或了解整个环境的健康状况,这可以帮助我们找到事件之间的相关性。

另外,我们可能会在时间序列数据库中收集基础设施和代码生成的指标,时间序列数据库专门用于跟踪随时间推移的值。该数据库可以用来为应用程序的开发和运营团队提供有关性能、错误率等的实时监控和可视化工具。

不同角色如何与数据库协作?

数据库是组织内许多不同角色工作的基础。在较小的团队中,一两个人可能负责执行各种角色的职责。在较大的公司中,这些责任通常被细分为由专门人员或团队执行的独立角色。

数据架构师

数据架构师负责数据库系统的整体宏观结构、它们向应用程序和开发团队公开的接口,以及满足组织数据需求所需的底层技术和基础设施。

担任此角色的人员通常会确定将用于不同应用程序的适当数据库模型和实现。他们负责通过调查选项、确定技术、将其与现有系统集成以及为组织制定全面的数据策略来实施数据库决策。他们全面处理数据系统,并在决定和实施各种项目的数据库模型方面发挥作用。

DBA(数据库管理员)

数据库管理员或 DBA 是负责确保数据系统平稳运行的人员。他们负责规划新的数据系统、安装和配置软件、为其他方设置数据库系统以及管理性能。他们还经常负责保护数据库、监控数据库问题以及调整系统以优化使用模式。

数据库管理员是单个数据库系统以及如何将其与底层操作系统和硬件很好地集成以最大限度地提高性能的专家。他们与使用数据库的团队进行广泛合作,以帮助管理容量和性能,并帮助团队解决数据库系统问题。

应用程序开发人员

应用程序开发人员以多种方式与数据库交互。他们开发了许多与数据库交互的应用程序。这一点非常重要,因为这些应用程序几乎总是唯一控制个人用户或客户如何与数据库系统管理的数据进行交互的应用程序。性能、正确性和可靠性对于应用程序开发人员来说非常重要。

开发人员管理与其应用程序关联的数据结构,以便将其数据持久保存到磁盘。他们必须创建或使用机制,将他们的编程数据映射到数据库系统,以便这些组件可以协调一致地工作。随着应用程序的变化,他们必须使数据库系统中的数据和数据结构保持同步。我们将在本文后面进一步讨论开发人员如何与数据库协作

SRE(站点可靠性工程师)和运营人员

SRE(站点可靠性工程师)和运营人员从基础设施和应用程序配置的角度与数据库系统交互。他们可能负责提供额外的容量、建立数据库系统、确保数据库配置符合组织指南、监控正常运行时间以及管理备份。

在许多方面,这些人员的职责与 DBA 重叠,但并不仅仅专注于数据库。运营人员确保组织依靠的系统(包括数据库系统)能够可靠地运行并最大限度地减少停机时间。

商业智能和数据分析师

商业智能部门和数据分析师主要对数据库系统中已收集的可用数据感兴趣。他们努力根据数据中的趋势和模式来发展见解,以便他们可以预测未来的性能、就潜在的变化向组织提供建议以及回答营销和销售等其他部门有关数据的疑问。

数据分析师通常可以使用数据系统的只读访问权限。他们运行的查询通常具有与主要应用程序使用的查询大不相同的性能特征。因此,他们经常使用数据库副本或副本,以便他们可以执行可能影响主要数据库系统资源使用的长时间运行的性能密集型聚合查询。

作为开发人员,我如何与数据库协作?

那么,作为应用程序开发人员,您实际上是如何与数据库协作的呢?从根本上说,如果您的应用程序必须管理和持久保存状态,与数据库协作将是您代码的重要组成部分。

在应用程序和数据库之间翻译数据

您需要创建或使用现有的接口来与数据库进行通信。您可以使用常规网络功能直接连接到数据库,利用简单的库,或者利用更高层的编程库(例如查询构建器或 ORM)。

ORM 或对象关系映射器,是映射层,它们将关系数据库中的表转换为面向对象编程语言中使用的类,反之亦然。虽然这种转换通常很有用,但它永远不会完美。对象关系阻抗失配是用于描述关系数据库和面向对象程序在结构化数据方面差异造成的摩擦的术语。

虽然关系数据库和面向对象编程描述了两种特定的设计选择,但应用程序层和数据库层之间的转换问题是一个普遍问题,无论数据库类型或编程范式如何。数据库抽象层是用于软件的更通用术语,该软件负责在这些上下文之间进行转换。

使结构性变化与数据库保持同步

您在开发应用程序时会发现的一个重要事实是,由于数据库存在于代码库之外,因此需要特别注意以应对数据结构的变化。这个问题在某些数据库设计中比其他数据库设计更为普遍。

使应用程序数据结构与数据库同步的最常见方法是称为数据库迁移模式迁移(两者在口语中都被称为迁移)的过程。迁移涉及更新数据库的结构以反映应用程序数据模型随着时间的推移而发生的更改。这些通常采用一系列文件形式,每个文件对应于一次演变,其中包含将数据库转换为新格式所需的语句。

保护数据访问并清理输入

作为开发人员,在使用数据库时,一个重要的职责是确保应用程序不允许未经授权访问数据。数据安全是一个广泛的、多层次的问题,涉及许多利益相关者。最终,一些安全注意事项将是你的责任。

你的应用程序将需要特权访问你的数据库来执行日常任务。为了安全起见,数据库的授权框架可以帮助限制应用程序可以执行的操作类型。但是,你需要确保你的应用程序适当地限制了这些操作。例如,如果你的应用程序管理用户个人资料数据,你必须防止用户操纵该访问权限来查看或编辑其他用户的信息。

一个具体的挑战是清理用户输入。 清理输入 意味着在操作用户提供的任何数据时采取特殊预防措施。恶意攻击者利用正常的用户输入机制来欺骗应用程序泄露敏感数据,这种情况由来已久。构建应用程序来防范这些情况是一项重要的技能。

结论

数据库是现代应用程序开发中不可或缺的一部分。存储和控制与应用程序及其环境相关的状态信息是一项重要的责任,需要可靠性、性能和灵活性。

幸运的是,有许多不同的数据库选项旨在满足不同类型应用程序的要求。在 下一篇文章中,我们将深入了解可用的不同类型的数据库,以及如何将它们用于匹配不同类型的应用程序要求。

常见问题解答

数据库将数据存储在磁盘或内存中。磁盘存储通常被称为持久性,意味着即使数据库应用程序或计算机本身重新启动,数据也会可靠地保存以备后用。

数据库管理员 或 DBA 是负责确保数据系统平稳运行的人员。他们负责规划新系统、安装和配置软件、为其他方设置数据库系统以及管理性能。

一个 数据库抽象层 是一个应用程序编程接口,它统一了计算机应用程序和数据库之间的通信。

数据库管理是指在整个数据生命周期中为满足必要条件而采取的用于处理和控制数据的一系列操作。

一些数据库管理任务包括性能监控和调优、存储和容量规划、备份和恢复数据、数据归档、数据分区、复制等等。

数据库管理系统 (DBMS) 是用于存储、检索和运行数据查询的软件系统。它们充当最终用户和数据库之间的接口,以执行 CRUD 操作。

关于作者
Justin Ellingwood

Justin Ellingwood

Justin 自 2013 年以来一直在撰写有关数据库、Linux、基础设施和开发人员工具的文章。他目前与妻子和两只兔子住在柏林。他通常不必以第三人称写作,这对所有相关方来说都是一种解脱。