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

更新於 2024/09/13閱讀時間約 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(正規式)讓我們的資料庫易於管理,但可能對系統造成額外負擔 因此,在實務中,設計資料庫時需要在資料冗餘和查詢效率之間找到平衡。


    全端網頁開發專業知識分享
    留言0
    查看全部
    avatar-img
    發表第一個留言支持創作者!
    ※ 安裝 MySQL server 官網下載(Windows 版本) MySQL Installer  的官方下載頁:https://dev.mysql.com/downloads/installer/ MySQL Installer 是一個方便的工具,可以幫助你一次性安裝多個 MySQL 產
    ※ 資料庫的運作方式 *SQL和SQL Database的區別: SQL是一種Query Language(查詢語言) ,是一種用來幫助我們跟資料庫溝通的一種語言,用於管理和操作關係型資料庫。它不是一種資料庫類型,而是一種用來與資料庫溝通的語言。 SQL Database是指使用SQL語言來管
    ※ SQL基本介紹 SQL(結構化查詢語言)是一種查詢語言(Query Language),用於對資料庫中的資料進行操作。透過SQL,我們可以執行以下操作: 查詢資料 更新資料 刪除資料 ※ SQL四個基本概念 Table(表格):資料庫中的資料是以表格的形式儲存的。每個表格包含多個欄
    ※ 資料庫基本概念與操作 目標: 瞭解資料庫的概念和為什麼需要資料庫 瞭解SQL的概念與進行增刪改查操作 能夠自行安裝及搭建MySQL資料庫 能夠使用MySQL Workbench連線到MySQL資料庫並進行基本操作 ※ 工程中的應用 目標: 能夠根據業務邏輯需求設計Schema
    ※ 整個SQL課程過程 *如何從資料庫拿資料開始: • SELECT :從資料庫拿資料。 • ORDER BY :排序SELECT的結果。 • JOIN :連結各個TABLE的 資訊,發揮關聯式資料庫的優勢。 • GROUP BY :對資料庫的資料做加總的AGGREGATE FUNCTIO
    ALTER TABLE: 這個命令是用來修改資料表的結構,例如新增、修改或刪除欄位。它針對的是資料表(table)本身的結構,而不是具體的記錄(record)。 INSERT 和 UPDATE: 這兩個命令是用來操作具體的記錄(record)。INSERT 用於新增記錄,而 UPDATE 用於修改
    ※ 安裝 MySQL server 官網下載(Windows 版本) MySQL Installer  的官方下載頁:https://dev.mysql.com/downloads/installer/ MySQL Installer 是一個方便的工具,可以幫助你一次性安裝多個 MySQL 產
    ※ 資料庫的運作方式 *SQL和SQL Database的區別: SQL是一種Query Language(查詢語言) ,是一種用來幫助我們跟資料庫溝通的一種語言,用於管理和操作關係型資料庫。它不是一種資料庫類型,而是一種用來與資料庫溝通的語言。 SQL Database是指使用SQL語言來管
    ※ SQL基本介紹 SQL(結構化查詢語言)是一種查詢語言(Query Language),用於對資料庫中的資料進行操作。透過SQL,我們可以執行以下操作: 查詢資料 更新資料 刪除資料 ※ SQL四個基本概念 Table(表格):資料庫中的資料是以表格的形式儲存的。每個表格包含多個欄
    ※ 資料庫基本概念與操作 目標: 瞭解資料庫的概念和為什麼需要資料庫 瞭解SQL的概念與進行增刪改查操作 能夠自行安裝及搭建MySQL資料庫 能夠使用MySQL Workbench連線到MySQL資料庫並進行基本操作 ※ 工程中的應用 目標: 能夠根據業務邏輯需求設計Schema
    ※ 整個SQL課程過程 *如何從資料庫拿資料開始: • SELECT :從資料庫拿資料。 • ORDER BY :排序SELECT的結果。 • JOIN :連結各個TABLE的 資訊,發揮關聯式資料庫的優勢。 • GROUP BY :對資料庫的資料做加總的AGGREGATE FUNCTIO
    ALTER TABLE: 這個命令是用來修改資料表的結構,例如新增、修改或刪除欄位。它針對的是資料表(table)本身的結構,而不是具體的記錄(record)。 INSERT 和 UPDATE: 這兩個命令是用來操作具體的記錄(record)。INSERT 用於新增記錄,而 UPDATE 用於修改
    你可能也想看
    Google News 追蹤
    Thumbnail
    *合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
    Thumbnail
    徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
    Thumbnail
    CSS 盒模型是理解和設計網頁佈局的核心概念。它包括元素的內容、填充、邊框和外邊距。
    Thumbnail
    一般在使用 TypeScript 的時候,大家都有遇過定義列舉資料的情境吧。 不過不管是 enum 和 literal 的方式其實都有些小缺點,以下推薦一個個人認為體驗更好的方式。
    Thumbnail
    此章節旨在介紹Java程式語言中的各種資料型別,包括基本型別、引用型別、集合型別、陣列型別、字典型別等。它還講解了如何在Java中進行型別轉換和自定義型別,並提供了相關的程式碼示例。
    Thumbnail
    為什麼會有Schema Registry的出現? 因為Kafka的零拷貝原則, 也就是kafka本身並不會去碰觸到訊息也不進行資料驗證, 而是bypass的傳送, 預設都以位元組來傳輸資料會比較有效率, 但位元組誰看得懂啊...。 加上Kafka的特性是生產者與消費者並不能直接溝通, 因
    ※ 生產者和消費者模式 定義: 生產者和消費者在同一時間內共同存取某一個資料空間。生產者負責生成數據並將其放入共享空間,消費者負責從共享空間中取走數據進行處理。兩者之間互不相干,也不須互相知道對方的存在。 共同存取資料空間:生產者和消費者共享同一個資料空間。這個空間通常是緩衝區或隊列,用於在它
    Thumbnail
    本章節旨在介紹 TypeScript 的基本資料型別,包括內建型別、型別轉換、自訂型別、元組、集合、陣列、和字典型別。透過理解和使用這些型別,可以提高代碼的可讀性和可維護性。
    Thumbnail
    支援Go所有的類型儲存,且可以用原生SQL敘述與跨資料庫查詢。 映射關係 table->struct record->object field->attribute 安裝 go get github.com/astaxie/beego/orm​ go get github.com
    Thumbnail
    題目敘述 題目會給我們一組定義好的界面和需求,要求我們設計一個資料結構,可以滿足平均O(1)的插入元素、刪除元素、隨機取得元素的操作。 RandomizedSet() 類別建構子 bool insert(int val) 插入元素的function界面 bool remove(int val
    Thumbnail
    ※ 基本操作:SQL 語法,SELECT, WHERE, CREATE, UPDATE, DELETE。 SELECT:從資料庫中或資料表中指定要選擇的欄位中取得資料,稱之為查詢 (query)。 ※ 語法:要由兩部分構成,第一部分是要 "拿什麼" 資料 (若有多項用逗號隔開);第二部分則為
    本課程學習如何添加 Room 資料庫相關依賴庫配置。
    Thumbnail
    *合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
    Thumbnail
    徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
    Thumbnail
    CSS 盒模型是理解和設計網頁佈局的核心概念。它包括元素的內容、填充、邊框和外邊距。
    Thumbnail
    一般在使用 TypeScript 的時候,大家都有遇過定義列舉資料的情境吧。 不過不管是 enum 和 literal 的方式其實都有些小缺點,以下推薦一個個人認為體驗更好的方式。
    Thumbnail
    此章節旨在介紹Java程式語言中的各種資料型別,包括基本型別、引用型別、集合型別、陣列型別、字典型別等。它還講解了如何在Java中進行型別轉換和自定義型別,並提供了相關的程式碼示例。
    Thumbnail
    為什麼會有Schema Registry的出現? 因為Kafka的零拷貝原則, 也就是kafka本身並不會去碰觸到訊息也不進行資料驗證, 而是bypass的傳送, 預設都以位元組來傳輸資料會比較有效率, 但位元組誰看得懂啊...。 加上Kafka的特性是生產者與消費者並不能直接溝通, 因
    ※ 生產者和消費者模式 定義: 生產者和消費者在同一時間內共同存取某一個資料空間。生產者負責生成數據並將其放入共享空間,消費者負責從共享空間中取走數據進行處理。兩者之間互不相干,也不須互相知道對方的存在。 共同存取資料空間:生產者和消費者共享同一個資料空間。這個空間通常是緩衝區或隊列,用於在它
    Thumbnail
    本章節旨在介紹 TypeScript 的基本資料型別,包括內建型別、型別轉換、自訂型別、元組、集合、陣列、和字典型別。透過理解和使用這些型別,可以提高代碼的可讀性和可維護性。
    Thumbnail
    支援Go所有的類型儲存,且可以用原生SQL敘述與跨資料庫查詢。 映射關係 table->struct record->object field->attribute 安裝 go get github.com/astaxie/beego/orm​ go get github.com
    Thumbnail
    題目敘述 題目會給我們一組定義好的界面和需求,要求我們設計一個資料結構,可以滿足平均O(1)的插入元素、刪除元素、隨機取得元素的操作。 RandomizedSet() 類別建構子 bool insert(int val) 插入元素的function界面 bool remove(int val
    Thumbnail
    ※ 基本操作:SQL 語法,SELECT, WHERE, CREATE, UPDATE, DELETE。 SELECT:從資料庫中或資料表中指定要選擇的欄位中取得資料,稱之為查詢 (query)。 ※ 語法:要由兩部分構成,第一部分是要 "拿什麼" 資料 (若有多項用逗號隔開);第二部分則為
    本課程學習如何添加 Room 資料庫相關依賴庫配置。