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

来源: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
  • 隨著Aspire發佈preview5的發佈,Microsoft.Extensions.ServiceDiscovery隨之更新, 服務註冊發現這個屬於老掉牙的話題解決什麼問題就不贅述了,這裡主要講講Microsoft.Extensions.ServiceDiscovery(preview5)以及如何 ...
  • 概述:通過使用`SemaphoreSlim`,可以簡單而有效地限制非同步HTTP請求的併發量,確保在任何給定時間內不超過20個網頁同時下載。`ParallelOptions`不適用於非同步操作,但可考慮使用`Parallel.ForEach`,儘管在非同步場景中謹慎使用。 對於併發非同步 I/O 操作的數量 ...
  • 1.Linux上安裝Docken 伺服器系統版本以及內核版本:cat /etc/redhat-release 查看伺服器內核版本:uname -r 安裝依賴包:yum install -y yum-utils device-mapper-persistent-data lvm2 設置阿裡雲鏡像源:y ...
  • 概述:WPF界面綁定和渲染大量數據可能導致性能問題。通過啟用UI虛擬化、非同步載入和數據分頁,可以有效提高界面響應性能。以下是簡單示例演示這些優化方法。 在WPF中,當你嘗試綁定和渲染大量的數據項時,性能問題可能出現。以下是一些可能導致性能慢的原因以及優化方法: UI 虛擬化: WPF提供了虛擬化技術 ...
  • 引言 上一章節介紹了 TDD 的三大法則,今天我們講一下在單元測試中模擬對象的使用。 Fake Fake - Fake 是一個通用術語,可用於描述 stub或 mock 對象。 它是 stub 還是 mock 取決於使用它的上下文。 也就是說,Fake 可以是 stub 或 mock Mock - ...
  • 為.net6在CentOS7上面做準備,先在vmware虛擬機安裝CentOS 7.9 新建CentOS764位的系統 因為CentOS8不更新了,所以安裝7;簡單就一筆帶過了 選擇下載好的操作系統的iso文件,下載地址https://mirrors.aliyun.com/centos/7.9.20 ...
  • 經過前面幾篇的學習,我們瞭解到指令的大概分類,如:參數載入指令,該載入指令以 Ld 開頭,將參數載入到棧中,以便於後續執行操作命令。參數存儲指令,其指令以 St 開頭,將棧中的數據,存儲到指定的變數中,以方便後續使用。創建實例指令,其指令以 New 開頭,用於在運行時動態生成並初始化對象。方法調用指... ...
  • LiteDB 是一個輕量級的嵌入式 NoSQL 資料庫,其設計理念與 MongoDB 類似,但它是完全使用 C# 開發的,因此與 C# 應用程式的集成非常順暢。與 SQLite 相比,LiteDB 提供了 NoSQL(即鍵值對)的數據存儲方式,並且是一個開源且免費的項目。它適用於桌面、移動以及 We ...
  • 1 開源解析和拆分文檔 第三方的工具去對文件解析拆分,去將我們的文件內容給提取出來,並將我們的文檔內容去拆分成一個小的chunk。常見的PDF word mark down, JSON、HTML。都可以有很好的一些模塊去把這些文件去進行一個東西去提取。 優勢 支持豐富的文檔類型 每種文檔多樣化選擇 ...
  • OOM是什麼?英文全稱為 OutOfMemoryError(記憶體溢出錯誤)。當程式發生OOM時,如何去定位導致異常的代碼還是挺麻煩的。 要檢查OOM發生的原因,首先需要瞭解各種OOM情況下會報的異常信息。這樣能縮小排查範圍,再結合異常堆棧、heapDump文件、JVM分析工具和業務代碼來判斷具體是哪 ...