在網頁服務中資料庫擔任了很重要的任務,用來保存客戶的資料與提供分析的數據來源,而針對不同的需求會有各類型適合資料庫來負責。 這篇文章中會針對 Row-Oriented (以列為儲存主體) 和 Columnar (以行為儲存主體) 的兩種資料庫來分析任務與資料庫間的合適搭配。
Row-Oriented 的意思
Row-Oriented 的資料庫在儲存上會將圖上 同一 Row 的資料存為一組,因此只要知道 Id 就能快速的撈出他所在那 Row 的資料。
如圖所示,我可以透過 VendorId 找到商品的 Price 與 Cost。
而這樣的設計在統計分析上就會有一定程度的效能損耗,原因在於說我如果是想要統計所有的 Price 的加總,我雖然只需要每一個 Row 的 Price,但還是會讀取到其他的資料,導致存取上的浪費。
Columnar 的意思
Columnar 的資料庫在儲存上會將圖上同一 Column 的資料存為一組,因此可以簡單的針對某一欄位做運算。
如圖所示,我可以直接將 Price 做加總而不需要涉及到其他欄位的資料。
而這樣的設計在一般用途上就會很不方便,當我想要透過 VendorId 找到商品的 Price 與 Cost 時,我需要將 VendorId、Price、Cost 的欄位全部撈出來,並且找到相對位置的資料,在查找上非常沒有效率。
Row-Oriented 與 Columnar 的差異
現在我們知道 Row-Oriented 與 Columnar 主要是儲存資料時的結構差異。
Row-Oriented 代表的資料庫有 MySQL、PostgreSQL、MSSQL
適用於以 Id 來找關聯資料的系統如: 電商、會員管理、庫存管理的系統
Columnar 代表的資料庫有 Google Cloud BigQuery、Snowflake
適合用於統計分析的場景,如報表系統
如何選擇
以上可以看出 Row-Oriented 與 Columnar 沒有絕對優勢,而且通常在一套系統存在大量存取時會同時使用兩種資料庫,比如電商系統在交易時採用 Row-Oriented,而在分析時將資料從 Row-Oriented 轉移到 Columnar 來做複雜的報表分析,以提升整套系統的乘載量與穩定性。