資料庫是世界上最複雜的技術系統的關鍵元件,它們的使用方式對其效能、可擴充套件性和一致性有重大影響。 在本文中,我們概述了在系統設計面試中需要了解的最關鍵的資料庫主題。
資料庫負責在最基本的級別儲存和檢索應用程式的資料。 由於資料庫是處理對物理資料儲存的訪問的程式,因此它有時稱為資料庫管理系統 (DBMS)。 資料庫的主要功能是儲存、更新和刪除資料,返回資料以響應查詢以及管理資料庫。
資料庫必須可靠、高效和準確。 同時完成所有這些任務被證明是相當棘手的。 您必須熟悉幾個想法才能構建高效且成功的資料庫。 讓我們首先看一下 CAP 定理,以了解資料庫設計核心的權衡。
根據 CAP 定理,任何分布式資料庫都只能滿足三個要求中的兩個:
一致性:每個節點都回覆最新版本的資料,以確保一致性。
可用性:任何節點都可以傳送響應。
分割槽容錯:即使任何節點之間的連線丟失,系統也會繼續執行。
假設系統提供一致性和分割槽容錯性。 在這種情況下,它被稱為 CP 資料庫,如果它提供可用性和分割槽容錯性,則稱為 AP 資料庫。
隨著資料集大小的顯著增長,可擴充套件性在分布式集群中變得越來越重要。 由於不同的資料庫提供不同的功能,它們的可擴充套件性更好或更差。 縮放可分為兩類:
垂直縮放是增加單台計算機上可用的計算量和記憶體量的過程。
水平擴充套件是增加集群中計算機數量的過程。
垂直擴充套件很簡單,但整體記憶體容量會大大降低。 另一方面,水平擴充套件具有更大的整體計算和儲存容量,並且可以動態擴充套件而不會導致停機。 主要缺點是關聯式資料庫(使用最廣泛的資料庫模型)難以水平擴充套件。
事務是由一系列資料庫操作組成的“單個工作單元”。 事務的操作是成功或不成功。 從這個意義上說,事務的概念有助於在系統元件發生故障時保持資料完整性。 “acid”屬性是它的形式化:
原子性 – 如果所有操作同時成功或失敗,則事務是乙個“原子”單元。
一致性 – 當事務成功完成時,資料庫是合法的,並且沒有架構衝突。
隔離 – 可以同時執行多個事務。
永續性 – 當事務被“提交”時,它被儲存在記憶體中。
到目前為止,您已經了解了與資料庫設計相關的一些基本元件。 讓我們深入探討不同型別的資料庫。
所有資料庫都需要乙個資料模型,該模型指定資料的邏輯組織和原則。 關聯式資料庫本質上是一種資料庫,它使用關係資料模型將資料組織到具有資料條目行和預定義資料型別列的表中。 與另乙個表的主鍵列相關的外來鍵列表示表關係。
最重要的是,關係資料模型對資料值和關係施加了嚴格的約束,以確保它們始終對架構有效。 為了確保模式的一致性,幾乎總是使用 acid 事務。 該資料庫支援對索引進行特殊排序的資料結構,使訪問速度比逐行掃瞄更快。 但是,由於除了主表之外,還必須更新每個索引,因此讀取的效能提公升會被較慢的寫入所抵消。
當條目之間存在多對多關係時,當資料必須遵循預定模式時,或者當資料關係必須始終精確時,關聯式資料庫是最佳選擇。 另一方面,它們的主要缺點是難以在分布式集群上擴充套件。 緩慢的網路通訊會減慢資料庫程序。 Oracle、MySQL 和 PostgreSQL 是使用最廣泛的關聯式資料庫技術。
我們將在下一節中概述許多可用的非關聯式資料庫解決方案,以便您可以為您的系統體系結構選擇最佳資料庫方法。
根據資料的結構,您希望使用什麼模型來儲存資料?對於當今的系統設計人員來說,這是選擇資料庫時的乙個關鍵問題。 非關聯式資料庫旨在實現獨特的可伸縮性、架構靈活性或專用查詢功能。 正如您將在本節中發現的那樣,有許多不同型別的非關聯式資料庫。 我們將介紹建立系統時要記住的一些最重要的事情。
由於非關聯式資料庫正在處理在可用性和一致性之間具有不同優先順序的獨特用例,因此它們被歸類為 AP 或 CP 資料庫。 最終一致性的概念用於 AP 非關聯式資料庫,以確保一致性隨時間推移而發生,即使不能保證在事務完成時是合適的。
正如您將在本節中發現的那樣,有許多不同型別的非關聯式資料庫。 我們將介紹建立系統時要記住的一些最重要的事情。 讓我們開始吧!
節點和邊用於對圖形資料庫中的資料進行建模。 由於它們表示具有許多關係的資料,因此它們是與關係資料模型最相似的非關聯式資料庫。 由於資料不儲存在表中,因此圖形資料庫的基本優點是查詢不需要聯接即可遵循關係邊緣。 因此,遍歷圖形多個邊的查詢(如社交網路分析)非常適合它們。 Neo4J 和 CosmosDB 是業界頂級的圖形資料庫。
具有金鑰識別符號的簡單 JSON 物件通常儲存在文件儲存中。 文件收集有關單個主題的資料,這些主題可能分散在關聯式資料庫中的多個表中。 例如,文件儲存可以存檔特定患者的醫療文件,以便一次只需檢索乙個文件,並且所有重要資訊都可用。
MongoDB、Couchbase、Firebase 和 Dynamodb 是業界頂級的文件儲存資料庫。
術語“列資料庫”是指經常一起檢索的一組列。 列族資料庫表示表中的資料,就像關聯式資料庫一樣,但在檔案而不是行中維護列族,並且不強制實施關係約束。 此模型通過最大程度地減少具有強列族訪問模式的資料必須讀取的資料量來提高效能。 您還可以壓縮列以節省空間,因為它們往往會儲存重複的資訊,尤其是在資料稀疏的情況下。
Cassandra 和 HBase 是業界頂級的列系列資料庫。
時序資料庫針對需要嚴格按時間組織的資料條目進行了優化。 關鍵用例是儲存來自系統監視器的實時資料流。 由於時序資料庫需要大量寫入,因此它們通常包括在流到達時對流進行排序的服務,以確保它們以正確的順序追加。 這些資料集可以很容易地劃分為多個時期。 InfluxDB 和 Prometheus 是業界頂級的時序資料庫。
鍵值儲存有點類似於文件儲存。 由於鍵值儲存不知道值中的內容,因此它僅支援讀取、覆蓋和刪除操作。 沒有架構、連線或索引;它本質上是乙個巨大的雜湊表。 由於開銷低,因此易於擴充套件。 快取實現極大地受益於鍵值儲存。 Redis 和 Memcached 是業界排名靠前的鍵值儲存。
我們可能會根據我們的需求以及我們希望如何利用或訪問我們的資料來尋找以下儲存解決方案:
快取 – 在開發像大型社交網路這樣的讀取密集型系統時,我們最終可能會捕獲大量資料,甚至整個時間線,以實現低延遲要求。 Redis 或 Memcached 是這裡的兩種選擇。
檔案系統儲存 - 如果要建立資產傳送服務並儲存影象或音訊檔案,則需要使用 Blob 儲存。
我們現在已經了解了各種儲存解決方案,以及如何根據我們的需求和需要儲存的資料型別在不同的資料庫之間進行選擇。 然而,這夠了嗎?有時,單個資料庫不足以滿足我們的需求。 例如,在 Flipkart 的情況下,訂單資料必須遵守 ACID 原則,同時還要作為列式資料庫無限擴充套件。
在這種情況下,我們將使用資料庫組合,例如 MySQL + Cassandra。 現在,有關必須遵守 ACID 屬性的正在進行的訂單的所有資訊都將儲存在 MySQL 資料庫中。 完成後,它們將被移動到 Cassandra,在那裡它們可以用作永久儲存。 只要滿足 ACID 質量,資料就會儲存在關聯式資料庫中,然後遷移到列式資料庫以擴充套件資料。
資料庫系統不是平等的,每個系統都有自己的優點、缺點、優點和缺點。 概括地說,應按以下順序仔細評估和識別以下專案:
確定要儲存、查詢和更新的資料型別(結構化、非結構化或半結構化),如果相關,確定資料建模的最佳技術(例如,架構與架構、關係、文件、鍵值等)。 )
確定是否需要交易和 ACID 擔保。
確定是否需要複製和水平分割槽。
確定任何其他資料庫要求和優先順序,例如本文前面提到的要求和優先順序。
安全性、可擴充套件性、效能、供應商建立、穩定性和必要專業知識的可用性都是關鍵考慮因素。
確定可能存在的任何成本限制和預算。
隨著新技術的不斷湧現,這裡討論的所有內容以及當時最重要的可用選項將嚴重影響最佳解決方案。 此外,軟體和資料解決方案可以而且經常使用多個資料儲存系統,因此請考慮這是否適合您的特定應用程式。 如果是這樣,請如上所述為每個系統選擇正確的資料庫系統。
選擇資料庫時,需要明確資料的大小、資料的結構、資料之間的關係以及強制執行模式和確保一致性的重要性。 在大型系統中,乙個資料庫可能無法完成您需要的所有工作,因此需要多個資料庫。 隨著關聯式資料庫的規模越來越大,維護成本變得太高,因此不需要可靠架構或一致性保證的系統部分可以考慮使用非關聯式資料庫選項。
優質作者名單