guest@blog.cmj.tw: ~/posts $

Database 101 - NoSQL


How the data stored into the database

主要是了解資料庫底層的資料是如何儲存:如何結構化的儲存資料。針對關聯式資料庫跟非關聯式資料庫做簡單的分析。

非關聯式資料庫

非關聯式資料庫 (NoSQL) 代表所有非表格的方式儲存的資料庫。這類型的資料庫例如有:鍵值型、物件型、文件型、圖形型等等。

概念上相對於 RDBMS 來說 NoSQL 不需要有固定的結構,針對不同目的有各自的構設計邏輯。透過一個或者少數幾種資料節構來儲存資料, 因此不需要有固定的結構 (Schemaless)。這樣的好處是可以很容易的擴展資料庫。擴展方面 NoSQL 對於 水平擴展 (Horizontal Scaling) 有著很好的支援,而且對於資料的一致性 (Consistency) 也有著不同的定義。

鍵值型

鍵值儲存 (Key-Value store) 是一個擁有基本功能的 NoSQL,它使用鍵值的方式來儲存資料。

鍵值型資料庫的資料結構是以鍵值的方式儲存:Key 是唯一的數值而 Value 則是任意的資料型態、從簡單的字串到複雜的物件都可以。 key-value store 可以視為是一個字典,所有的資料都可以對應到一個唯一的鍵值,設計上針對讀寫的效能做了最佳化。通常是使用 雜湊表 (hash table) 來實作,因此查詢的效能很好。設計上利用緊緻跟有效率的資料結構來儲存資料,盡可能在 常數時間 (constant time) 找到資料。

總結來說:

  • 擴展性好、可靠性好、可用性好、成本低
  • 不支援關聯查詢、不支援事務處理

物件型

Object storage 是一種資料庫,它使用物件作為基本單位來儲存資料。

物件通常是二進位資料,例如圖片、影片、音樂檔案或應用程式。儲存的內容可以是任何東西且擁有一個唯一識別碼 (Unique Identifier)。 對於物件型資料庫來說,儲存的資料是 不可變的 (immutable) ,如果要修改就必須要重新儲存一份新的資料。每次上傳都會產生一個版本、 版本之間是獨立的,所以可以很容易的回復到之前的版本。一個簡單的物件型資料庫,提供一個簡單的上傳介面與下載介面: 上傳介面可以上傳任意檔案 (例如圖片、影片、音樂檔案或應用程式),之後回傳一個唯一識別碼並可以透過唯一識別碼來下載檔案。

總結來說:

  • 擴展性高、可靠性高、可用性高、成本低
  • 查詢效能不好、不支援事務處理

文件型

Document-oriented database 是一種資料庫,它使用文件作為基本單位來儲存資料,通常也被視為是半結構化資料庫。

半結構化 的意思是相對於 RDBMS 來說,文件型資料庫的資料結構不需要有固定的結構、不需要預先定義欄位的資料型態。 設計上可以將這種資料庫視為是擴充版鍵值資料庫:相對於只能儲存資料與對資料本身沒有任何的概念,文件型則是將資料跟資料一起儲存, 容易透過額外的屬性查詢資料跟做關聯查詢。習慣上使用 field、document、collection來描述文件型資料庫的資料結構。

  • field 是一個鍵值名稱跟任意資料型態的值
  • document 是多個 fields 的物件
  • collection 則是邏輯上的文件分類的集合

Document 在 Collection 中不需要擁有一樣的 schema,但是通常會有一個主鍵來識別文件,如果需要也可以透過約束限制文件的結構。

總結來說:

  • 彈性的資料結構、高效能、可水平擴展
  • 即時查詢效能不好、不支援事務處理

圖形型

Graph database 是一種利用圖形結構來儲存資料的資料庫,圖形型資料庫的資料結構是以節點 (Node) 跟邊 (Edge) 的方式儲存。

以功能來看可以分為三個角色:節點 (node)、邊界 (edge)、屬性 (property):

  • 節點可以是一個字串或者是複雜的物件,每個節點可以擁有無限制數量的邊界
  • 邊界可以視為是物件之間的關係,且可以視為是一個有方向的連結
  • 屬性則是用來描述節點跟邊界的額外資訊

總結來說:

  • 容易找到物件之間的關係,對於查詢關係效能表現很好
  • 圖形型資料庫的擴展性不好、可靠性不好、可用性不好、成本高。