简介
数据库是许多现代应用程序和工具的基本组成部分。作为用户,当您访问网站、使用手机上的应用程序或在杂货店购买商品时,您每天可能会与数十甚至数百个数据库进行交互。作为开发人员,数据库是用于持久化数据,使其超出应用程序生命周期的核心组件。但数据库究竟是什么?为什么它们如此常见?
在本文中,我们将介绍
- 什么是数据库
- 人们和应用程序如何使用它们来跟踪各种数据
- 数据库提供哪些功能
- 它们做出哪些类型的保证
- 它们与其他数据存储方法相比如何
最后,我们将讨论应用程序如何依赖数据库来存储和检索数据,从而实现复杂的功能。
什么是数据库?
数据库 是用于组织和存储数据以便将来处理、检索或评估的逻辑结构。在计算机的上下文中,这些结构几乎总是由称为 数据库管理系统 或 DBMS 的应用程序管理。DBMS 管理计算机磁盘上的专用文件,并为用户和应用程序提供逻辑接口。
数据库管理系统通常设计为根据特定模式组织数据。这些模式,称为 数据库类型 或数据库模型,是逻辑和结构基础,决定了单个数据片段如何存储和管理。有许多不同的数据库类型,每种类型都有其自身的优点和局限性。关系模型,它将数据组织成交叉引用的表、行和列,通常被认为是默认范例。
DBMS 可以通过各种方式使其管理的数据库可访问,包括命令行客户端、API、编程库和管理界面。通过这些渠道,可以将数据摄取到系统中,根据需要进行组织,并根据请求返回。
数据持久性与临时存储
数据库将数据存储在磁盘上或内存中。
磁盘存储通常被认为是 持久的,这意味着数据会被可靠地保存下来以供以后使用,即使数据库应用程序或计算机本身重启。
相比之下,内存存储 被认为是 临时的 或 易失的。临时存储在应用程序或系统关闭后不会幸存。内存数据库的优势在于它们通常非常快。
在实践中,许多环境将混合使用这两种类型的系统,以获得每种类型的优势。对于接受对临时层的新写入的系统,可以通过定期将临时数据保存到磁盘上来完成。其他系统使用持久数据的只读内存副本以加快读取访问速度。这些系统可以随时从后备存储重新加载数据以刷新其数据。
后备存储类型 | 数据在重启后是否保留? | 优点 | 示例 |
---|---|---|---|
在磁盘上 | 是 | 数据寿命 | MySQL |
在内存中 | 否 | 运行速度 | memcached |
与数据库交互以管理您的数据
虽然数据库系统负责如何将数据存储在磁盘上或内存中,但它也为用户或应用程序提供了一个接口。数据库的接口必须能够表示外部方可以执行的操作,并且必须能够表示系统支持的所有数据类型。
根据 维基百科,数据库通常允许以下四种类型的交互
- 数据定义:创建、修改和删除数据结构的定义。这些操作会更改影响数据库如何接受和存储数据的属性。这在某些类型的数据库中比其他类型的数据库更重要。
- 更新:在数据库中插入、修改和删除数据。这些操作会更改正在管理的实际数据。
- 检索:提供对存储数据的访问。数据可以按原样检索,或者通常可以进行筛选或转换,以将其处理成更有用的格式。许多数据库系统都理解丰富的查询语言来实现这一点。
- 管理:其他任务,如用户管理、安全性、性能监控等,这些任务是必要的,但与数据本身没有直接关系。
让我们在下面更详细地介绍这些内容。
数据定义控制系统中数据的形状和结构
创建和控制数据在数据库中采用的结构是数据库管理的重要组成部分。这可以帮助您在将数据摄取到系统之前控制数据的形状或结构。它还允许您设置约束,以确保您的数据符合某些参数。
在处理高度规则数据的数据库(如关系数据库)中,这些定义通常称为数据库的 模式。数据库模式是数据必须格式化的严格大纲,才能被特定数据库接受。这涵盖了单个记录中必须存在的特定字段,以及对数据类型、字段长度、最小值或最大值等值的要求。数据库模式是数据库所有者用来影响和控制将存储在系统中的数据的最重要的工具之一。
重视灵活性而不是规律性的数据库管理系统通常被称为无模式数据库。虽然这似乎暗示存储在这些数据库中的数据没有结构,但通常情况并非如此。相反,数据库的结构由数据本身以及应用程序对数据的了解和关系决定。数据库通常仍然遵循结构,但数据库管理系统较少参与强制执行约束。这是一种设计选择,在不同情况下有其优点和缺点。
数据更新以摄取、修改和删除系统中的数据
数据更新包括任何操作,这些操作会
- 将新数据输入系统
- 修改现有条目
- 从数据库中删除条目
这些功能对于任何数据库都是必不可少的,并且在许多情况下,构成了数据库系统处理的大部分操作。这些类型的活动(导致系统数据发生更改的操作)统称为 写入 操作。
写入操作对于任何会随时间变化的数据源都很重要。即使删除数据(一种破坏性操作)也被认为是写入操作,因为它会修改系统内的数据。
由于写入操作可能会更改数据,因此这些操作可能存在风险。大多数数据库管理员将其系统配置为限制某些应用程序进程的写入操作,以最大限度地减少意外或恶意数据损坏的可能性。例如,数据分析(使用现有数据来回答有关网站性能或访问者行为的问题)只需要读取权限。另一方面,应用程序中记录用户订单的部分需要能够将新数据写入数据库。
检索数据以提取信息或回答特定问题
存储数据并不是很有用,除非您有一种在需要时检索它的方法。由于返回数据不会影响当前存储在数据库中的任何信息,因此这些操作称为 读取 操作。读取操作是收集已存储在数据库中的数据的主要方式。
数据库管理系统几乎总是有一种通过唯一标识符(通常称为 主键)访问数据的直接方法。这允许通过提供键来访问任何一个条目。
许多系统还具有复杂的数据库查询方法,用于返回与特定条件匹配的数据集或返回有关条目的部分信息。这种查询灵活性有助于数据库管理系统除了其基本数据存储功能外,还充当数据处理器。通过开发特定的查询,用户可以提示数据库系统仅返回他们需要的信息。此功能通常与写入操作结合使用,以按属性查找和修改特定记录。
管理数据库系统以保持一切平稳运行
数据库通常支持的最后一类操作是管理功能。这是一个广泛的、通用的操作类别,有助于支持数据库环境,而不会直接影响数据本身。可能属于此组的一些项目包括
- 管理用户、权限、身份验证和授权
- 设置和维护备份
- 配置存储的后备介质
- 管理复制和其他扩展注意事项
- 提供在线和离线恢复选项
这组操作与任何现代应用程序常见的基本管理问题保持一致。
管理操作可能不是核心数据管理功能的核心,但这些功能通常使类似的数据库管理系统脱颖而出。能够轻松备份和恢复数据、实施连接到现有系统的用户管理或扩展数据库以满足需求都是在生产环境中运行的基本功能。未能关注这些领域的数据库通常难以在实际环境中获得采用。
数据库有哪些职责?
鉴于上述描述,我们如何概括数据库的主要职责?答案在很大程度上取决于所使用的数据库类型和应用程序的需求。即便如此,所有数据库都试图提供一组共同的职责。
通过忠实记录和重构来维护数据完整性
数据完整性是数据库系统的基本要求,无论其用途或设计如何。加载到数据库中的数据应该能够可靠地检索,而不会出现意外的修改、操纵或擦除。这需要可靠的加载和检索数据的方法,以及在物理介质上存储数据时必要的序列化和反序列化。
数据库通常依赖于在写入或检索数据时验证数据的功能,例如 校验和,或防止由意外关闭引起的问题,例如使用 预写日志 等技术。数据存储越分布式,数据完整性就越具挑战性,因为系统的每个部分都必须反映每个数据项的当前所需状态。这通常通过更严格的要求和来自多个成员的响应来实现,只要系统中的数据发生更改。
提供满足部署环境要求的性能
数据库必须具有足够的性能才能有用。您需要的性能特征在很大程度上取决于应用程序的特定需求。每个环境都有独特的读取和写入请求平衡,您必须决定这两种类别的可接受性能意味着什么。
数据库通常更擅长执行某些类型的操作。操作性能特征通常反映所使用的数据库类型、数据模式或结构以及操作本身。在某些情况下,诸如 索引 之类的功能(它创建了常用数据的替代性能优化存储)可以为这些项目提供更快的检索速度。在其他时候,数据库可能只是不适合所请求的访问模式。这是在决定您需要的数据库类型时要考虑的事项。
设置允许安全并发访问的流程
虽然这不是严格的要求,但实际上,数据库必须允许并发访问。这意味着多个参与方必须能够同时使用数据库。记录应该可以被任意数量的用户同时读取,并且在当前未被另一个用户锁定时可写入。
并发访问通常意味着数据库必须实现其他一些基本功能,如用户帐户、权限系统以及身份验证和授权机制。它还必须制定策略,以防止多个用户尝试同时操作相同的数据。通常实现记录锁定和事务来解决这些问题。
单独或聚合检索数据
数据库的基本职责之一是能够根据请求检索数据。请求可能是针对与单个记录关联的单个数据片段,或者可能涉及检索在许多不同记录中找到的数据。在大多数系统中,这两种情况都必须是可能的。
在大多数数据库中,数据库本身在检索期间提供某种程度的数据处理。这些可以包括以下类型的操作
- 按条件搜索
- 筛选和遵守约束
- 提取特定字段
- 平均、排序等
这些选项可以帮助您清楚地表达您想要的数据以及最有用的格式。
数据库的替代方案
在我们继续之前,我们应该简要地看一下如果您不使用数据库,您的选择是什么。
大多数存储数据的方法都可以归类为某种数据库。一些例外情况包括以下几种。
本地内存或临时文件系统
有时,应用程序会生成无用或仅在应用程序生命周期内相关的数据。在这些情况下,您可能希望将数据保存在内存中或将其卸载到临时文件系统,因为应用程序退出后您将不再需要它。对于数据永远无用的情况,您可能希望完全禁用输出或将其记录到 /dev/null
。
将应用程序数据直接序列化到本地文件系统
可能不需要数据库的另一种情况是,可以直接序列化和反序列化少量数据。这仅适用于少量数据,且具有可预测的使用模式,不涉及太多(如果有)并发。这不能很好地扩展,但对于某些情况(如输出本地日志信息)可能很有用。
将类似文件的对象直接存储到磁盘或对象存储
有时,来自应用程序的数据可以直接写入磁盘或替代存储,而不是存储到数据库中。例如,如果数据已经组织成面向文件的格式(如图像或音频文件),并且不需要其他元数据,则将其直接存储到磁盘或专用对象存储可能是最容易的。
数据库用于做什么?
几乎所有非完全静态的应用程序和网站都在其环境中的某个地方依赖数据库。数据库的主要用途通常决定了所使用的数据库类型、存储的数据以及采用的访问模式。通常部署多个数据库系统来处理具有不同要求的不同类型的数据。有些数据库足够灵活,可以根据不同数据集的性质来履行多种角色。
让我们看一个示例来讨论典型的 Web 应用程序可能与数据库的接触点。我们将假设该应用程序包含一个基本店面,并销售它在库存中跟踪的商品。
存储和处理站点数据
数据库的主要用途之一是存储和处理与站点相关的数据。这些项目会影响站点信息的组织方式,并且在许多情况下,构成了站点的大部分“内容”。
在上面提到的示例应用程序中,数据库将填充站点的大部分内容,包括产品信息、库存详细信息和用户个人资料信息。这意味着每次需要显示产品列表、产品详细信息页面或用户个人资料时,都会查询数据库或某些中间缓存。
当显示当前和过去的订单、计算运费以及通过检查折扣代码或计算常客奖励来应用折扣时,数据库也将参与其中。我们的示例站点将使用数据库系统通过组合产品信息、库存和用户信息来正确构建订单。记录在订单中的复合信息将再次存储在数据库中,以跟踪订单处理、允许退货、取消或修改订单或启用更好的客户支持。
分析信息以帮助做出更好的决策
上一类中的操作与网站的基本功能相关。虽然这些对于处理应用程序层的数据需求非常重要,但它们并不能代表整个情况。
一旦您的 Web 应用程序开始注册用户并处理订单,您可能希望能够回答有关不同产品的销售情况、利润最高的用户是谁以及哪些因素会影响您的销售额的详细问题。这些是分析性问题,可以随时运行以收集有关您组织趋势和绩效的最新情报。
这些类型的操作通常称为商业智能或分析。它们共同帮助组织了解过去发生的事情并做出明智的改变。数据库系统存储这些过程中使用的大部分数据,并且必须提供适当的工具或查询功能来回答有关数据的问题。
在我们的示例应用程序中,可以查询数据库以回答有关产品趋势、用户注册数量、我们发货最多的州或我们最忠诚的用户是谁等问题。这些相对基础的查询可以用于构建更复杂的问题,以更好地理解和控制影响产品性能的因素。
管理软件配置
某些类型的数据库用作网络上其他软件的配置值的存储库。这些数据库充当网络上配置值的中心真来源。当启动新服务时,它们被配置为检查配置数据库网络地址中特定键的值。这使您可以将引导服务所需的所有信息存储在一个位置。
在引导之后,可以将应用程序配置为监视与其配置相关的键的更改。如果检测到更改,应用程序可以重新配置自身以使用新配置。此过程有时由管理流程协调,该流程通过在启动新服务时关闭旧服务,随着时间的推移逐步推出新值,从而随着时间的推移更改活动配置以保持可用性。
我们的应用程序可以使用这种类型的数据库来存储我们整个应用程序环境的持久配置数据。我们的应用程序服务器、Web 服务器、负载均衡器、消息队列等都可以配置为引用配置数据库以获取其生产设置。然后,应用程序的开发人员可以通过调整中心位置的配置值来修改环境的行为。
收集日志、事件和其他输出
正在运行的、积极响应请求的应用程序可能会生成大量输出。这包括日志文件、事件和其他输出。这些可以写入磁盘或其他非托管位置,但这限制了它们的用处。在数据库中收集此类数据可以更轻松地使用、发现模式以及在发生意外情况或需要了解有关历史性能的更多信息时分析事件。
我们的示例应用程序可能会在一个数据库中收集来自每个系统的日志,以便于分析。如果我们试图分析问题的根源或了解我们环境的整体健康状况,这可以帮助我们找到事件之间的关联性。
另外,我们可能会在一个时间序列数据库中收集由我们的基础设施和代码生成的指标,这是一种专门设计用于跟踪随时间变化的值的数据库。该数据库可用于支持实时监控和可视化工具,以便为应用程序的开发和运维团队提供有关性能、错误率等信息。
不同角色如何使用数据库?
数据库对于组织内许多不同角色的工作至关重要。在较小的团队中,一个人或几个人可能负责执行各种角色的职责。在较大的公司中,这些职责通常被划分为由专职人员或团队执行的离散角色。
数据架构师
数据架构师负责数据库系统的整体宏观结构、它们向应用程序和开发团队公开的接口,以及满足组织数据需求所需的基础技术和基础设施。
担任此角色的人员通常会决定适用于不同应用程序的适当数据库模型和实现。他们负责通过调查选项、决定技术、将其与现有系统集成以及为组织制定全面的数据战略来实施数据库决策。他们从整体上处理数据系统,并参与决定和实施各种项目的数据模型。
DBA(数据库管理员)
数据库管理员,或 DBA,是负责保持数据系统平稳运行的个人。他们负责规划新的数据系统、安装和配置软件、为其他方设置数据库系统以及管理性能。他们通常还负责保护数据库安全、监控数据库是否存在问题,并对系统进行调整以优化使用模式。
数据库管理员是单个数据库系统以及如何将其与底层操作系统和硬件良好集成以最大化性能方面的专家。他们与使用数据库的团队广泛合作,以帮助管理容量和性能,并帮助团队解决数据库系统的问题。
应用程序开发人员
应用程序开发人员以多种不同的方式与数据库交互。他们开发许多与数据库交互的应用程序。这非常重要,因为这些几乎总是唯一控制单个用户或客户如何与数据库系统管理的数据交互的应用程序。性能、正确性和可靠性对于应用程序开发人员来说至关重要。
开发人员管理与其应用程序关联的数据结构,以将其数据持久化到磁盘。他们必须创建或使用可以将他们的编程数据映射到数据库系统的机制,以便组件可以和谐地协同工作。随着应用程序的变化,他们必须保持数据库系统内的数据和数据结构的同步。我们将在本文后面的部分详细讨论开发人员如何使用数据库。
SRE(站点可靠性工程师)和运维专业人员
SRE(站点可靠性工程师)和运维专业人员从基础设施和应用程序配置的角度与数据库系统交互。他们可能负责配置额外的容量、搭建数据库系统、确保数据库配置符合组织准则、监控正常运行时间以及管理备份。
在许多方面,这些人与 DBA 的职责重叠,但并非仅专注于数据库。运维人员确保组织其他部门依赖的应用程序系统(包括数据库系统)能够可靠地运行并具有最短的停机时间。
商业智能和数据分析师
商业智能部门和数据分析师主要对数据库系统中已收集和可用的数据感兴趣。他们致力于根据数据中的趋势和模式开发见解,以便他们可以预测未来的绩效、就潜在的变化向组织提供建议,并回答营销和销售等其他部门关于数据的问题。
数据分析师通常可以专门使用对数据系统的只读访问权限。他们运行的查询通常具有与主要应用程序使用的查询截然不同的性能特征。因此,他们通常使用数据库副本,或副本,以便他们可以执行长时间运行和性能密集型聚合查询,否则可能会影响主数据库系统的资源使用率。
作为开发人员,我如何使用数据库?
那么,作为应用程序开发人员,您实际上是如何使用数据库的呢?从基本层面来看,如果您的应用程序必须管理和持久化状态,那么使用数据库将是您代码的重要组成部分。
在应用程序和数据库之间转换数据
您将需要创建或使用现有接口来与数据库通信。您可以使用常规网络功能直接连接到数据库,也可以利用简单的库或更高级别的编程库(例如,查询构建器或 ORM)。
ORM,或对象关系映射器,是映射层,它将关系数据库中找到的表转换为面向对象编程语言中使用的类,反之亦然。虽然这种转换通常很有用,但它永远不是完美的。对象关系阻抗失配是一个术语,用于描述关系数据库和面向对象程序结构数据的方式不同而引起的摩擦。
尽管关系数据库和面向对象编程描述了两个特定的设计选择,但在应用程序层和数据库层之间进行转换的问题是一个普遍存在的问题,与数据库类型或编程范例无关。数据库抽象层是更通用的术语,指负责在这两个上下文之间进行转换的软件。
保持结构更改与数据库同步
当您开发应用程序时,您将发现一个重要的事实,即由于数据库存在于您的代码库之外,因此需要特别注意以应对数据结构的更改。在某些数据库设计中,此问题比其他数据库设计更为普遍。
将应用程序的数据结构与数据库同步的最常见方法是一个名为数据库迁移或模式迁移(两者通常简称为迁移)的过程。迁移涉及更新数据库的结构,以反映应用程序数据模型演变时的更改。这些通常采用一系列文件的形式,每个演变一个文件,其中包含将数据库转换为新格式所需的语句。
保护对数据的访问并清理输入
作为开发人员使用数据库时,一项重要的责任是确保您的应用程序不允许未经授权访问数据。数据安全是一个广泛的、多层次的问题,涉及许多利益相关者。最终,某些安全考虑因素将是您有责任处理的。
您的应用程序将需要特权访问您的数据库才能执行例行任务。为了安全起见,数据库的授权框架可以帮助限制您的应用程序可以执行的操作类型。但是,您需要确保您的应用程序适当地限制这些操作。例如,如果您的应用程序管理用户个人资料数据,您必须防止用户操纵该访问权限以查看或编辑其他用户的信息。
一个具体的挑战是清理用户输入。清理输入是指在操作用户提供的任何数据时采取特殊的预防措施。恶意行为者使用正常的用户输入机制来欺骗应用程序泄露敏感数据由来已久。设计您的应用程序以防止这些情况发生是一项重要的技能。
结论
数据库是现代应用程序开发中不可或缺的组件。存储和控制与您的应用程序及其环境相关的有状态信息是一项重要的责任,需要可靠性、性能和灵活性。
幸运的是,有许多不同的数据库选项旨在满足不同类型应用程序的需求。在我们的下一篇文章中,我们将深入了解可用的不同类型的数据库,以及如何使用它们来匹配不同类型的应用程序需求。
Prisma 是一种使您能够轻松地从应用程序中使用数据库的方法。您可以在我们的为什么选择 Prisma?页面中了解有关 Prisma 提供的更多信息。
Prisma 数据库连接器允许您将 Prisma 连接到多种不同类型的数据库。查看我们的文档以了解更多信息。
常见问题解答
数据库将数据存储在磁盘上或内存中。磁盘存储通常被认为是持久的,这意味着即使数据库应用程序或计算机本身重新启动,数据也会可靠地保存以供以后使用。
数据库管理员,或 DBA,是负责保持数据系统平稳运行的个人。他们负责规划新系统、安装和配置软件、为其他方设置数据库系统以及管理性能。
数据库抽象层是一个应用程序编程接口,它统一了计算机应用程序和数据库之间的通信。
数据库管理是指为在整个数据生命周期中满足必要条件而采取的与数据交互和控制数据的操作。
一些数据库管理任务包括性能监控和调优、存储和容量规划、备份和恢复数据、数据归档、数据分区、复制等等。
数据库管理系统 (DBMS) 是用于存储、检索和运行数据查询的软件系统。它们充当最终用户和数据库之间的接口,以执行 CRUD 操作。