資料庫三大範式的學習與資料庫表設計的瞭解

来源:https://www.cnblogs.com/Yao-happy/p/18098686
-Advertisement-
Play Games

資料庫三大範式的學習與資料庫表設計的瞭解 內容簡單介紹 對於資料庫三大範式的理解以及一些設計表示要註意的方面 本章內容梳理圖 資料庫三大範式比較官方的定義 資料庫的三大範式(Normal Forms)是關係資料庫設計中用於確保數據結構化、減少數據冗餘、並提高數據完整性的指導和規則。 以下是三大範式的 ...


資料庫三大範式的學習與資料庫表設計的瞭解

內容簡單介紹

對於資料庫三大範式的理解以及一些設計表示要註意的方面

本章內容梳理圖

資料庫三大範式比較官方的定義

資料庫的三大範式(Normal Forms)是關係資料庫設計中用於確保數據結構化、減少數據冗餘、並提高數據完整性的指導和規則。

以下是三大範式的簡述:

  1. 第一範式(1NF)
    • 定義:如果關係模式R的每個屬性都是不可分的數據項,則R∈1NF。簡單來說,就是表中的每個欄位都是最基本的單元,不可再分。
    • 目的:消除欄位中的重覆組和確保每個欄位的原子性。
    • 註意:在現代的關係型資料庫管理系統中,通常都預設滿足第一範式。
  2. 第二範式(2NF)
    • 前提:滿足第一範式。
    • 定義:如果關係模式R∈1NF,且每一個非主屬性都完全函數依賴於任何一個候選鍵,則R∈2NF。
    • 目的:消除部分函數依賴,即非主屬性不應僅依賴於主鍵的一部分(在複合主鍵的情況下)。
    • 做法:通常通過拆分表來實現,確保非主屬性完全依賴於整個主鍵。
  3. 第三範式(3NF)
    • 前提:滿足第二範式。
    • 定義:如果關係模式R中不存在非主屬性對主屬性的傳遞依賴,則稱R在第三範式。
    • 目的:消除傳遞依賴,確保非主屬性不依賴於其他非主屬性。
    • 註意:有時為了查詢效率,可能會故意違反第三範式,但這需要權衡冗餘和查詢效率之間的關係。

資料庫三大範式個人簡要理解版

第一範式:每個屬性都是不可分割的原子性的,例如地址這個欄位,它還可以分為省、市、區或縣

第二範式:在滿足一範式的情況下,所有非主鍵屬性必完全依賴於主鍵,這裡完全是指非主鍵屬性依賴於主鍵的所有部分(會有複合主鍵),而非主鍵屬性之間存在依賴則不是第二範式關心的重點,這是第三範式的重點內容,第二範式的重點是非主鍵屬性與主鍵有無直接完全依賴關係。要是非主鍵屬性依賴於主鍵的一部分或者非主鍵屬性與主鍵無直接完全依賴,那麼需要拆分成多個表進行滿足第二範式

第三範式:在滿足二範式的情況下,非主鍵不能有傳遞依賴,傳遞依賴是指a依賴於b,而b又依賴於主鍵,這就是a間接依賴於主鍵,比如某一屬性依賴於另一屬性,然後另一屬性依賴於主鍵,這就是傳遞依賴,出現這種情況的話,需要根據實際進行拆分成多個表來完成滿足第三範式

資料庫三大範式個人詳細理解版

資料庫第一範式的理解

這裡要理解這個不可分割的原子項,這個主要指一個欄位所表達的內容是單一的,不可在分割,例如省份,就是指山西省、河北省等,這種從內容上不能夠分割的,要是地址的話就可以分為國家、省份、市、區縣、鄉村,這樣就達到不可分割的原子項了,再來說一下另一種情況,先來舉個例子吧

學生ID、學生姓名、課程1、課程2、課程3,這是一個表,看是否滿足第一範式,答案是滿足的,每一列都是不可分割的原子項,但是我們設計表得遵循資料庫表設計規範,而三大範式只是一部分,按照表設計規範的話,上方的表示不滿足的,有以下幾個點考慮:

  1. 可擴展性問題:每個學生只能記錄三門課程,如果需要記錄更多或更少的課程,表結構就需要調整。
  2. 數據冗餘:如果多個學生選修了同一門課程,那麼該課程的名稱將在表中多次出現,違反了避免數據冗餘的原則。
  3. 更新和維護困難:如果課程名稱需要更改,那麼所有相關的課程欄位(課程1、課程2、課程3)都需要更新,這增加了維護的複雜性。
  4. 查詢困難:查詢特定學生選修的所有課程或查詢選修了特定課程的所有學生都變得更加困難,因為課程信息分散在不同的欄位中。

