[軟體概念入門系列] 關聯式, 非關聯式資料儲存與伺服器快取

Brett Yu
Brett’s dev log
Published in
Nov 4, 2023

本節介紹關聯式與非關聯式資料庫, 以及常見的快取實作

正規化

為消除資料重複性, 提高資料可維護性及一致性, 使用多個資料表儲存不同類型資料

反正規化

將所有種類的資料直接儲存於該筆資料上, 在資料不會異動或較講求查詢效能的情境下較適合使用

資料庫ACID

  • Atomicity 原子性 一個Transaction中的所有操作, 僅有全部完成跟全部不完成兩種結果, 若執行過程發生錯誤會被Rollback回到執行前的狀態
  • Consistency 一致性 Transaction完成前後資料庫的完整性不被破壞, 亦即資料必須符合預先定義的schema及限制等規則
  • Isolation 事務隔離 多個Transaction同時對資料讀寫時, 不會互相干擾
  • Durability 持久性 Transaction結束後, 對資料的修改就會被保存, 即使系統故障也不會消失

關聯式資料庫 Relational Database Management System

關聯式資料庫需預先定義Schema, 只允許同樣格式的資料寫入, 具備ACID特性並會依據情況設計正規化或反正規化資料表, 並會在查詢時使用Join來結合多個正規化的資料表來取得資料

由於關聯式資料庫的Transaction須符合ACID特性, 在大量資料寫入需要處理相關的資料鎖定作業, 故時常會是效能瓶頸, 也不利於Scale out, 因若要跨多個伺服器鎖定會對效能影響更加顯著

代表性資料庫如: MSSQL, MySQL, Oracle, PostgreSQL

(PostgreSQL有支援存放json格式的欄位型態)

非關聯式資料庫 NOSQL

非關聯式資料庫通常不具備所有ACID特性, 可不需要預先定義schema, 設計上通常為反正規化資料表為主

相較於關聯性資料庫, 非關聯式資料庫本身就是基於分散式架構而設計, 且資料間相依性較小可獨立存放在不同伺服器中, 故較容易Scale out

代表性資料庫如: MongoDB, Redis, Elasticsearch

Cache 快取

這邊介紹的主要是Server端Cache, 由於伺服器至硬碟讀取資料(透過資料庫, 或存取圖片)都是較花費資源的操作, 因此Server端會為常被讀取的資料建立Cache機制, 一般來說這些資料都存在記憶體中來增加查詢的速度, 如MSSQL的In-Memory table, .net中的Memory Cache或使用Redis做分散式快取

一般實作Cache要考慮的有以下幾點

資料適合做Cache嗎

  • 資料被異動的頻率越低越適合
  • 資料被讀取的頻率越高越適合

需要Cache多少資料

  • 每筆資料大小
  • Hot/Cold data

如何同步Cache資料

  • 先寫入資料庫再存Cache
  • 先寫入Cache再寫入資料庫
  • 寫入資料庫後刪除Cache

如何處理查不到Cache的情況

  • Cache預熱初始化資料
  • 避免因不存在的資料, Cache Service異常, Cache過期造成對資料庫, 硬碟要處理瞬間大量讀取

延伸閱讀:

RDBMS與NOSQL比較

Cache策略

--

--