JS:資料庫設計與應用(五)

JS:資料庫設計與應用(五)

更新於 發佈於 閱讀時間約 1 分鐘

※ Schema 設計

● 什麼是Schema?

Schema 是用來描述資料庫內的表格結構、欄位格式以及表格之間的關聯。它定義了資料庫的邏輯結構,確保資料的組織和存取方式一致。

思考點:資料以什麼「形式」保存在資料庫?

資料在資料庫中以多種形式保存,主要包括以下幾種:

  1. 表格 (Tables):資料以行和列的形式存放,每一行代表一條記錄,每一列代表一個欄位。
  2. 檔案 (Files):資料可以以檔案的形式儲存,常見於檔案式資料儲存系統。
  3. 區塊 (Blocks):資料被切成固定大小的區塊,常見於企業級儲存系統。
  4. 物件 (Objects):資料以物件的形式儲存,每個物件都有唯一的識別碼,適合雲端儲存和網頁應用程式。

實務上用一個簡單的小方格表來代表一個table。說明table名稱是User,包含以下欄位:

  1. id:整數型別 (int),並且是主鍵 (PRIMARY KEY)。
  2. name:可變長度字串 (varchar),最大長度為 255 字元。
  3. email:可變長度字串 (varchar),最大長度為 255 字元。

這樣的圖示在 Schema 設計時非常有用,可以清楚地表示 table 的結構和欄位類型。這種視覺化的表示方式有助於理解和溝通資料庫設計。

raw-image


● 為什麼不能把所有資料塞進一個欄位(column)裡面?

  1. 資料查詢不方便,效率變慢:如果所有資料都存在一個欄位裡,查詢特定資料會變得非常困難。例如,假設我們將 idname 和 email 都存在一個 data 欄位中,查詢特定 email 的使用者時,我們需要解析每一行的 data 欄位,這樣會大大降低查詢效率。
SELECT  *FROM user WHERE
  1. 資料修改不方便:更新資料也會變得非常麻煩。假設我們需要更新某個使用者的 email,我們需要先解析出 data 欄位中的所有資料,然後再進行更新,這樣不僅繁瑣,而且容易出錯。
UPDATE user SET data = ? WHERE ?
  1. 資料完整性和一致性:將不同類型的資料混合在一個欄位中,會使得資料的完整性和一致性難以維護。這樣的設計違反了資料庫的正規化原則,容易導致資料冗餘和異常。
raw-image


● 總結:

Schema 設計的好壞,影響系統效能和開發方便。

左圖的設計比較簡單,但在開發和效能上會造成不便。右圖則利用更多的欄位來儲存資料,這樣在查詢和開發上會更方便。因此在後端開發前,應花時間設計一個完整的 Schema 是非常重要的。這樣可以確保資料庫結構合理,查詢效率高,並且在未來的開發和維護中減少問題。良好的 Schema 設計可以提高系統的可擴展性和可維護性,讓開發過程更加順利。

raw-image


※ Normal Forms(正規式)

● 在Schema設計上應該遵守的規則:

在設計 Schema 時,遵守 Normal Forms(正規式)的規則是非常重要的。這些規則是前輩們總結出來的最佳實踐,能夠幫助我們設計出高效且易於維護的資料庫結構。

第一正規式 (1NF)

  1. 每個欄位只保存一個值:這意味著每個欄位應該是單一的,不能包含多個值或重複的資料。這樣可以確保資料的完整性和一致性。
  2. 每個欄位的值必須是不可分割的:例如,不能在一個欄位中存儲多個電話號碼或地址。這樣可以讓資料庫更容易查詢和維護。
  3. 任兩條 Row 的內容不可以完全相同:用主鍵(Primary Key)來確保每一行資料是唯一的,這樣可以避免重複資料。主鍵是一個或多個欄位的組合,用來唯一標識每一行資料。