所以在考慮上方四個問題的話,我們將上方的表設計為

  • 學生表:包含學生ID和學生姓名。
  • 課程表:包含課程ID和課程名稱。
  • 學生課程關聯表:包含學生ID、課程ID和可能的其他相關信息(如成績)

此做法消除了數據冗餘,提高了可擴展性,並簡化了更新和查詢操作,而且還要註意的是那個個學生課程關聯表這種做法非常常見,儘量去學習一下

這就是資料庫第一範式學習與理解

資料庫第二範式的理解

這裡要理解所謂的依賴,像我自己想的就是:我們在資料庫中使用sql語句查詢不就是非主鍵依賴於主鍵嗎,這其實是不正確的,雖然有一定的關係,但我們要分清主次,就是第二範式這個依賴,主要是基於業務邏輯的關係,比如學生學號與學生姓名等其他學生信息這種含有關聯的業務邏輯,我們要看非主鍵與主鍵是否符合這種業務邏輯關係,而且還得必須是完全符合,接著拿一個例子來說明一下這個判斷過程

一個訂單表:訂單ID、產品ID、產品名稱、產品價格、訂單數量、客戶ID和客戶姓名,看一下這個表是否滿足第二範式

我們假設這個訂單表主鍵為訂單ID,訂單在業務上與產品有關聯的,這個訂單是買的啥產品了,並不是那種直接的業務邏輯關係,產品名稱只是依賴於產品ID,所以不是依賴於訂單ID,雖然按這樣設計表,通過查詢訂單ID可以得出產品名稱來,這是在查詢中的一種關係吧,而這裡的時候要滿足業務邏輯這個依賴的,所以不滿足第二範式的,那麼改進為

將訂單表拆分為三個表:訂單表、產品表和客戶表。訂單表包含訂單ID、產品ID、訂單數量和客戶ID欄位;產品表包含產品ID、產品名稱和產品價格欄位;客戶表包含客戶ID和客戶姓名欄位

對了除了滿足這種依賴的話,第二範式是非主鍵完全依賴主鍵,註意這裡的完全,是指非主鍵要依賴於主鍵的所有,有可能主鍵的話就是複合主鍵,要是我們把上方例題的表的主鍵假設為(訂單ID、產品ID),產品名稱僅依賴於產品ID,只是一部分,所以不滿足第二範式,改進結果與上方一致

還有比較重要的點就是:第二範式是基於第一範式的基礎上來進行判斷與改進的,另一個關註點就是第二範式主要看非主鍵與主鍵的關係,不用關註非主鍵之間的關係

這就是第二範式的學習與理解

資料庫第三範式的理解

這裡主要理解的就是一個非主鍵有依賴於另一個非主鍵,然後另一個非主鍵直接依賴於主鍵這種情況,這樣就構成了一個非主鍵對主鍵的傳遞依賴,要滿足第三範式就得消除這種依賴,請看下方的例子實操

一個員工表:員工ID、員工姓名、部門ID、部門名稱和部門經理,看一下是否滿足第三範式

一般員工表的主鍵為員工ID,所以我們假設主鍵為員工ID,我們看一下有沒有傳遞依賴的情況,部門名稱和部門經理就可以依賴於部門ID,然後再依賴於員工ID,就形成了傳遞依賴,那我們需要拆分表

將員工表拆分為兩個表:員工表和部門表。員工表包含員工ID、員工姓名和部門ID欄位;部門表包含部門ID、部門名稱和部門經理欄位。確保每個表中的非主鍵列都只直接依賴於主鍵列

這其實分析挺矛盾的,第三範式是基於第二範式的情況下判斷,員工表第二範式並未滿足,你用第二範式來做這個題其實直接就可以得出最終結果了,而且也滿足第三範式的,但是題又讓你分析,確實是存在依賴關係的,所以你要根據第三範式的主要點是否有傳遞依賴來分析,這也第三範式的重點

這就是第三範式的學習與理解

總結

