Skip to main content

Command Palette

Search for a command to run...

Lesson 2: 資料儲存的抉擇:RDBMS vs NoSQL

Updated
1 min read

關於RDBMS(關聯式資料庫)

網路上有超多文章說明關聯式資料庫,簡單來說 關聯式資料庫就像是我們在Excel上面拉的表單,比如:會員資料表,我們在Excel上把對應的欄位標題(有點像前端的table-head , <th>)定義好,就是完成最基本的關聯式資料庫設計。每一筆資料就是一個row(就像是前端的table-data, <td>),這就是資料表(table)。

最常見的RDBMS:MySQL 以及 PostgreSQL。

MySQL vs PostgreSQL

在我身邊越來越多開發者,棄用MySQL轉投向PostgreSQL的懷抱,除了MySQL有許多莫名的坑以外(例如:5.7以上的版本,在subquery中的排序失效、Concat來連接字串的時候,如果其中一個值是 Null ,則最後的整個結果都會是 Null),還是有真正大家跳槽的更大推力。

  1. PostgreSQL 的一致性與 ACID 實作更強

  2. 查詢規劃器能力差異太大

  3. 資料型態與擴充能力遠勝 MySQL(尤其 JSONB 與地理資料)

  4. DDL、鎖、複寫等在高併發場景下可信度更高

MySQL 能滿足 80% 傳統 CRUD 場景,但 PostgreSQL 能承載更複雜、更龐大的資料與查詢需求。

關於NoSQL(非關聯式資料庫)

NoSQL 跟我們前面提到的關聯式資料庫(RDBMS)其實是兩種完全不同的思維。RDBMS 一定要先設好 Schema(欄位長怎樣、格式是什麼),然後所有資料都得乖乖照著這個規則走;但 NoSQL 就自由很多,最常見的資料存法就是用「鍵-值(Key-Value)」或 Document store 的方式來存。

NoSQL 最厲害的地方就在這裡:
它可以有 Schema,但它不會強迫你所有資料都長一樣。不像 RDBMS,一旦 Table 多了一個欄位,你資料庫裡所有的 row 都必須補上那個欄位(就算那筆資料根本不需要)。NoSQL 完全沒有這種強制規則,你要寫什麼就寫什麼,資料隨時想加欄位都沒問題,也不會影響舊的資料。

在Document store的資料結構的對照上,RDBMS 的 Table,就像 NoSQL 裡的 Collection;而 RDBMS 裡的一筆 Row,就對應到 NoSQL 裡的一個 Document。差別在於:
同一個 Collection 裡的 Document 不需要長得一模一樣。
有的文件可能多一個 address,有的可能少一個欄位,有的甚至多一個 metadata 都很正常,系統也不會抱怨。

這也是為什麼 NoSQL 很適合那些「需求一直變」、「資料格式不固定」、「開發節奏很快」的系統。像是 API 回傳資料、使用者設定、事件紀錄、各種 JSON payload 等等,用 NoSQL 都會比 RDBMS 來得自然。

簡單說,NoSQL 不是完全沒有 schema,而是採用 「寫入不限制,讀取再解釋」 的模式。這種彈性讓它在現代高變動的應用場景裡特別吃香。

Key-Value Store:

  • Redis

  • Amazon DynamoDB

Redis 通常用在快取服務,因為它的核心特性是「記憶體寫入」,速度極快。但這也代表如果系統重啟或 Redis 當掉,資料會全部消失,因此不適合作為主要的持久化資料庫。
為了解決這個問題,Redis 也提供兩種持久化方式:

  1. RDB:在指定的時間點對記憶體中的資料進行快照(snapshot),並將這些資料以二進位格式的檔案(例如 dump.rdb)寫入硬碟。

  2. AOF:記錄伺服器執行的所有寫入指令,在伺服器重啟時,會重新執行這些指令來還原資料。

這兩種方式可以單獨使用,也可以一起開啟,視需求取得速度與持久化的平衡。

Document Store:

  • MongoDB(以 BSON 格式儲存文件資料,結構自由、彈性高)

從Rookie到Junior,一個後端成長的30堂課

Part 28 of 31

