如果您准备面试数据工程工作,您必须了解数据库的所有主要概念。这不是点击诱饵。几个月前,我进行了几次数据工程面试,所有面试都涉及我在本文中涵盖的主题的问题。即使您不准备面试,您仍然可能想查看这些概念并刷新自己。此外,数据工程师y也没有用,但与数据库中的数据打交道的是各种各样的职业:数据科学家、ML工程师、软件开发人员等。我的名字是Oleg,我是开源的作者我在GitHub上发布的“数据工程书籍”。我将尽可能简单地解释数据库的7个主要概念。这些概念是:关系模型数据规范化主键和外键指标交易复制分片让我们开始吧!关系模型关系模型是一种结构化和管理数据的方式。在此模型中,数据被组织成表格。每个表都有一个模式。这意味着它有一个预定义的列表,因此只有满足模式的数据才能写入表中。此外,每一列都有一个数据类型(数字、字符串、布尔值等)。表的列通常称为字段,行称为记录。在原始数据库理论中,表被称为“关系”,因此称为模型。不要把这个定义和表之间的关系搞混了,我们通常使用键来定义这种关系。我们将在本文后面讨论密钥。最后,遵循此模型的数据库称为关系数据库。关系数据库使用SQL(结构化查询语言)来访问它们存储的数据。数据规范化规范化是使您的数据适合关系数据库的过程。有时规范化被称为去除数据冗余的过程。一般来说,这个定义通常很容易解释和理解。规范化有助于消除数据冗余、提高数据完整性、简化数据结构并帮助发现错误。规范化过程通过应用两种方法完成:合成(例如,创建以前不存在的新项目)或分解(通过将现有数据结构分解成更小的部分来改进它们)。考虑以下示例。假设您经营一家电子产品商店,并在Excel电子表格中跟踪每次购买。它可能看起来像这样:虽然这样的数据结构在Excel中是可以接受的,但如果将它1对1插入到数据库中,它可能会导致一些问题:数据是冗余的。例如,您真的需要在这里输入客户的姓名吗?也许电子邮件就足够了,名字可以存储在一个单独的表中。查询此类数据将很困难。例如,您能告诉我您购买了多少部iPhone,价格是多少?不会,因为“总价”已经是一个汇总值,而您并不知道购物车中每件商品的成本。数据更新和删除非常困难。让我们考虑包含两件商品的第一个订单,并假设客户决定退回一件商品。在此类表格中反映这种变化的最佳方式是什么?数据规范化将使此类购买日志看起来像这样:在这种结构中添加、更新和删除条目会更容易。此外,它会减少硬盘驱动器上的空间,因为我们用标识符替换重复数据并将它们存储在单独的表中。这种标准化并不是唯一的。有一些规则描述规范化级别。有6种常见的数据形式,每种形式都有自己的一套规则和对数据结构的限制。主键和外键主键是表中记录的唯一标识符。当我们想要创建与另一个表的关系时,需要这样的键。当一个表的列包含对另一个表的引用时,该列就成为外键。例如,如果我们有一个客户表,其中有一列名为customer_id,它就是该表的主键。同时,如果orders表有一个CUSTOMER_ID列在这个字段中引用customers表,它就成为orders表的外键。索引索引是数据库中的一个特殊对象,有助于在数据中进行快速搜索。假设你有一个包含数百万条记录的大表,你需要找到满足特定条件的表的子集,例如,特定客户有多少订单。通常,记录是无序插入表中的。因此,要执行搜索,数据库将需要进行全扫描,这意味着它将从头到尾逐行查找,直到找到所需的行。为了加快这个过程,我们可以索引搜索到的列。这样的索引将存储列的每个值在表中的位置。因此,当使用索引列执行搜索时,数据库将首先搜索索引以找到数据的位置,然后才使用这些位置来获取所需的行。事务术语“事务”通常是指一个不可分割的工作单元。当我们要在数据库中执行多个操作,并希望一次确保所有操作成功或失败时,它是必需的。交易的典型例子是银行转账,当您需要将资金从一个账户转移到另一个账户时。基本上,涉及三个步骤:检查请求的金额是否存在于Account#1从Account#1中减去所需的金额将所需的金额添加到Account#2如果银行应用程序启动转账过程,则必须保证这三个操作成功或全部失败。为确保事务在数据库中成为可能,数据库应满足一组称为ACID首字母缩写词的要求。ACID代表原子性、一致性、隔离性、持久性。原子性是一个操作(工作单元)将被完整执行的保证。换句话说,对数据的所有更改都必须成功或完全失败。一致性是指在事务前后,数据应该处于一致的状态。该规则的执行完全由业务逻辑来承担。回想一下银行转账的例子:如果我们从1号账户中减去100,我们就不能向2号账户中增加200,因为那样会导致不一致。隔离意味着并行事务不应影响彼此的结果。对于数据库来说,这个需求是非常昂贵的,所以在一些数据库中有不同级别的隔离。最后,持久化保证操作的结果可以持久化在数据库中,不会丢失。例如,如果用户收到交易已完成的响应,您可以确定更改不会因系统故障或其他中断而被丢弃。副本复制是将数据库同步到其他节点或服务器。换句话说,复制是将我们的数据从一个来源复制到另一个来源的过程。如果我们的主要数据副本出现问题,复制可以避免数据丢失。例如,如果我们的数据库出现故障(例如缺少网络或中断),我们的应用程序将无法运行,因为它没有任何数据可显示给用户。复制给我们带来了什么:副本是我们数据库的完整副本主副本中的更改会立即应用到副本如果主数据库关闭,所有传入请求都可以重定向到副本所有添加/更新/删除请求都被路由to主数据库的常见情况,但所有读取都被复制到副本数据库,为该体系结构提供了很好的负载平衡。副本可以以两种模式工作:同步和异步。顾名思义,同步模式意味着副本应用与主实例相同的更改,并且仅在该用户从数据库获得响应之后。同步模式具有一致的数据,但通常响应时间较慢。在异步模式下,主服务器不等待副本的响应,而是立即将操作结果返回给用户。异步模式可能会有一些数据延迟(不一致),但是响应速度非常快。Sharding分片是一种将表中的数据按一定的键拆分,并将不同的部分发送到不同节点的方法。分片是水平扩展。我们把一张表分成几个逻辑分区。每个分区的架构都相同(因为我们按行而不是按列对数据进行分区)。每个分区代表表的一个逻辑片。分布到不同的节点之后,就变成了物理分片。数据库的一个节点可以容纳多个逻辑分片。分片是如何实现的?共有三种常见方法:在应用程序级别。基本上,了解所需数据的存储位置是应用程序的工作。在数据库级别。数据库本身决定将数据放置在哪个节点上。当然,它不会自动完成,因为需要预先为数据库提供正确的配置。使用外部协调服务。在这里,您将分片外包给决定数据存储位置的第三方服务。您的应用程序使用此服务而不是数据库。实现分片的方法有很多种,但在所有情况下都需要提供分发密钥。此键确定您的数据如何在集群中分布。此外,没有关于如何选择正确的分发密钥的灵丹妙药。分发密钥的两种最常见选择是基于散列的密钥或基于值的密钥。