第二正規式 (2NF)

  1. 符合第一正規式 (1NF)。
  2. 消除部分依賴:所有在資料表中,不是主鍵(Primary Key)的一部分的欄位必須完全依賴於主鍵。如果主鍵是由多個欄位組成的複合鍵,那麼每個非鍵屬性必須依賴於整個複合鍵,而不是只依賴其中的一部分。
raw-image


第三正規式 (3NF)

  1. 符合第二正規式 (2NF)。
  2. 消除傳遞依賴欄位(Column)之間不能存在傳遞關係。這意味著非鍵屬性不能依賴於其他非鍵屬性。換句話說,所有非鍵屬性必須直接依賴於主鍵,而不是通過其他非鍵屬性間接依賴於主鍵。
raw-image


Boyce–Codd Normal Form(BCNF)

  1. 符合第三正規式 (3NF)。
  2. 消除所有候選鍵的傳遞依賴在 BCNF 中,任何候選鍵(可以作為主鍵的欄位或欄位組合)之間不能存在傳遞依賴。這意味著每個非鍵屬性必須完全依賴於候選鍵,而不是通過其他非鍵屬性間接依賴於候選鍵。
raw-image


第四正規式 (4NF)

  1. 符合BCNF。
  2. 消除多值依賴在 4NF 中,資料表中的欄位之間不能存在多值依賴。這意味著在同一行(ROW)中,不能有一對多的關係。

左邊的圖示在同一行(ROW)中有一對多的關係,而右邊的圖示則沒有這種關係。因此,右邊的圖示符合 4NF 的要求。

raw-image


※ 觀念澄清

● Normal Forms(正規式)只是幫助我們設計Schema的規則:實務上不需要知道每個Normal Forms(正規式)對應的限制有哪些,只要理解其基本原則並應用於設計中即可

● 解除資料冗於得同時,可能也降低了查詢效率:嚴格遵守Normal Forms(正規式)讓我們的資料庫易於管理,但可能對系統造成額外負擔 因此,在實務中,設計資料庫時需要在資料冗餘和查詢效率之間找到平衡。


avatar-img
奧莉薇走在成為後端工程師之路上
17會員
137內容數
全端網頁開發專業知識分享
留言
avatar-img
留言分享你的想法!
※ 場景: 即時聊天應用: 設計一個支持多房間功能的即時聊天平台,像 WhatsApp、LINE或Facebook Messenger,提供文字、語音、視訊聊天功能,方便管理群組聊天。 功能亮點:加入特別功能,例如可加入多房間功能、使用者名單、表情符號支持、文件分享或訊息已讀未讀狀態。 展示
※ 先建立基本的express後端服務: 1.建立新資料夾:Socket mkdir socket 2.進入資料夾:Socket cd ​bsocket 3. 安裝 Experss 到專案中 npm init -y //初始化專案,建立 package.json 檔 npm insta
※ 什麼是 Socket.io:一個基於傳統 WebSocket API 之上的框架。 ※ Socket.io常用功能: Custom Events:在 Socket.io 中,開發者可以創建自己的事件來處理特定的功能或需求。 Rooms:分組的功能。每個連接的用戶(或稱為 socket)可
※ 場景: 即時聊天應用: 設計一個支持多房間功能的即時聊天平台,像 WhatsApp、LINE或Facebook Messenger,提供文字、語音、視訊聊天功能,方便管理群組聊天。 功能亮點:加入特別功能,例如可加入多房間功能、使用者名單、表情符號支持、文件分享或訊息已讀未讀狀態。 展示
※ 先建立基本的express後端服務: 1.建立新資料夾:Socket mkdir socket 2.進入資料夾:Socket cd ​bsocket 3. 安裝 Experss 到專案中 npm init -y //初始化專案,建立 package.json 檔 npm insta
※ 什麼是 Socket.io:一個基於傳統 WebSocket API 之上的框架。 ※ Socket.io常用功能: Custom Events:在 Socket.io 中,開發者可以創建自己的事件來處理特定的功能或需求。 Rooms:分組的功能。每個連接的用戶(或稱為 socket)可