简介

数据库是许多现代应用程序和工具的基本组件。作为一个用户,当你访问网站,在手机上使用应用程序,或者在杂货店购物时,你可能每天与几十或几百个数据库进行交互。作为开发人员,数据库是用于在应用程序生命周期之外保存数据的核心组件。但是数据库到底是什么,为什么它们如此常见?

在这篇文章中,我们将重温:

  • 什么是数据库
  • 人们和应用程序如何使用它们来跟踪各种数据
  • 数据库提供的特性
  • 他们提供什么样的保证
  • 它们与其他数据存储方法相比如何

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

数据是什么?

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

数据库管理系统通常被设计用于根据特定的模式组织数据。这些模式称为数据库类型或数据库模型,它们是决定如何存储和管理单个数据块的逻辑和结构基础。有许多不同的数据库类型,每种类型都有自己的优点和局限性。关系模型通常被认为是默认的范式,它将数据组织成交叉引用的表、行和列。

DBMS 可以通过各种方式(包括命令行客户端、 API、编程库和管理接口)使它们管理的数据库可访问。通过这些通道,可以将数据摄取到系统中,根据需要进行组织,并根据请求返回。

数据持久性与临时存储

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

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

相反,内存中的存储被认为是短暂的或易失的。临时存储不能在应用程序或系统关闭后继续存在。内存中数据库的优点是它们通常非常快。

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

后备存储类型 数据在重启后是否存在? 优点 示例
磁盘 数据持久性 MySQL
内存 操作速度 memcached

与数据库交互以管理数据

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

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

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

让我们在下面更详细地讨论一下这些问题。

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

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

在操作高度规则数据(如关系数据库)的数据库中,这些定义通常称为数据库模式。数据库模式是一个严格的大纲,说明数据必须如何格式化才能被特定的数据库接受。这包括必须出现在单个记录中的特定字段,以及对数据类型、字段长度、最小值或最大值等值的要求。数据库模式是数据库所有者影响和控制存储在系统中的数据的最重要的工具之一。

将灵活性置于规律性之上的数据库管理系统通常被称为无模式数据库。虽然这似乎意味着存储在这些数据库中的数据没有结构,但通常情况并非如此。相反,数据库的结构由数据本身以及应用程序对数据的了解和与数据的关系决定。数据库通常仍然坚持一个结构,但是数据库管理系统很少涉及强制约束。这是一种根据具体情况有利有弊的设计选择。

从系统中摄取、修改和删除数据的数据更新

数据更新包括以下任何操作:

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

这些功能对于任何数据库都是必不可少的,并且在许多情况下,构成了数据库系统处理的大多数操作。这些类型的活动(引起系统中数据更改的操作)统称为写操作。

写操作对于任何随时间变化的数据源都很重要。即使删除数据(一种破坏性操作)也被认为是写操作,因为它修改了系统中的数据。

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

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

存储数据没有多大用处,除非你有办法在需要的时候检索它。由于返回数据不会影响当前存储在数据库中的任何信息,因此这些操作称为读操作。读操作是收集已存储在数据库中的数据的主要方法。

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

许多系统还具有查询数据库以返回符合特定条件的数据集或返回关于条目的部分信息的复杂方法。这种类型的查询灵活性有助于数据库管理系统除了具有基本的数据存储能力外,还可以作为数据处理器进行操作。通过开发特定的查询,用户可以提示数据库系统只返回他们需要的信息。此特性通常与写操作结合使用,以根据特定记录的属性定位和修改特定记录。

管理数据库系统,确保一切正常运行

数据库通常支持的最后一类操作是管理功能。这是一个广泛的、通用的操作类,有助于在不直接影响数据本身的情况下支持数据库环境。一些可能适合这一类的项目包括:

  • 管理用户、权限、身份验证和授权
  • 设置和维护备份
  • 为存储配置备份介质
  • 管理复制和其他伸缩注意事项
  • 提供在线和离线回收选择

这组操作与任何现代应用程序所共有的基本管理问题保持一致。

