關聯式資料庫與NoSQL資料庫的差異

自從1974年IBM開發了System R建立了關聯式資料庫的雛型,至今已經五十年。雖然其間還有很多不同類型的資料庫產生,例如物件導向資料庫 (Object-Oriented Database)、分散式資料庫 (Distributed Database)、圖形資料庫 (Graph Database)、時序資料庫 (Time Series Database)等,但是始終無法撼動關聯式資料庫的地位。

1998年開始出現NoSQL這個名詞,由Carlo Strozzi提出,不過當時的NoSQL還是屬於關聯式資料庫。到了2009年,Rackspace的Eric Evans又再次提出了NoSQL的概念,這次他指的NoSQL是屬於非關聯式的,與Carlo Strozzi的NoSQL並不相同,但是其目的也不在取代關聯式資料庫,而是強調鍵-值儲存(Key-Value)和文件導向資料庫(Document-oriented Database)的優點,自此真正的「非關聯式資料庫」才真正開始蓬勃發展。

但是在NoSQL這個詞彙出現前,Google的Bigtable早已經在2004年出現,它也是屬於NoSQL,是一種壓縮的、高效能的、高可延伸性的,基於Google檔案系統(Google File System,GFS)的資料儲存系統,用於儲存大規模結構化資料,適用於雲端計算。

我們以 https://onecompiler.com/ 來看看關聯式資料庫與NoSQL的實際使用。

(1) MySQL 關聯式資料庫 : 

關聯式資料庫是以表單(Table)為基礎,以主鍵(primary key)與外鍵(foreign key)在各表單間產生關連。

(2) PostgreSQL 物件導向式資料庫 : 

PostgreSQL 雖然也算是關聯式資料庫,但是也具有物件導向式資料庫的特性,可以使用繼承的方式。

CREATE TABLE vehicles (
vehicle_id SERIAL PRIMARY KEY,
make VARCHAR(100),
model VARCHAR(100),
year INT ); 

CREATE TABLE cars (
car_licence_plate VARCHAR(20)
) INHERITS (vehicles);

因為cars繼承了vehicles的屬性,因此cars就有5個欄位。


(3) MongoDB 非關聯式資料庫 : 

MongoDB 是一種流行的非關聯式資料庫,屬於 NoSQL 資料庫。它於 2009 年首次發布,設計目的是為了滿足快速開發和處理大規模數據集的需求。MongoDB 使用文檔導向的模型來儲存數據,這與傳統的關係型資料庫系統(如 MySQL、PostgreSQL)基於表格的存儲模型有著本質的不同。

如下圖,MongoDB 以JSON的方式儲存數據。


db.employees.insertMany([ 
{empId: 1, name: 'Clark', dept: 'Sales' }, 
{empId: 2, name: 'Dave', dept: 'Accounting' }, 
{empId: 3, name: 'Ava', dept: 'Sales' } ]); 

db.employees.find({dept: 'Sales'});

執行結果如下

Output: 
"acknowledged" : true, 
"insertedIds" : [ 
ObjectId("65d1e033a0740d4a1c8eb2ae"), 
ObjectId("65d1e033a0740d4a1c8eb2af"), 
ObjectId("65d1e033a0740d4a1c8eb2b0") 
] } 
{ "_id" : ObjectId("65d1e033a0740d4a1c8eb2ae"), "empId" : 1, "name" : "Clark", "dept" : "Sales" } 
{ "_id" : ObjectId("65d1e033a0740d4a1c8eb2b0"), "empId" : 3, "name" : "Ava", "dept" : "Sales" }

(4) Redis 非關聯式資料庫 : 


看完了以上不同資料庫的實際存取方式後,我們來談談為何用了這麼久的關聯式資料庫之後,會需要知道NoSQL呢?


為什麼使用 RDBMS? 

需要確保 ACID 特性的情境。關聯式資料庫 (RDBMS) 類型的資料庫保證了 ACID,保證了資料的一致性。舉例在金融類型的應用,你會希望匯入匯出的錢,能夠同步一致的更新到資料庫上,以防重複扣款或是餘額顯示錯誤等等的狀況。而 NOSQL 沒有保證 ACID ,所以在這種情況下,RDBMS 相較於 NOSQL 更適合。

為什麼使用 NoSQL? 

由於 NoSQL 的 schema 不需要固定,且資料可以為任意結構。所以在 schema 需要頻繁變動或者是 schema 不固定的時候,NOSQL 提供更有彈性的開發。比如在開發初期,schema 會需要頻繁更新,這時候 NOSQL 就比較適合。 需要儲存大量資料,利用分散式系統以及雲端儲存的時候。由於 NOSQL 相較於 RDBMS 更容易做 horizontal scaling,且本身的設計就是分散式系統的設計。因此對於未來有大量擴充需求的系統,會更容易的去做水平的擴充,且擴充的成本也較低。(水平擴展是指增加更多節點,垂直擴展是指是指通過增強現有節點的硬體資源來提升其處理能力和存儲容量。這通常涉及增加更多的 CPU、更大的記憶體、更快的磁碟或更多的存儲空間。)

另外,同為NoSQL的MongoDB與Redis,還是有所差異。MongoDB 和 Redis 都支援以鍵值對的形式存儲數據,但它們在數據模型和用途上有顯著的不同:

MongoDB: 是一個文檔導向的 NoSQL 資料庫,它使用文檔(通常是 BSON 格式)來存儲和管理數據。

BSON是指Binary JSON,MongoDB 每個文檔都有一個唯一的鍵(通常是 _id 欄位),但文檔中可以包含豐富的數據結構,如列表、嵌套對象等。 MongoDB 的強項是其能夠存儲複雜的、結構化或半結構化的數據,並提供豐富的查詢語言和索引支援,適用於需要複雜數據處理和大規模數據存儲的應用。 

Redis: 是一個高性能的鍵值存儲系統,它支援多種數據結構,包括字串(strings)、列表(lists)、集合(sets)、有序集合(sorted sets)、雜湊表(hashes)等。在 Redis 中,每個數據元素都是通過一個鍵(key)來訪問。 Redis 的設計重點在於提供高速的數據讀寫性能,通常被用作應用的緩存系統或消息隊列。由於 Redis 將數據存儲在內存中,它能夠提供極快的數據訪問速度。 

因此,雖然 MongoDB 和 Redis 都可以某種方式處理鍵值對,但 MongoDB 是一個面向文檔的數據庫,更適合於存儲複雜的數據結構和進行豐富的數據查詢;而 Redis 是一個鍵值存儲系統,以其高速的數據存取性能和支援多種數據結構而著稱,常用於緩存和臨時數據存儲。 因此,把 MongoDB 和 Redis 歸類為純粹的「鍵值存儲」會有所簡化,尤其是對於 MongoDB,它的數據模型和功能遠遠超出了簡單的鍵值對存儲。

張貼留言

0 留言