資料庫基礎介紹 – 系統設計 08

system-design-系統設計08-資料庫基礎介紹-introductoin-to-database-fundamentals-hogantech-hoganblab

什麼是資料庫?

資料庫顧名思義,就是儲存資料的地方,那麼我們有沒有辦法,在不使用資料庫的情況下,開發軟體系統呢? 如果是早期靜態式網頁,只有規模較小的靜態文字的話,沒有資料庫也是沒問題的。不過隨著當代系統越來越複雜,應用程式越來越豐富,我們就必須要使用資料庫來去儲存資料。例如:Youtube 需要龐大且複雜的資料庫,來去儲存不同類型、規模的資料。

當然資料庫也有更精確的定義,以下是從 Oracle 節錄下來的定義:

資料庫是結構化資訊或資料的有組織的集合,通常以電子方式儲存在電腦系統中。 資料庫通常由資料庫管理系統(DBMS)控制。資料和 DBMS 以及與其關聯的應用程式一起被稱為資料庫系統,通常簡稱為資料庫。

當今運行的最常見資料庫類型中的資料通常以一系列表中的行和列進行建模,以提高處理和資料查詢的效率。 然後可以輕鬆存取、管理、修改、更新、控制和組織資料。 大多數資料庫使用結構化查詢語言(SQL)來寫入和查詢資料。

資料庫基本上會有兩種類型,分別是:SQL(關聯式資料庫) 以及 NoSQL(非關聯式資料庫),相信不少讀者也有聽過這些資料庫的名字,其中關聯式資料庫是具有結構化的資料,並且資料庫建立於關聯模型之上,以直接且直覺的方式於資料表上顯示資料。非關連式資料庫則是非結構化的資料,相對發散且專為特定資料模型而建置,並將資料存放在靈活的結構,以便現代應用程式輕鬆擴展。 NoSQL 資料庫在開發的容易性、功能性和大規模效能方面廣受肯定。

資料庫優點

資料庫對於每個公司、組織都是非常重要的,因為這些資料庫儲存了所有資料,例如:一家公司的員工資料、客戶資訊、交易紀錄…等等。

基本上資料庫有以下優點:

管理大數據:使用資料庫可以輕鬆處理大量數據,而使用其他工具則無法做到這一點。

資料一致性:我們可以隨時檢索正確的資料。

資料安全性:資料庫保證資料的安全,只允許授權使用者存取資料。

資料完整性:資料庫透過對資料使用不同的限制來確保資料完整性。

系統可用性:資料庫可以在不同的伺服器上複製(Replication),並且可以同時更新。

可擴展性:資料庫被劃分(Partition)來管理單一節點上的負載,提高了系統可擴展性。

ACID

ACID 是由四個單字所組成,分別是:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability),這四個特性也是資料庫管理系統(RDBMS)在寫入資料或是更新資料時,為了保證過程正確而必須要有的特性。

在資料庫系統中,一個交易(Transaction)是指:由資料庫操作組成的一個完整邏輯,舉例來說:銀行轉賬,從原本的帳戶中扣款,並且將對方帳戶新增款項,這兩個資料庫的操作構成一個完成的邏輯,並且是不可以分割的,這樣的一個過程也包含了 ACID 的特性,接下來我們簡單講解一下 ACID 吧!

原子性(Atomicity)

原子性保證交易被視為不可分割的單元,代表著交易中的所有操作都必須成功,或者都不能成功。 這對於防止發生資料不一致非常重要。

一致性(Consistency)

一致性確保對資料庫的所有更新都是一致的,代表資料庫必須保持著有效狀態,即使多個事務同時存取資料也是如此。

隔離性(Isolation)

隔離性確保交易彼此獨立執行,代表說交易的操作不能干擾另一個交易的操作,這個特性對於防止資料損壞的發生非常重要。

持久性(Durability)

持久性確保交易一旦提交,其影響就是永久性,也代表交易對資料庫所做的變更不會遺失,即使出現斷電或其他系統故障。

關聯式資料庫(Relational Database)

講完了 ACID 的特性,讓我們回過頭來講解資料庫,關聯式資料庫的流行和主導地位有多種原因,包括管理通用資料的簡單性、穩健性、靈活性、效能、可擴充性和相容性。