管理操作可能不是核心数据管理功能的核心,但这些功能常常使类似的数据库管理系统与众不同。能够轻松地备份和恢复数据,实现连接到现有系统的用户管理,或者扩展数据库以满足需求,这些都是生产中操作的基本特性。未能关注这些领域的数据库往往难以在现实环境中得到采用。

数据库有哪些职责?

根据上面的描述,我们如何概括数据库的主要职责?答案在很大程度上取决于所使用的数据库类型和应用程序的需求。即便如此,所有数据库都寻求提供一组共同的职责。

通过忠实记录和重构来保证数据的完整性

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

数据库通常依赖于在写入或检索数据时验证数据的特性,比如校验和,或者使用诸如提前写入日志之类的技术来防止意外关闭引起的问题。随着数据存储的分布越来越分散,数据完整性变得越来越具有挑战性,因为系统的每个部分都必须反映每个数据项的当前期望状态。每当系统中的数据发生变化时,通常可以通过更健壮的需求和来自多个成员的响应来实现这一点。

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

数据库必须充分执行才有用。您需要的性能特征在很大程度上取决于应用程序的特定需求。每个环境都有独特的读写请求平衡,您必须决定这两个类别的可接受性能意味着什么。

数据库通常在执行某些类型的操作方面优于其他类型的操作。操作性能特征通常反映所使用的数据库类型、数据模式或结构以及操作本身。在某些情况下,像索引这样的特性可以为这些条目提供更快的检索速度,因为索引可以为通常访问的数据创建一个性能优化的替代存储。其他时候,数据库可能不太适合所请求的访问模式。在决定需要什么类型的数据库时,需要考虑这一点。

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

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

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

单独或聚合地检索数据

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

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

  • 按标准搜索
  • 过滤和遵守约束
  • 提取特定字段
  • 平均、分类等。

这些选项可以帮助您清楚地表达您想要的数据和最有用的格式。

数据库的替代品

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

大多数存储数据的方法都可以归类为某种类型的数据库。

本地内存或临时文件系统

有时候,应用程序产生的数据没有用处,或者只与应用程序的生命周期有关。在这些情况下,您可能希望将该数据保存在内存中,或者将其卸载到临时文件系统,因为一旦应用程序退出,您就不再需要它了。对于数据从来没有用处的情况,您可能希望完全禁用输出或将其记录到 /dev/null

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

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

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

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

数据库能用到做什么?

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

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

存储和处理站点数据

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

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

在显示当前和过去的订单、计算运输成本以及通过检查折扣代码或计算频繁的客户奖励来应用折扣时,也会涉及到数据库。我们的示例站点将使用数据库系统通过组合产品信息、库存和用户信息来正确构建订单。记录在订单中的复合信息将再次存储在数据库中,以跟踪订单处理、允许返回、取消或修改订单,或提供更好的客户支持。

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

最后一类行动涉及网站的基本功能。虽然这些对于处理应用程序层的数据需求非常重要,但是它们并不能代表整个情况。

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

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

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

管理软件配置

某些类型的数据库被用作网络上其他软件的配置值的存储库。它们作为网络上配置值的核心真实性来源。当新服务启动时,它们被配置为在配置数据库的网络地址检查特定密钥的值。这使您能够将引导服务所需的所有信息存储在一个位置。

引导后,应用程序可以配置为监视与其配置相关的密钥以进行更改。如果检测到更改,应用程序可以重新配置自身以使用新配置。这个过程有时是由一个管理过程编排的,这个管理过程随着时间的推移通过在新服务出现时旋转旧服务来推出新值,随着时间的推移通过改变活动配置来维护可用性。

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

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

运行主动为请求提供服务的应用程序可以生成大量输出。这包括日志文件、事件和其他输出。可以将它们写入磁盘或其他非托管位置,但这限制了它们的有用性。在数据库中收集这种类型的数据可以使处理、定位模式和分析事件变得更加容易,尤其是当发生意外情况或者需要了解更多关于历史性能的信息时。

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

另外,我们可以在一个时间序列数据库中收集由基础设施和代码生成的指标,该数据库专门用于跟踪随时间变化的值。这个数据库可以用来支持实时监控和可视化工具,为应用程序的开发和操作团队提供有关性能、错误率等方面的信息。

不同的角色如何使用数据库?

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

数据架构师

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

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