如果您準備接受數據工程職位面試,則必須了解數據庫的所有主要概念。這不是點擊誘餌。幾個月前,我進行了幾次數據工程訪談,所有訪談都涉及我在本文中提到的主題的問題。即使您沒有準備面試,您仍然可能想檢查一下這些概念并刷新一下。
此外,這將是沒有用的升數據工程師Y,而是各種各樣的專業工作與數據庫中的數據:數據科學家,ML-工程師,軟件開發等等。
我的名字叫Oleg,是我在GitHub上發布的開源“數據工程書”的作者。我將嘗試盡可能簡單地解釋數據庫的7個主要概念。這些概念是:
- 關系模型
- 數據歸一化
- 主鍵和外鍵
- 指標
- 交易
- 復制
- 分片
讓我們開始吧!
關系模型
關系模型是一種結構化和管理數據的方法。
在此模型中,數據被組織到表中。每個表都有一個架構。這意味著它具有預定義的列表,因此只能將滿足模式的數據寫入表中。此外,每一列都有一種數據類型(數字,字符串,布爾值等)。表的列通常稱為字段,行稱為記錄。
在最初的數據庫理論中,表稱為“關系”,因此稱為模型。不要將此定義與表之間的關系混淆,在表之間我們通常使用鍵來定義這種關系。我們將在本文后面討論鍵。
最后,遵循此模型的數據庫稱為關系數據庫。關系數據庫使用SQL(結構化查詢語言)訪問它們存儲的數據。
數據歸一化
規范化是使您的數據適合于關系數據庫的過程。
有時,標準化被稱為刪除數據冗余的過程。通常,此定義通常易于解釋和理解。規范化有助于對抗數據冗余,提高數據完整性,簡化數據結構,幫助發現錯誤。
規范化過程是通過應用兩種方法完成的:
- 綜合(例如,創建以前不存在的新項目)或
- 分解(通過拆分成較小的部分來改善現有數據結構)
考慮下面的例子。想象一下,您經營一家電子商店,并在Excel電子表格中記下了每筆采購。它可能看起來像這樣:
盡管這樣的數據結構在Excel中是可以接受的,但是如果您以1對1的方式將其插入數據庫中,則可能會導致一些問題:
- 數據是多余的。例如,您是否真的需要在這里輸入客戶的姓名?也許電子郵件就足夠了,名稱可以存儲在單獨的表中。
- 查詢此類數據將很困難。例如,您能否說說您買了幾部iPhone,以及以什么價格出售?不可以,因為“總價”已經是合計價值,并且您不知道購物車中每件商品的成本。
- 數據更新和刪除非常困難。讓我們考慮包含兩個項目的第一筆訂單,并假設客戶已決定退回一個項目。在此類表格中反映此更改的最佳方法是什么?
數據規范化將使此類購買日志變成如下所示:
在這種結構中,添加,更新和刪除條目將變得更加容易。而且,由于我們將重復的數據替換為標識符并將它們存儲在單獨的表中,因此它將減少硬盤驅動器上的空間。
這樣的標準化不是唯一的。有一些規則描述規范化級別。數據有6種普通形式,每種形式都有其自己的一組規則和對數據結構的限制。
主鍵和外鍵
主鍵是表中記錄的唯一標識符。
當我們想與另一個表建立關系時,需要這樣的鍵。當table的列包含對另一個表的引用時,該列將成為外鍵。
例如,如果我們有一個customers表,該表的列名為customer_id,則它是該表的主鍵。與此同時,如果表中orders有CUSTOMER_ID列引用在這一領域的customers表,它成為一個外鍵的orders表。
索引
索引是數據庫內部的一個特殊對象,有助于在數據內部進行快速搜索。
假設您有一個包含數百萬條記錄的大表,并且需要查找該表的滿足特定條件的子集,例如,特定客戶有多少訂單。通常,記錄不帶order插入到表中。因此,要執行搜索,數據庫將需要進行全面掃描,這意味著它將從頭到尾逐行進行直到找到所需的行。
為了加快該過程,我們可以為搜索到的列建立索引。這樣的索引將存儲表中列的每個值的位置。因此,當使用索引列執行搜索時,數據庫將首先搜索索引以查找數據的位置,然后才使用這些位置提取所需的行。
交易
術語“交易”通常是指不可分割的工作單元。當我們想要在數據庫中執行多個操作并且想要確保所有操作一次成功還是失敗時,它是必需的。
交易的經典示例是銀行轉賬,當您需要將資金從一個帳戶轉移到另一個帳戶時。基本上,涉及三個步驟:
- 檢查帳戶1是否存在所請求的金額
- 從帳戶#1中減去所需的金額
- 將所需金額添加到帳戶2
如果銀行應用程序開始了轉帳過程,則必須保證這三個操作全部成功或全部失敗。
為了確保數據庫中可以進行事務處理,數據庫應滿足一組要求,即ACID縮寫。
ACID代表原子性,一致性,隔離性,耐久性。
原子性是保證操作(工作單元)將被完全執行的保證。換句話說,必須成功執行或完全不執行對數據的所有更改。
一致性是指在事務處理之前和之后,數據應處于一致狀態。該規則的執行完全由業務邏輯承擔。回想一下銀行轉帳的示例:如果我們從帳戶#1減去$ 100,則無法向帳戶#2添加$ 200,因為這會導致不一致。
隔離意味著并行事務不應影響彼此的結果。對于數據庫而言,此要求非常昂貴,因此在某些數據庫中存在不同級別的隔離。
最后,持久性保證了操作結果可以持久保存在數據庫中,并且不會丟失。例如,如果用戶收到事務已完成的響應,則可以確保不會因為系統故障或其他中斷而放棄所做的更改。
副本
復制是將數據庫同步到其他節點或服務器。換句話說,復制是將我們的數據從一個來源復制到另一個來源的過程。
如果我們的數據主副本會發生問題,那么復制可以使我們免受數據丟失的困擾。例如,如果我們的數據庫正在停機(例如,缺少網絡或中斷),則我們的應用程序將無法運行,因為它沒有任何數據可顯示給用戶。
- 復制給我們帶來了什么:
- 副本是我們數據庫的完整副本
- 主副本中的更改立即應用于副本
- 如果主數據庫關閉,則所有傳入請求都可以重定向到副本
- 所有添加/更新/刪除請求都路由到主數據庫,但所有讀取都復制到副本數據庫的常見情況,為這種體系結構提供了很好的負載平衡
副本可以在兩種模式下工作:同步和異步。
顧名思義,同步模式是指副本應用與主實例相同的更改,并且僅在該用戶從數據庫獲得響應之后。同步模式具有一致的數據,但響應時間通常較慢。
在異步模式下,主服務器不等待副本的響應,而是立即將操作結果發送回用戶。異步模式可能會有一些數據延遲(不一致),但是響應速度非常快。
分片
分片是一種通過某些鍵拆分表中數據并將不同部分發送到不同節點的方法。
分片是水平縮放。我們將一個表分成幾個邏輯分區。每個分區的架構都是相同的(因為我們按行而不是按列劃分數據)。每個分區代表表的邏輯分片。
在不同節點之間分布后,它們成為物理碎片。數據庫的一個節點可以容納多個邏輯分片。
如何實現分片?共有三種常見方法:
- 在應用程序級別上。基本上,知道所需數據的存儲位置是您應用程序的工作。
- 在數據庫級別上。數據庫本身決定將數據放置在哪個節點上。當然,它不是自動完成的,因為數據庫需要預先提供正確的配置。
- 使用外部協調服務。在這里,您將分片外包給第三方服務,該服務決定數據的存儲位置。您的應用程序使用此服務而不是數據庫。
有很多方法可以實現分片,但是在所有情況下,您都需要提供分發密鑰。該鍵決定您的數據如何在整個群集中分布。而且,沒有關于如何選擇正確的分發密鑰的靈丹妙藥。分發密鑰的兩個最常見的選擇是基于哈希的密鑰或基于值的密鑰。
原文地址:https://www.toutiao.com/i6948579774667276811/