三大範式是設計表的基礎,要是滿足這三大範式的話,表的查詢性能等其他方面也會下降,所以本章只是介紹三大範式的用法,實際設計表還得考慮很多因素,這裡列出一些:

  1. 業務需求理解:
    • 在設計資料庫表之前,必須充分理解業務需求。這包括瞭解需要存儲哪些數據、數據之間的關係、數據的訪問模式等。
  2. 數據完整性:
    • 確保數據的準確性和一致性。這包括使用主鍵、外鍵、唯一約束、檢查約束等來維護數據的完整性。
  3. 性能優化:
    • 考慮查詢性能、數據插入、更新和刪除的性能。可能需要創建索引、視圖、存儲過程等來提高性能。
  4. 安全性:
    • 確保只有授權的用戶可以訪問和修改數據。這包括使用適當的身份驗證和授權機制。
  5. 可擴展性:
    • 設計資料庫表時,應考慮未來的增長和變化。這可能包括使用分區表、歸檔舊數據等策略。
  6. 規範化與反規範化:
    • 根據需要平衡規範化和反規範化的程度。規範化有助於減少數據冗餘和提高數據一致性,但可能導致查詢性能下降。反規範化則可以提高查詢性能,但可能增加數據冗餘和維護複雜性。
  7. 數據類型選擇:
    • 為每個欄位選擇合適的數據類型,以確保數據的準確性和存儲效率。
  8. 命名規範:
    • 使用清晰、有意義的命名規範來命名錶、欄位、索引等資料庫對象,以提高可讀性和可維護性。
  9. 文檔化:
    • 為資料庫表設計提供充分的文檔,包括表結構、欄位說明、關係說明、索引說明等,以便於其他開發人員理解和維護。
  10. 備份與恢復策略:
    • 設計資料庫時應考慮備份和恢復策略,以確保在發生故障時可以恢複數據。
  11. 併發控制:
    • 在多用戶環境中,需要考慮併發控制機制,如樂觀鎖、悲觀鎖等,以防止數據衝突和不一致。
  12. 遵循最佳實踐和標準:
    • 遵循資料庫設計的最佳實踐和行業標準,如使用三大範式、避免使用保留字等。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • // Stream MS HelpManual: https://learn.microsoft.com/zh-cn/dotnet/api/system.io.stream?view=net-8.0 // FileStream 官方手冊: https://learn.microsoft.com/zh ...
  • Grain 是 Orleans 框架中的基本單元,代表了應用程式中的一個實體或者一個計算單元。 每個Silo都是一個獨立的進程,Silo負責載入、管理和執行Grain實例,並處理來自客戶端的請求以及與其他Silo之間的通信。 通信原理 在相同的Silo中,Grain與Grain之間的通信通過直接的方 ...
  • SystemEvents 是一個開發 win32 視窗項目很常用的類,其中封裝了一些常用的系統廣播消息。在 WinUI3 項目中,SystemEvents 事件經常無法觸發,簡單排查了一下原因。 SystemEvent 內封裝了一個線程和一個視窗,通過視窗消息在內部線程上調用事件,內部使用了 Sys ...
  • 大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是i.MXRT1xxx系列GPIO提早供電會影響上電時序導致內部DCDC啟動失敗。 最近有一個 RW612 產品線的同事在設計一個雙 MCU 系統 Demo 時發現,當 RW612 板卡和 RT1060 板卡通過 UART 對接時,如果 ...
  • 目錄微型電腦的硬體共性結構及基本性能指標關於存儲器的介紹微型電腦的基本性能指標1. 字長2. 主頻3. 存儲容量4. 外設擴展能力5. 軟體配置情況Arm Cortex 系列微處理器系列概述Arm Cortex-A 系列處理器Arm Cortex-R 系列處理器Arm Cortex-M 系列處理 ...
  • 目錄遠程策略配置啟用遠程桌面使用設置啟用遠程桌面使用控制面板啟用遠程桌面 工作中有時需要使用遠程桌面,但工控機上面的策略一般都比較保守,遠程桌面經常會失敗。這裡記錄一下使用的遠程策略配置,方便以後工作中使用。 遠程策略配置 運行命令 gpedit.msc 打開本地策略編輯: 打開 電腦配置->管理 ...
  • 參考 Fedora Quick Docs Fedora Server Documentation Deploy an ARM64 Fedora VM on your PC: 3 steps Architectures/AArch64/Install with QEMU Virtualization ...
  • 華為雲GeminiDB是一款相容Redis協議的彈性KV資料庫,支持遠超記憶體的容量和極致的性能,技術自主創新,不受Redis協議變更影響。 ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...