在讨论了数据可能采用的不同形态(结构化、半结构化、非结构化)以及数据来源之后,我们需要考虑这些数据实际存放在何处。仅仅收集数据是不够的;数据需要以有组织的方式存储,以便能有效地访问、管理和分析。这就是数据库的作用。可以把数据库看作一个数字文件柜,但它功能更强大、更有序。这是一个专门用于存储、获取和管理数据集合的系统。数据工程师会花费大量时间与数据库交互,确保数据正确流入并能高效取出,用于各种目的。数据库类型多种多样。关系型数据库和NoSQL数据库是两种广泛应用且重要的类别。关系型数据库 (SQL)几十年来,关系型数据库一直是数据存储的主力。它们将数据组织成表,这些表看起来很像电子表格。每个表都由行和列组成。表: 表示实体(如客户、产品或订单)。行: 表示表中的单个记录(例如,某个特定客户、某个特定产品)。列: 表示这些记录的属性或特性(例如,客户表中的customer_id、first_name、email)。“关系型”的含义来自于通过称为键的公共列来连接不同表之间数据的能力。例如,订单表可能有一个customer_id列,用于将每个订单链接回在客户表中下订单的特定客户。digraph G { rankdir=LR; node [shape=plaintext]; a [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0"><TR><TD COLSPAN="3" BGCOLOR="#a5d8ff">客户</TD></TR><TR><TD BGCOLOR="#e9ecef">客户ID (主键)</TD><TD>名</TD><TD>邮箱</TD></TR><TR><TD>1</TD><TD>爱丽丝</TD><TD>alice@example.com</TD></TR><TR><TD>2</TD><TD>鲍勃</TD><TD>bob@example.com</TD></TR></TABLE>>]; b [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0"><TR><TD COLSPAN="3" BGCOLOR="#ffd8a8">订单</TD></TR><TR><TD BGCOLOR="#e9ecef">订单ID (主键)</TD><TD>产品名称</TD><TD BGCOLOR="#dee2e6">客户ID (外键)</TD></TR><TR><TD>101</TD><TD>小部件</TD><TD>1</TD></TR><TR><TD>102</TD><TD>小工具</TD><TD>2</TD></TR><TR><TD>103</TD><TD>小玩意</TD><TD>1</TD></TR></TABLE>>]; a -> b [label=" 通过客户ID关联"]; }一个简单的可视化图表,显示了两个相关的表:《客户》和《订单》,它们通过customer_id关联。主键(PK)代表主键(表中行的唯一标识符),外键(FK)代表外键(用于关联到另一个表的键)。关系型数据库强制执行一种预定义的结构,称为模式(schema)。在存储数据之前,必须定义表、每个表中的列、每列的数据类型(例如,整数、文本、日期)以及表之间的关系。这种结构保证了数据的一致性和完整性。要与这些数据库交互,通常使用SQL(结构化查询语言)。SQL是关系型数据库中查询、插入、更新和删除数据的标准语言。例如,要获取ID为1的客户的所有信息,您可以编写:SELECT * FROM Customers WHERE customer_id = 1;常见示例: PostgreSQL、MySQL、SQL Server、Oracle Database。何时使用? 当数据一致性非常重要、数据结构明确且不常变动,以及需要涉及多个表的复杂查询时,关系型数据库表现出色。例如,金融交易、库存系统或用户账户管理。NoSQL数据库随着应用程序的发展,特别是互联网、Web应用和大数据的兴起,新的问题随之出现。有时数据无法整齐地放入表中,或者数据的巨大体量和速度使传统关系型系统不堪重负。这促成了NoSQL数据库的开发。NoSQL代表“不只是SQL”。它是一个总称,指代那些与关系型模型相比,提供不同数据存储和获取方式的数据库。它们通常在数据结构方面提供更大的灵活性,并且设计为可轻松地跨多台服务器进行扩展。NoSQL数据库有多种类型,每种都适合不同类型的问题:文档数据库: 以文档式结构存储数据,通常使用JSON(JavaScript Object Notation)或BSON等格式。每个文档可以有自己的结构。这非常适合半结构化数据。示例: MongoDB, Couchbase键值存储: 最简单的一种。数据以唯一键和关联值的形式存储,类似于字典或哈希映射。通过键查找速度非常快。示例: Redis, Amazon DynamoDB (在其键值模式下)列族存储: 按列而非按行存储数据。对于只需要大型数据集中特定列的查询效率很高。常用于大数据场景。示例: Apache Cassandra, HBase图数据库: 专门用于存储网络和关系数据。数据以节点(实体)和边(实体间的连接)的形式存储。非常适合推荐系统、社交网络和欺诈检测。示例: Neo4j, Amazon Neptune与关系型数据库的一个主要区别是,许多NoSQL数据库具有灵活的模式或无模式。这意味着您不一定需要提前定义数据的确切结构,从而可以更轻松地处理多样或不断演变的数据。何时使用? NoSQL数据库通常被选用,以满足需要高可扩展性(处理海量数据或用户)、数据格式灵活性或非常高速的读写操作的应用程序。用例包括实时分析、内容管理系统、移动应用程序以及存储来自物联网设备的数据。关系型与NoSQL:快速对比以下是主要区别的总结:graph G { node [shape=plaintext]; rankdir=LR; // 从左到右排序 table [label=< <TABLE BORDER="1" CELLBORDER="1" CELLSPACING="0"> <TR><TD BGCOLOR="#e9ecef">特性</TD><TD BGCOLOR="#a5d8ff">关系型 (SQL)</TD><TD BGCOLOR="#ffd8a8">NoSQL</TD></TR> <TR><TD>主要模型</TD><TD>带行/列的表</TD><TD>多样(文档、键值、列、图)</TD></TR> <TR><TD>模式</TD><TD>固定、预定义</TD><TD>动态或灵活</TD></TR> <TR><TD>查询语言</TD><TD>SQL(标准化)</TD><TD>多样(常为专有API或查询方法)</TD></TR> <TR><TD>可扩展性</TD><TD>通常垂直(更大的服务器)</TD><TD>通常水平(更多服务器)</TD></TR> <TR><TD>数据结构</TD><TD>结构化</TD><TD>结构化、半结构化、非结构化</TD></TR> <TR><TD>一致性</TD><TD>强一致性(常符合ACID)</TD><TD>常为最终一致性(因情况而异)</TD></TR> </TABLE> >]; }典型的关系型(SQL)数据库与NoSQL数据库之间的主要区别。请注意,这些是概括性说明,具体数据库可能存在差异。关系型数据库和NoSQL数据库之间的选择并非总是明确的,有时两者会在同一个大型系统中使用(这种模式称为多语言持久化)。该决定很大程度上取决于应用程序的具体需求:数据结构化程度如何?严格一致性有多重要?您预期的数据量有多大?数据或其结构变化的速度有多快?您需要运行哪些类型的查询?理解这些主要的数据库类型很重要。作为数据工程师,您将处理从各种数据库中提取数据并加载数据到其中的系统。了解它们的特点有助于设计高效的数据管道并选择合适的存储方案,这些内容我们将在后续章节中进一步讨论。