“從 Rookie 到 Junior:一個後端成長的 30 堂課” 是一套專為後端新手所設計的成長型技術系列文章。內容以實務為導向,逐步拆解後端工程的核心能力,包括程式語言基礎、架構思維、框架運作原理、業務邏輯設計、資料庫操作、以及常見的開發模式。 本系列的目標是協助讀者從零散的學習堆疊,建立成體系的後端知識框架。讀者能夠理解各語言背後不變的工程思維與設計原則。這套內容旨在讓學習者從「會寫程式」進入「能理解系統設計」的階段,逐步具備勝任 Junior Backend Engineer 的能力。

Up next

Lesson 1:後端生態系與分層架構思維

後端常見的語言有非常多,包含常見的C#、.NET、Java、Python、Go…等,雖然程式語言眾多,但萬法不離其宗,背後的架構思維與解決問題的能力才是工程師的核心價值 關於系列文章採用語言 如果內容包含程式舉例,本文會採用Laravel作為範例語言。 關於PHP PHP語言本身的底層是透過C語言來進行撰寫的。本身PHP的核心:Zend引擎是完全用 C 語言實現的,它負責將 PHP 程式碼編譯成可執行的中間碼,並處理底層的數據結構和記憶體管理。 PHP的Framework 常見的PHP Fr...

More from this blog

Lesson 26 : 系統韌性的守護者-限流、熔斷與背壓的設計模式

當這幾個名詞出現後,代表我們進到了一個高併發/大流量的系統了。在這個章節中,我們一起來看看如何透過一些方式來避免高併發導致我們的系統crash掉。 限流(Rate Limiting) 相信大家對這個名詞並不陌生,限流其實就是字面上的含意,限制流量。 限流的目的是保護「接收方」,確保系統不會因為瞬間的高併發請求而癱瘓。 限流通常發生在 API Gateway 或服務的最前端。它像是一個夜店門口的保全

Mar 26, 20262 min read

Lesson 25: 淺談 單體架構、微服務架構與單/多租戶架構

過去我們討論了 要把程式寫在哪、程式要怎麼拆的題目,接下來我們來看看「如何服務不同客戶」,這些架構反映了軟體開發在擴充性與複雜度之間的權衡。 軟體架構深度解析:從系統拆分到商業規模化 在軟體工程的演進中,架構的選擇往往是在「開發效率」、「系統擴充性」與「營運成本」之間尋求平衡。我們可以從兩個核心維度來觀察這些架構:系統如何運行(單體 vs. 分散式) 以及 如何服務客戶(單租戶 vs. 多租戶)。

Mar 26, 20262 min read

Lesson 24: 資料庫擴展術-讀寫分離、複寫機制與快取一致性挑戰

為什麼要讀寫分離? 大多數的 Web 應用都是 「讀多寫少」(例如:看文的人多,發文的人少,Heavy Read System)。當所有的請求都塞給同一台資料庫時,磁碟 I/O 和連線數會成為瓶頸。 Master (主庫): 負責寫入 (Insert/Update/Delete),確保數據一致性。 Slave (從庫): 負責讀取 (Select),可以有多個從庫來分擔讀取壓力。 為什麼讀

Mar 25, 20262 min read

面試經驗談 2025-2026

從2025年3月開始,我陸陸續續參與了從新創到上市櫃公司的Senior - Tech Lead的相關面試,其中有不乏 尊重面試者、展現高度專業的企業(公司),當然也有遇到幾場面試鬼故事,這篇文章主要分享我對於軟體工程師面試的方向分享,以及部分鬼故事,以此警惕自己不要成為這樣的面試官。 AI的洪流,改變了SWE的生態 LLM的發展確確實實的影響到了軟體工程師的生態。 過去受限於算力與資料規模,深度學

Mar 23, 20262 min read

Lesson 23: 系統的緩衝區-Queue 佇列與非同步處理 (Asynchronous)

佇列 佇列的實作工具非常多,舉凡AWS SQS、RabbitMQ、Kafka…等。 佇列的特性,其實是一個非常強大的系統緩衝區,應用層面非常廣。 什麼是佇列? 佇列可以想像成,在既有流程中外,有另一個”水管”,來連接原有的資料流(或邏輯過程),其中 呼叫方將資料 推(Push)到水管中,接受方(監聽) 從水管中將資料拉(Pull)出處理 為什麼佇列是「強大的緩衝區」? 在同步處理中,系統像是一

Mar 23, 20262 min read

Bennett's Tech Blog | 後端架構、系統設計

32 posts

來自台灣的軟體工程師,相信軟體可以改變世界