「筆記」- 何謂資料庫系統

Pierce Shih
皮爾斯的自學旅程
8 min readJun 2, 2019

程式海無涯,聽說永遠學不完,那我只好一點一點把它們寫下來囉!

資料庫概念

下列我們以日常使用個人通訊錄的案例來介紹資料庫概念。

圖示:資料表 Table Name
  1. 資料 Data:個人筆記本
  2. 資料表 Data Table:
  • 資料表名稱 Table Name:如個人通訊錄
  • 欄 column:代表一種資料屬性或是資料欄位,同時,資料皆具備相同資料型別,如「電話」欄位。
  • 列 row:代表某一筆資料紀錄(Record),完整呈現一筆資料的內容,如「張大寶 0932–345–678 admin3@gmail.com」
  • 格子 cell:代表某一筆資料的某一個屬性的值 Value,如「0912–345–678」

資料型別與代表意義

資料型別共有六種,分別為字串 (string)、文字段落 (text)、整數 (integer)、浮點數 (float)、日期時間 (datetime)和布林值 (boolean)。

而相同內容可能代表不同的意涵,如同「23」這個數字,他可以代表是一個數字、價格、溫度、甚至是時間。

圖片引用來源:Unsplash

前面介紹了資料庫和資料型別後,接下來,讓我們來說明何謂資料庫系統。

為什麼需要資料庫系統

回想小時候,當時不像現在人手一支手機,隨時想打給誰就打給誰,甚至只要告訴 Siri 「打給 XXX 」,他就會自動幫你撥出電話了。

因此,當時我總是善用自己的腦袋,把每個人的手機背起來,需要揪團打球時,就會立馬從腦海中調出朋友的電話號碼來聯繫,縱使記憶力超強,但長期來看卻不是個最好的做法,也很難把電話資料共享給其他人使用,就算把資料記錄在紙本上,也不容易保存和快速查找。

而在程式世界裡,常見資料的應用,如變數 (variables)、陣列 (array)、與物件 (object),它們都有各自不同的方法。若是跟一個單純的 Text 文字檔比較,有邏輯的資料結構可以讓我們更有效率來管理與處理資料,但當我們關上應用程式之後,它們所處理的資料就會從電腦的記憶體中消失。

此時,我們會需要一個工具,不僅能長期存放我們需要應用的資料,也方便隨時查詢與管理資料,而這個工具就是資料庫系統。

圖片引用來源:Unsplash

資料庫系統

談到資料庫,我們可以拆解成「資料庫」和「資料庫系統」。

最直覺的解釋,資料庫 (database) 就是儲存資料的地方,也可以理解為多個資料表的集合,如下圖:

圖示:資料庫 (database)

此外,若要有效率地使用與管理資料,我們還需要一套資料庫管理系統 (database management system,簡稱 DBMS),作為使用者(或是應用程式)與資料庫之間溝通的平台,如下圖:

圖示:資料庫管理系統運作

圖書館案例

資料庫與資料庫系統的關係,如同圖書館與圖書館管理系統的關係一樣,我們進到圖書館之後,可以看到滿山滿谷的書籍。

不過,若遇到我們只想要找特定一本書時,那可是如同海底撈針般的困難,因此,圖書館管理系統這時候就會派上用法了,我們可以善用它幫助我們更快速找到我們需要的書籍。

OK,到目前為止我們知道為什麼需要資料庫系統,接下來,我們會著重在「關聯式資料庫」與「非關聯式資料庫」的介紹。

#1 關聯式資料庫

關聯式資料庫是目前最多軟體開發者使用的資料庫系統,主要是關聯式資料庫使用簡單,穩定度高,也有很多企業開放支援 SQL 的軟體可供使用,常見如 MySQL、PostgreSQL、Microsoft SQL Server、SQLite。

關聯式資料庫的三個特質:

1) 資料是以一個或是多個資料表 (table) 的方式存放

在關聯式資料庫裡,每一筆資料都是在 table 中的一個 record,然後再把不同的 table 集合起來,就成為一個關聯式資料庫。

如同一個電商網站中,通常會有賣家、商品、分類、使用者和交易紀錄等資料表 Table,負責紀錄不同的資料,彼此之間也會也有不同的關聯。

圖示:電商網站(資料以 table 存放)

2)資料之間有明確的關聯

關聯式資料庫一般都用來儲存結構化的資料,而資料之間大多會有清楚的關聯。

