[軟體概念入門系列] 關聯式, 非關聯式資料儲存與伺服器快取
本節介紹關聯式與非關聯式資料庫, 以及常見的快取實作
正規化
為消除資料重複性, 提高資料可維護性及一致性, 使用多個資料表儲存不同類型資料
反正規化
將所有種類的資料直接儲存於該筆資料上, 在資料不會異動或較講求查詢效能的情境下較適合使用
資料庫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過期造成對資料庫, 硬碟要處理瞬間大量讀取
延伸閱讀: