Day9 - What is a database?

前言

對於一個網站或者服務來講,資料庫是不可或缺的一個元素,那麼什麼是資料庫呢?接下來我們就來聊聊什麼是資料庫。

What is a database?

那麼什麼是資料庫呢(database)?

首先這邊我就先用比較生活化的方式去舉例,這樣子後面在介紹資料庫時,或許會比較容易理解與學習,比較不會有那種很抽象的感覺。

首先,打從我們從小嬰兒開始,我們會是如何獲取知識呢?通常我們取得知識的方式大多都是透過閱讀書籍、圖像以及口說等方式來去吸收知識,如果要打個比方的話,我會把書籍當舉例為資料庫。

資料庫的概念其實與書籍的概念非常雷同,或許這時候你會好奇…

「人腦呢?難道人腦不算資料庫嗎?」

我自己認為充其量比較偏向「暫存、快取」的概念,我相信閱讀這一篇文章的每一位讀者,都有過一種經歷,也就是當你閱讀完一本書籍後,約莫一小時、三天,甚至一個禮拜你都還可能記得書本的內容。

但是如果你沒有活用這些書本的知識以及技巧後,過了一個月、半年,你還可能會記得書本的內容嗎?我想大多數的人都會說「不會」,這就是為什麼我認為人腦充其量只是一個暫存、快取的概念。

那麼資料庫的概念比較偏向「永久性」的儲存,就像是書本一樣,只要你不把書本給丟掉,好好的保存這一本書(先不提天災之類),那麼這本書就會永遠存在,而且你可以隨時拿出來閱讀。

因此你在使用的許多服務都是有使用到這個概念的,舉例來講 Google 的登入服務,如果你要使用它的服務的話,那麼你就必須要註冊 Google 服務,而這個註冊的資料就會被儲存在 Google 的資料庫中,當你下次開啟網頁並登入時,Google 就會從這個資料庫中去比對你的帳號密碼是否正確。

Note
基本上你正在觀看這一篇文章的同時,這些文章的內容也是儲存在資料庫中的,因此你可以透過 Url 發現類似前面章節所教的動態 ID,這個 ID 就是資料庫中的 ID,而這個 ID 就是用來去比對資料庫中的資料,然後把資料給呈現在網頁上。

這時候應該會有點好奇「暫存」與「快取」這兩個名詞吧?所以這邊也讓我花點時間介紹一下什麼是暫存與快取。

暫存與快取

如果你本身是一名前端工程師的話,我相信你應該對於暫存與快取這兩個名詞不陌生,那麼不拖延太多時間,所以我這邊也一樣用比較簡單的方式去描述就好,讓我們盡快的去往資料庫章節去

  • 快取:概念與書籤類似,方便我們可以快速存取特定頁面或內容,以網頁來講,就可以加速網頁的載入速度。
  • 暫存:也是一種資料庫概念,但是暫存的資料是有時效性的,也就是說,當你關閉瀏覽器後,暫存的資料就會被清除,你可以想像成是一種「短期記憶」。

那麼這邊我就沒打算花太多時間介紹暫存與快取,只是因為剛好有提到這兩個名詞單字,就順便補充說明一下。

資料庫的種類

那麼市面上的資料庫非常的多,舉凡…

  • MySQL(後來被 Oracle 收購)
  • MariaDB(由原本 MySQL 的開發者所開發的)
  • MongoDB
  • PostgreSQL
  • Microsoft SQL Server(又稱 MSSQL)

…等等。

如果真要舉例的話,其實會舉例不完,因為市面上的資料庫種類非常的多,但是我們可以把資料庫分成兩大類,分別是關聯式資料庫(Relational Database)以及非關聯式資料庫(Non-Relational Database)。

ok,又出現新名詞了

新的知識點來臨

那麼為了避免知識爆炸,所以接下來我不會太深入的去說明,只會簡單帶到就好,如果你有興趣的話,可以自行去查詢資料。

關聯式資料庫(Relational Database)

關聯式資料庫基本上很顧名思義,也就是會有關聯(廢話)。

基本上在資料庫中,會有所謂的 database(資料庫)、table(資料表)、column(欄位)以及 row(資料列),這幾個名詞,這邊我們先不提 column(欄位)以及 row(資料列),我們只講 database(資料庫)與 table(資料表)。

以關聯式資料庫的概念來說,假設我們有一個 TodoList 的專案,因此我們就會開一個 database(資料庫)叫做 TodoList,然後我們會在這個 database(資料庫)中建立一個 table(資料表)叫做 todo,這個 table(資料表)就是用來儲存 todo 的資料。

