Graph / Image / Photo / Picture 等詞有時候容易弄混,這邊所說的 Graph Database 並不是拿來存放影像照片一類的資料庫,而是存放 Graph (圖)結構
的資料庫。首先先來了解什麼是圖,圖由 Vertex (節點)
和 Edge (邊)
組成,節點和節點之間由邊串接,形成的結構就稱為圖。
通常使用節點表示集合中的物件,例如;所有國家(集合)中的臺灣(節點)、好友清單(集合)中的王小明(節點)或運動品牌(集合)中的 Nike (節點)。節點本身可以有一些附屬資訊,以前面提到的國家為例,國家的附屬資訊可以包含土地面積、經緯度、人口和GDP。
邊常被用來表示節點與節點之間的關係或流向,可以是有方向性的也可以沒有,例如:城市之間的人口遷徙(有向)或是兩人之間的友誼關係(無向)。邊也可以有一些附屬資訊,以人際關係來說,同樣都是朋友,有些朋友跟你比較親,有些則是點頭之交。
一個圖中可以有一或多種的節點,也可以有一或多種的邊,像是社群媒體資料庫的節點可能會有使用者和貼文兩種,台北和台南兩個城市間有高鐵、台鐵和一般道路三種不同的交通方式。圖的大小可以用節點的數量和邊的數量來衡量,會直接影響到計算的成本,例如在大圖上要走遍每個節點的成本會比小圖高得多。
前面簡單講解了圖的概念,那麼為什麼會需要以圖做為儲存結構呢?這類的資訊在關聯式資料庫中如果要儲存,會出現多對多的資料表設計來儲存邊,進行節點走訪等行為時就會需要多次的 Join,在效能上比較差,也提升了複雜度。Graph Database 的優勢是在進行這類圖形或網路結構的運算相對明確。舉例來說,在族譜上有人和親屬關係,人表示節點,親屬關係則是邊,我們可以從節點 A 透過邊走訪到節點 B,來知道 A 和 B 兩人的親等;社群媒體的人際關係推薦、地圖導航時的路線最佳規劃和推算病毒細菌的傳播速度等也都是常見的應用領域。