關聯式資料庫本質上提供了原子性、一致性、隔離性和持久性(ACID)的特性,因此本質上就是一個很好的資料庫性質。還記得我們 抽象在系統設計中的應用 – 系統設計 02 有提到抽象的概念,ACID 也是一個抽象概念,簡化了資料交互操作的複雜性。當然關聯式資料庫會成為主流的原因也包含:簡單性、穩定性、靈活性、效能性、擴充性、相容性。

一些流行的 DBMS 如下:

MySQL、Oracle Database、Microsoft SQL Server、IBM DB2、Postgres、SQLite。

關聯式資料庫範例

首先是關聯式資料庫 (RDB) 是在資料表、資料列和資料欄中建構資訊。RDB 可透過彙整資料表來建立資訊之間的關聯或關係,以便輕鬆瞭解各資料點之間的關係並取得深入分析。

關聯資料庫原本是由 IBM 的 E.F. Codd 於 1970 年代開發,允許任何資料表使用通用屬性與其他資料表建立關聯。可以把關聯資料庫想像成一個 Excel 集合,可以協助公司建立資料關聯。如同 Excel ,每一個試算表都是儲存資訊的資料表,並且使用資料欄(屬性)以及資料列(紀錄)表示。

GCP 範例

system-design-系統設計08-資料庫基礎介紹-introductoin-to-database-fundamentals-hogantech-hoganblab-01

「客戶」資料表含有客戶相關資料:

客戶 ID (主鍵)、客戶名稱、帳單地址、收件地址

在「客戶」資料表中,客戶 ID 是一組主鍵(Primary key),專門用來在關聯資料庫中識別客戶。所有客戶的客戶 ID 都不同。

「訂單」資料表含有訂單的相關交易資訊:

訂單 ID (主鍵)、客戶 ID (主鍵)、訂購日期、運送日期、訂單狀態

假設一個小型公司使用兩個資料表來處理產品訂單。第一個資料表示客戶資料表,紀錄客戶編號、客戶姓名、地址、運送地址、帳單地址、電話號碼、其他聯絡資訊。這時候的主鍵可以設定為客戶編號,因為此資料具有唯一性,不會重複。

第二個表格表示客戶訂單資料表,紀錄產品訂單的資訊,包含:客戶編號、訂單編號、訂購的產品、數量、尺寸、顏色。這時候的主鍵則可以設定為訂單編號,並且不會重複。再藉由客戶編號,此為共同索引鍵,來將兩個資料表做關聯建立。最終,公司訂單處理應用程式將訂單提交至資料庫時,資料庫就可以進入客戶訂單表,提取正確的產品訂單資訊,並利用該表格的客戶編號在客戶資訊表中查詢客戶的帳單和出貨資訊。

為什麼選擇關聯式資料庫(SQL)?

通常如果沒有指定資料庫形式,開發時我們都會預設關聯式資料庫。其中的優點包含,它對 ACID 交易和相關程式設計的抽象。這樣的抽象概念也會讓軟體工程師使用資料庫變得非常方便,接下來分別講講他的優點吧!

關聯式資料庫優點

靈活性(Flexibility):在SQL上下文中,資料定義語言(DDL)全名為(Data Definition Language ),DDL 為我們提供了修改資料庫的靈活性,包括表格、列、重新命名表和其他變更。

減少冗餘(Reduce Redundancy):資料冗餘(Data Redundancy)是指同一個數據或是資料在資料庫中多次重複出現,在一般文件系統中,由於文件之間沒有聯繫,所以有時候會有一筆資料在多個文件中出現。關聯式資料庫的最大優點之一是減少了冗。消除數據冗餘的目的是為了避免更新時可能出現的問題,以便保持數據的一致性。

並發性(Concurrency):並發性是一個很重要的特性,在高並發情況下,資料會被許多使用者同時讀取和寫入資料庫。因此我們需要協調這些操作,避免資料不一致,例如:飛機票如果同時被多個人預定,則必須要避免同時寫入。 關係資料庫中的並發性是透過對資料的交易存取來處理的。

備份與復原(Backup and Recovery):關聯式資料庫保證資料狀態在任何時候都是一致的。大多數基於雲端的關聯式資料庫都會執行連續鏡像,以避免資料遺失並使復原過程更加輕鬆快速。