那麼這個專案可能會需要給使用者註冊,這樣子我們才知道每一個寫入到資料庫內的 todo 是隸屬哪一個使用者,因此還會再開一個 users 的 table(資料表)。

接下來使用者可能還會牽扯到登入的權限,畢竟可能有普通使用者、超級管理者,所以還會再開一個 roles 的 table(資料表)。

這時候我們會得到三張表,分別是 todousers 以及 roles,而這三張表之間都會有所關聯,舉例來講我們的使用者會取用來自 roles 的權限,而 todo 也會取用來自 users 的資料,這個過程就稱之為關聯。

當然,這邊只是一個簡單的舉例而已,實際上來講其實還包含了一對多、多對多等等的概念,而這邊主要是簡單帶到而已。

除此之外關聯式資料庫主要是使用 SQL(Structured Query Language)來操作,而 SQL 也是一種語言,但在這一個系列中就不會提到 SQL 的相關操作了。

Note
關聯式資料庫又稱之為 RDBMS(Relational Database Management System)。

非關聯式資料庫(Non-Relational Database)

非關…

「等等!我知道!就是不會有關聯!」

ㄜ…要這樣說也可以,但是這樣說其實不太準確,因為非關聯式資料庫其實也會有關聯,只是關聯的方式不太一樣而已。

首先,Non-Relational Database 又稱為 NoSQL,滿多人都認為就是不會使用到 SQL 語法的意思,但其實並不是這樣的。

NoSQL 最早的另一個名稱是 Non-SQL(後來改解釋成 Not Only SQL),也就是說 NoSQL 並不是說完全不會使用到 SQL,而是不同於關聯式資料庫的一個統稱,什麼意思呢?

也就是說,你的專案中也是可以使用 SQL 的。

那麼這邊就會有人問了

「既然可以使用 SQL,那麼為什麼不直接使用關聯式資料庫呢?」

這是一個非常不錯的問題,所以這邊就讓我簡單描述一下 NoSQL 的特性吧。

以 NoSQL 的特性來講,它的資料結構是相對比較靈活簡單的,如果是使用關聯式資料庫的話,你可能會需要先定義好資料表的欄位,然後才能夠寫入資料,但是 NoSQL 的話,你可以直接寫入資料,而不需要先定義好欄位,因此靈活性會較高。

除此之外,NoSQL 另一個特性也就是半結構化架構,當你的資料較複雜且變化性高的話,NoSQL 會更好使用,在某些設計下,NoSQL 的查詢效能也會比較好。

因此關聯式資料庫與非關聯式資料庫其實都有各自的優缺點及使用場合,當然你也可以一個專案內混搭使用,這也是可以的。

如果你是一名前端工程師的話,其實 NoSQL 對你來講會比較易學,因為整體來講比較簡單,而且也不需要太多的 SQL 語法,因此如果你想要學習資料庫的話,可以先從 NoSQL 開始,除此之外,通常 NoSQL 的資料格式類似於 JSON 格式,所以你會格外的熟悉。

當然 NoSQL 呈現的方式有很多種,比較常見的是 Document-Oriented Database(文件導向資料庫),Firebase 的 Realtime Database 就是一個很好的例子。

Note
JSON 全名是 JavaScript Object Notation,是一種資料格式,而且也是一種資料交換格式,相較於 XML,JSON 的格式較為簡單,也較為容易閱讀;但要注意,儘管 JSON 的名稱是 JavaScript Object Notation,但 JSON 並不是 JavaScript 的一部分,也就是說你可以在其他語言中使用 JSON。

其他例如像是…Key-Value Database(鍵值資料庫)、Column-Oriented Database(列導向資料庫)、Graph Database(圖形資料庫)等等,但如果這個一個一個拉出來介紹的話,應該是有機會直接混水寫個三十篇吧?(笑)

所以接下來後面我只會針對 Document-Oriented Database 來做介紹,畢竟這個是比較常見的,而且也比較好學一點。

那麼這一篇我們就先到這邊告一個段落好了,下一篇我們就準備來簡單(?)學習一下 NoSQL 吧

碎碎念

突然想到前陣子莫名收到 MOMO 的商品,結果也沒有署名是誰,只署名寄給我打開後結果是豬腳,真是讓我又驚又喜,畢竟這陣子發生了一點不愉快的事情 Q_Q…