若以 To-do List 專案舉例,我們則會以 table 資料表來存放 todo 跟 user 這兩種資料,並在兩個資料表之間,設定「使用者擁有 todo」這個關聯。

圖示:資料表的關聯性

3)關聯式資料庫是以 SQL 語言操作

SQL (Structured Query Language 結構化查詢語言) 是一種專門用來管理與查詢關聯式資料庫的程式語言。

透過 SQL,我們能在關聯式資料庫裡新增、查詢、更新和刪除資料,同時也能建立和修改資料庫模式,語法簡單直接,一切都是以資料為主角去思考。

圖片引用來源:Unsplash

#2 非關聯式資料庫

前面說到,關聯式資料庫是最多開發者使用的資料庫系統,那麼還有什麼其他的資料庫系統呢?讓我們來聊聊 NoSQL 資料庫,常見為 mongoDB。

緣起

隨著手機和互聯網的普及,網路流量大幅地增長,加上互聯網也進入「使用者生產內容 (user generated content)」為主流的時代。

對於 Youtube、Facebook 這些社交網站來說,每分每秒需要處理的資料量是過去一般網站的非常多倍,而從使用者的角度來看,他們在這些平台上對於資料的需求也跟過去不太一樣。

過去使用者在網上購物或投資交易時,會要求資料是無錯誤、穩定、以及即時同步,但到了社群媒體興盛的時代,使用者渴望與資料進行更多互動,例如留言、標籤 (tags) ,加上資料內容也沒有明確的結構,例如使用者的 po 文與留言。

所以資料庫的主要功能,從過去「能夠無錯誤地同步處理結構清楚的資料」需求,逐步演變為「能夠處理快速且大量產生的資料,但不需要即時同步,也有空間容忍錯誤」的需求。

圖片引用來源:Unsplash

因此,為了呼應這個需求,NoSQL 資料庫就隨之興起了。

NoSQL 的兩大特性:

1) 彈性高,不限定於「關聯式資料庫」的做法

NoSQL 資料庫通常不使用關聯模型,也不需要固定的結構 (也就是 schema-free),但有需要時, NoSQL 也可以使用關聯模型與 schema。

NoSQL 將聚集後的資料,作為儲存的最小單位,透過縝密豐富的資料結構,有利於將資料分散到多個節點。

比起資料關聯,NoSQL 更關注資料所代表的人(例如使用者)與物(例如一篇分享在社交平台上的文章)的「狀態」變動,例如文章被分享、按讚等。

2) 不講求資料同步,只求最後結果一致

讓我們先看一個適合使用 SQL 的情境

如果我們今天要匯出一筆款項給商家,那麼當款項從我們的帳戶匯出後,系統一定要同步「帳戶已經扣除這筆款項」這個訊息,不然款項可能會被重複扣除,或者其他系統會誤以為我們帳戶的結餘跟匯款前一樣。

至於適合 NoSQL,所謂不講求資料同步,只求結果一致的情境是什麼呢

假設我們要來處理一篇在 Facebook 上的 po 文有多少人按讚時,這個訊息的準確性就不是非常重要。

當一篇文章獲得第 100 個按讚時,某些使用者可能會馬上看到新的數字,但部分使用者可能要隔數十秒後才看到按讚數從 99 轉到 100。這種延誤,並不會造成什麼嚴重的問題。

因此,而對 Facebook 來說,更重要的是如何能在一定的成本之下處理大量的數據。

圖片引用來源:Unsplash

結語

透過認識資料庫系統,我們了解資料庫有分成「關聯式資料庫」和「非關聯式資料庫」,而兩者都有各自的特性,至於要使用哪一種,則取決你的需求是什麼。

OS: 筆者某天和工程師朋友碰面時,也稍微聊了過往產品所使用的資料庫系統,縱使還沒有太多的經驗,但終於能聊上一點內容,也是蠻開心的!

謝謝你的閱讀!如果有任何想法,也歡迎留言與我分享~如果願意給我一些小小鼓勵,請給我 1–20 個拍手;
如果覺得文章對你有點幫助,請給我 21-30 個拍手;
如果非常喜歡我的技術筆記,請長按拍手按鈕(50個拍好拍滿)讓我知道哦 👏🏻最後,若希望持續追蹤我的最新文章,別忘了追蹤 皮爾斯的自學旅程 唷,乾溫 :D

--

--

Pierce Shih
皮爾斯的自學旅程

Leading business growth with product mindset and technical perspective