關聯式資料庫缺點

阻抗不匹配(Impedance Mismatch)

這邊要先好好講解一下,阻抗不區配是什麼?資料庫阻抗不匹配(Database Impedance Mismatch)是指在軟體開發中,不同軟體元件或系統所使用的資料結構和模型之間缺乏一致性時產生的常見問題。

在資料庫中,阻抗不匹配指的是物件導向程式設計(OOP)模型與關係型資料庫管理系統(DBMS)所使用的關係模型之間的差異。

這邊也找到一隻圖,簡單講解所謂的不匹配的意思,圖中上方為記憶體資料結構,可能是樹、陣列、鏈結串列、雜湊…等等,右下方為關聯式資料庫的圖例。當兩者儲存資料的方式不一致,在操作資料庫時就會發生問題。阻抗不匹配(Impedance Mismatch)也是關聯式資料庫的重要缺點。

system-design-系統設計08-資料庫基礎介紹-introductoin-to-database-fundamentals-hogantech-hoganblab-02

非關聯式資料庫(Non-relational Database)

什麼是NoSQL?

NoSQL 的意思是 Not Only SQL,是一種非關聯式資料庫,也就是說它不使用傳統的關聯式資料庫模型來儲存資料。NoSQL 資料庫通常使用更靈活、更可擴展的資料模型,例如鍵值對、文件、圖形或寬表。

NoSQL 資料庫的類型

鍵值資料庫(Key-value database)

鍵值資料庫使用雜湊表(Hash Table)等鍵值方法以鍵值對的形式儲存資料。鍵充當主鍵(Primary Key),值(Value)可以是從簡單標量值到複雜物件的任何值。常見的鍵值資料庫,包含:Amazon DynamoDB、Redis 、Memcached DB。

使用情境:

  1. 緩存: 鍵值資料庫通常用作緩存,以快速存取經常使用的資料。例如,Web 應用程式可以使用鍵值資料庫來緩存頁面內容。
  2. 會話資料: 鍵值資料庫可用於儲存會話資料,例如用戶登入資訊和購物車內容。
  3. 配置資料: 鍵值資料庫可用於儲存配置資料,例如應用程式設定和系統參數。
  4. 計數器: 鍵值資料庫可用於儲存計數器,例如網站流量統計資料。

文件資料庫(Document database)

XML、JSON、BSON 等格式的文檔都是文件資料庫的中的儲存形式,這些文件檔案是由特別的資料結構組成,其中可以包括映射(map)、集合(collection)。常見的文件資料庫,包含:MongoDB 、 Firestore。

使用情境:

  1. 內容管理系統 (CMS): CMS 使用文件資料庫來儲存內容,例如文章、頁面和媒體檔案。
  2. 電子商務網站: 電子商務網站使用文件資料庫來儲存產品資料、客戶資料和訂單資料。
  3. 社交媒體應用程式: 社交媒體應用程式使用文件資料庫來儲存用戶資料、帖子和評論。
  4. 應用程式日誌: 應用程式日誌使用文件資料庫來儲存應用程式日誌資料。
  5. 物聯網 (IoT) 設備: 物聯網 (IoT) 設備使用文件資料庫來儲存感測器資料和設備狀態。

圖資料庫(Graph database)

圖資料庫使用圖形來儲存資料,圖形由節點和邊緣組成,節點表示實體,邊緣表示實體之間的關係,常見的圖資料庫包括:OrientDB 、InfiniteGraph。

使用情境:

  1. 社交網絡分析: 社交網絡分析使用圖資料庫來分析社交網絡中的關係,例如朋友、家人和同事之間的關係。
  2. 推薦系統: 推薦系統使用圖資料庫來推薦產品或服務給用戶,基於用戶的興趣和與其他用戶的關係。
  3. 欺詐檢測: 欺詐檢測使用圖資料庫來檢測欺詐行為,例如識別與已知欺詐者相關的交易。
  4. 知識圖譜: 知識圖譜使用圖資料庫來儲存和查詢有關現實世界的知識,例如實體、概念和它們之間的關係。
  5. 供應鏈管理: 供應鏈管理使用圖資料庫來管理供應鏈中的關係,例如供應商、製造商和零售商之間的關係。

柱狀資料庫(Columnar database)

柱狀資料庫(Columnar database) 是一種資料庫,它將資料儲存在列中,而不是行中。這與傳統的關聯式資料庫不同,傳統的關聯式資料庫將資料儲存在行中,柱狀資料庫可以有效壓縮資料,因為它們可以儲存大量相同的值。常見的柱狀資料庫包括: HBase、Hypertable 、Amazon Redshift。

使用情境:

  1. 科學計算: 科學計算使用柱狀資料庫來分析科學資料。
  2. 金融分析: 金融分析使用柱狀資料庫來分析金融資料。
  3. 廣告分析: 廣告分析使用柱狀資料庫來分析廣告活動的效果。

NoSQL 資料庫優點

設計簡單:與關聯式資料庫不同,NoSQL 不需要處理阻抗不匹配的情況,例如,將所有員工的資料儲存在一個文件中,而不是需要連接作業的多個表。 這種策略使得編寫更少的程式碼、偵錯和維護變得簡單和容易。

水平擴展:首先,NoSQL 是首選,因為它能夠在大型叢集上運行資料庫。NoSQL 資料庫通常將資料分佈在多個節點上,並自動平衡節點之間的資料和查詢。

可用性:為了增強資料的可用性,可以在應用程式不停機的情況下進行節點更換。 大多數非關聯式資料庫的變體都支援資料複製,以確保高可用性和災難復原。

成本低:許多 RDBMS 的授權非常昂貴,而許多 NoSQL 資料庫是開源的並且免費提供。 同樣,一些 RDBMS 依賴昂貴的專有硬體和儲存系統,而 NoSQL 資料庫通常使用廉價的商品伺服器叢集。

NoSQL 資料庫缺點

缺乏標準化:NoSQL 不遵循任何特定標準,例如:將應用程式從一種類型的 NoSQL 資料庫轉換到另一種類型資料庫是有難度的。

一致性:NoSQL 資料庫根據發生故障時,一致性和可用性是需要做考量的,並且非關聯式資料庫不會有好的資料完整性,資料也不是強一致的。

複雜性:NoSQL 資料庫的模型和介面可能比關聯式資料庫更複雜,光是非關聯式資料庫就有好幾種類型,但關聯式資料庫介面不會相差太多。

關係型和非關係型資料庫如何選擇?

很多因素會影響選擇,而以下表格是關聯式資料庫和非關聯式資料庫的對比:

關聯式資料庫非關聯式資料庫
結構化:資料以表格形式儲存,每個表格由行和列組成。行代表資料記錄,列代表資料屬性。資料必須符合預先定義的格式。靈活:可以儲存各種格式的資料,包括 JSON、BSON 和圖形。資料結構可以是結構化的、半結構化的或非結構化的。
適合 OLTP(聯機交易處理):擅長處理頻繁的讀寫操作,例如訂單、交易和登入。適合 OLAP(聯機分析處理):擅長處理複雜的查詢和分析,例如銷售趨勢、顧客行為和市場分析。
較難橫向擴展:隨著資料量的增加,效能可能會下降。需要添加更多伺服器才能處理更多資料。易於橫向擴展:可以通過添加更多節點來處理更多資料,而不會出現效能瓶頸。
ACID 保證:原子性、一致性、隔離性和持久性。資料始終保持一致,即使在多個使用者同時訪問的情況下也是如此。可能沒有 ACID 保證:資料在某些情況下可能不一致,例如在多個節點之間複製資料時。
模型和介面可能更複雜:需要了解 SQL 等查詢語言。模型和介面通常更簡單:易於使用和理解。
成熟技術:已經存在了幾十年,具有廣泛的支援和工具。較新技術:仍在發展中,可能缺乏成熟的工具和支援。

相關文章

負載平衡器解說 – 系統設計 07

DNS 是什麼?網域名稱系統介紹 – 系統設計 06

系統設計元件介紹 Building Block – 系統設計 05

Back-of-the-envelope 封底計算 – 系統設計 04

軟體設計非功能性特性 – 系統設計 03

抽象在系統設計中的應用 – 系統設計 02

現代系統設計介紹 – 系統設計 01

引用

What is a relational database?

Impedance Mismatch When Mapping from a Relational Database

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

zh_TW繁體中文