MySQL范式和反范式

范式

是用一組規則定義的數據庫設計標準,旨在確保數據庫結構合理,避免數據冗余和異常。

目的

  • 消除數據的重復,提高存儲效率
  • 防止數據異常(插入、刪除、更新異常)
  • 提高數據的完整性和一致性

第一范式

  • 定義
    • 所有列(字段)必須是原子性的(不可拆分的基本數據單位)
    • 表中的每個字段都應包含原子值,不能存儲集合、數組等多值數據
  • 要求
    • 每個字段只存儲單一值,無重復列
    • 每一行是唯一的(通常用主鍵)

舉例:

  • 不符合1NF:一列存多個電話號碼,用逗號分隔
    • 比如: 一個“電話號碼”字段存著“13812345678,13987654321”兩個號碼(多個值在一列)
  • 符合1NF:用多個字段存放各個電話號碼,或用一行存一個電話

第二范式

  • 定義
    • 在1NF基礎上,消除表中的部分依賴(部分依賴是指非主鍵列依賴于主鍵的一部分)
  • 要求
    • 所有非主鍵列必須完全依賴于整個主鍵(對于復合主鍵)

舉例:

  • 表:訂單明細(order_id, product_id, product_name)
  • 關鍵點:
    • 如果主鍵是(order_id, product_id)
    • product_name 依賴product_id,不是整個主鍵 → 不符合2NF
    • 解決方案:將product_name單獨放到產品表

第三范式

  • 定義
    • 在2NF基礎上,消除非主鍵列之間的傳遞依賴
  • 要求
    • 所有非主鍵列都必須直接依賴于主鍵,不依賴于其他非主鍵列

舉例:

  • 表:員工(員工ID,部門ID,部門名稱)
    • 依賴關系:
      • 部門名稱依賴于部門ID
      • 部門ID依賴于員工ID
      • 由于部門名稱依賴于部門ID(非主鍵),這是傳遞依賴,不符合3NF
      • 解決方案:將部門信息單獨拆分到新表

更高階的范式

  • BCNF(Boyce-Codd Normal Form):比3NF更嚴格,要求每個決定因素都是超鍵
  • 4NF、5NF:更復雜,涉及多值依賴和連接依賴,較少在日常開發中應用

如何進行判斷依賴和主鍵

判斷依賴

    1. 依賴關系的基本概念
    • 依賴:某個字段(或多個字段)值的確定依賴于另一個字段(或多個字段)
  • 簡述:
    • 如果字段B的值都是由字段A的值唯一決定的,稱為“B依賴A”
    • 記作:A → B
    1. 如何識別依賴關系?
    • 分析業務邏輯:理解數據的實際關系
    • 觀察數據的函數關系:
    • 比如:
      • 一個“訂單ID”決定了“訂單日期” → 訂單ID → 訂單日期
      • 某個“學生ID”決定“學生姓名” → 學生ID → 姓名
  • 借助示意圖:
    • 可以畫出依賴關系圖(如:箭頭指向依賴方)
訂單ID訂單日期客戶ID客戶名
  • 依賴關系:
    • 訂單ID → 訂單日期
    • 客戶ID → 客戶名
  • 推斷:
    • 訂單ID決定訂單日期
    • 客戶ID決定客戶名

判斷主鍵

  • 觀察每一列(字段):
    • 哪個字段的值在整個表中是唯一的?(比如:身份證號、學號、訂單編號)
  • 組合判斷:
    • 如果單個字段不能唯一標識一條記錄,就考慮多個字段結合
    • 比如:
    • “訂單ID”唯一 → 訂單ID就是主鍵
    • 但:
      • “訂單ID + 商品ID”,這個組合也能唯一標識一條訂單中的商品項
  • 實際操作:
    • 查看每個字段的值,識別唯一性
    • 使用數據庫設計工具或SQL語句:
select count(distinct 某字段) from 表名;
  • 如果結果等于總記錄數,說明該字段唯一。
  • 當單一字段不能唯一標識行時,用多個字段組合作為主鍵
    • 如:
    • 學生-課程關聯表:學生ID + 課程ID
    • 判斷依據:聯合唯一性

總結

事項方法舉例
依賴關系分析業務邏輯或觀察數據中的“唯一決定關系”訂單ID → 訂單日期
確定主鍵查看哪些字段的值在表中唯一訂單ID是唯一則單字段主鍵
組合主鍵多個字段合成唯一標識學生ID + 課程ID組成主鍵

示例

學生ID課程ID課程名教師名
1101數學老師A
2102語文老師B
1102語文老師B
  • 滿足1NF:每個字段都是單一值

  • 是否滿足2NF?

    • 主鍵可能是(學生ID + 課程ID)
    • 課程名和教師名只依賴課程ID,不是整個復合主鍵 → 不滿足2NF。
    • 解決:拆兩張表——
      • 學生選課表:學生ID,課程ID
      • 課程表:課程ID,課程名,教師名
  • 是否滿足3NF?

    • 課程表只有課程相關信息,沒有傳遞依賴。

示例2
在這里插入圖片描述

在這里插入圖片描述

反范式

:為了提高查詢速度或簡化復雜查詢,有意將部分冗余數據引入設計,放寬或取消范式規范。

目的

  • 目標:
    • 減少多表連接(JOIN)操作
    • 提升讀取性能,尤其在大數據量和高并發場景
    • 簡化應用層的數據訪問邏輯

何時采用反范式

  • 查詢頻繁涉及復雜多表JOIN,影響性能
  • 讀操作遠多于寫操作(寫入時維護冗余數據帶來額外成本)
  • 實時性要求高,不能接受延遲
  • 業務場景對數據一致性要求相對較低(允許一定的冗余和同步)

例子:

  • 不反范式(正常化設計):
    • 查詢訂單和訂單詳情需要多表JOIN
    • 代碼中拼接復雜SQL,邏輯繁瑣
  • 采用反范式:
    • 將訂單詳情部分數據直接存儲在訂單表里
    • 查詢只需訪問一張表,邏輯簡單,代碼清晰

常見方式

  • 將關聯的表合并成一張表,避免JOIN操作
  • 在主表中添加冗余字段,如冗余姓名、類別等
  • 復制部分數據到不同的表中,方便快速查詢

風險與管理

  • 數據不一致:冗余數據不同步可能導致數據差異
    • 數據不一致主要是因為冗余數據在多個位置存儲后,沒有保持同步,導致各個副本或字段中的信息出現差異。

為什么會導致數據不一致?

    1. 缺少同步機制
    • 在反范式設計中,冗余數據通常存儲在多個表或位置。
    • 如果沒有有效的同步策略(如觸發器、業務邏輯或應用程序控制同步),在數據變更時,某些冗余字段沒有及時更新。
    1. 寫操作不完整或遺漏
    • 更新、刪除、插入操作中,某些地方的冗余數據沒有一起更新。
    • 例如:更新訂單狀態時,只更改訂單表中的狀態字段,但未同步更新訂單的詳細視圖或歷史記錄。
    1. 并發修改造成的沖突
    • 多個事務同時修改不同副本,可能導致不同步或出現“最后寫入”覆蓋的問題。
    1. 缺少約束或觸發器
    • 沒有設置約束(如觸發器、外鍵關系)來保證冗余字段在數據變更時自動同步。
    1. 業務邏輯缺陷
    • 業務程序未考慮數據同步問題,導致不同的數據源或存儲之間數據不同。
  • 維護成本增加:更新時需要同步多份數據

  • 設計復雜度:需要額外的代碼邏輯保證數據一致性

因此,反范式應謹慎使用,只在確有性能瓶頸或特殊需求時采用

實際應用

  • 應用建議:
    • 在設計數據庫時,遵循至少3NF,可以最大程度降低數據冗余和異常
    • 但也會帶來更多的表,查詢可能變復雜,性能可能降低
    • 常用過程中會在范式和性能之間做權衡(有時會適當范式反范,即反范式化)

總結

范式目的核心原則典型表現
1NF原子性每個字段只存基本值沒有多值字段
2NF消除部分依賴非主鍵都依賴整個主鍵對復合主鍵特別重要
3NF消除傳遞依賴非主鍵不依賴于其他非主鍵避免冗余存儲冗余數據
反范式動機典型做法潛在問題
反范式提升性能,簡化查詢添加冗余字段、合并表可能導致數據不一致
  • 范式是符合某一種級別的關系模式的集合。構造數據庫必須遵循一定的規則。在關系數據庫中,這種規則就是范式

    • 范式優點:減少了數據冗余,數據表更新操作快、占用存儲空間少
    • 范式缺點:查詢時通常需要多表關聯查詢,更難進行索引優化
  • 反范式的過程就是通過冗余數據來提高查詢性能,但冗余數據會犧牲數據一致性

    • 反范式優點:所有的數據都在同一張表中,可以減少表關聯,更好進行索引優化
    • 反范式缺點:存在大量冗余數據,數據維護成本更高

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908166.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908166.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908166.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

編程技能:格式化打印04,sprintf

專欄導航 本節文章分別屬于《Win32 學習筆記》和《MFC 學習筆記》兩個專欄,故劃分為兩個專欄導航。讀者可以自行選擇前往哪個專欄。 (一)WIn32 專欄導航 上一篇:編程技能:格式化打印03,printf 回到目錄…

JavaScript性能優化實戰:深入探討JavaScript性能瓶頸與優化技巧

引言:為什么JavaScript性能至關重要 在現代Web開發中,JavaScript已成為構建交互式應用程序的核心技術。隨著單頁應用(SPA)和復雜前端架構的普及,JavaScript代碼的性能直接影響用戶體驗、轉化率甚至搜索引擎排名。研究表明,頁面加載時間每增加1秒,轉化率可能下降7%,而性能…

Java數據結構——八大排序

排序 插?排序希爾排序直接選擇排序堆排序冒泡排序快速排序歸并排序計數排序 排序的概念 排序:就是將一串東西,按照要求進行排序,按照遞增或遞減排序起來 穩定性:就是比如排序中有兩個相同的數,如果排序后&#xff0c…

WPF響應式UI的基礎:INotifyPropertyChanged

INotifyPropertyChanged 1 實現基礎接口2 CallerMemberName優化3 數據更新觸發策略4 高級應用技巧4.1 表達式樹優化4.2 性能優化模式4.3 跨平臺兼容實現 5 常見錯誤排查 在WPF的MVVM架構中, INotifyPropertyChanged是實現數據驅動界面的核心機制。本章將深入解析屬…

低空城市場景下的多無人機任務規劃與動態協調!CoordField:無人機任務分配的智能協調場

作者:Tengchao Zhang 1 ^{1} 1 , Yonglin Tian 2 ^{2} 2 , Fei Lin 1 ^{1} 1, Jun Huang 1 ^{1} 1, Patrik P. Sli 3 ^{3} 3, Rui Qin 2 , 4 ^{2,4} 2,4, and Fei-Yue Wang 5 , 1 ^{5,1} 5,1單位: 1 ^{1} 1澳門科技大學創新工程學院工程科學系&#xff0…

解決Java項目NoProviderFoundException報錯

前言 在Java開發中,jakarta.validation.NoProviderFoundException 是一個令人困惑的運行時錯誤,常因校驗框架依賴缺失或版本沖突導致。 問題復現:用戶注冊校驗失敗 業務場景 開發一個用戶注冊功能,要求: 校驗郵箱…

重構跨境收益互換價值鏈:新一代TRS平臺的破局之道

當香港券商面對內地洶涌的結構化產品需求,一套智能化的TRS系統正成為打開萬億市場的金鑰匙 在跨境金融的暗流涌動中,一家中資背景的香港券商正面臨甜蜜的煩惱:內地高凈值客戶對港股、美股的杠桿交易需求激增,但傳統TRS業務深陷操作…

實驗設計如何拯救我的 CEI VSR 28G 設計

為了確定總體設計裕量,CEI 28G VSR/100 Gb 以太網設計需要分析 500 萬種通道變化、收發器工藝和均衡設置的組合。蠻力模擬需要 278 天,這顯然超出了可用的時間表。 相反,我們使用實驗設計 (DOE) 和響應面建模 &#x…

【仿生機器人】刀劍神域——愛麗絲蘇醒計劃,需求文檔

仿生機器人"愛麗絲"系統架構設計需求文檔 一、硬件基礎 已完成頭部和頸部硬件搭建 25個舵機驅動表情系統 頸部旋轉功能 眼部攝像頭(視覺輸入) 麥克風陣列(聽覺輸入) 頸部發聲裝置(語音輸出&#xff09…

【Day44】

DAY 44 預訓練模型 知識點回顧: 預訓練的概念常見的分類預訓練模型圖像預訓練模型的發展史預訓練的策略預訓練代碼實戰:resnet18 作業: 嘗試在cifar10對比如下其他的預訓練模型,觀察差異,盡可能和他人選擇的不同嘗試通…

python打卡訓練營打卡記錄day44

知識點回顧: 預訓練的概念常見的分類預訓練模型圖像預訓練模型的發展史預訓練的策略預訓練代碼實戰:resnet18 作業: 嘗試在cifar10對比如下其他的預訓練模型,觀察差異,盡可能和他人選擇的不同嘗試通過ctrl進入resnet的…

Vue跨層級通信

下面,我們來系統的梳理關于 Vue跨層級通信 的基本知識點: 一、跨層級通信核心概念 1.1 什么是跨層級通信 跨層級通信是指在組件樹中,祖先組件與后代組件(非直接父子關系)之間的數據傳遞和交互方式。這種通信模式避免了通過中間組件層層傳遞 props 的繁瑣過程。 1.2 適用…

webPack基本使用步驟

webPack基本使用步驟 關于webPackwebPack配置的幾個概念entry(入口)output(輸出)loader(輸出)plugin(插件)mode(模式) 基本使用過程示例1.創建測試目錄和代碼…

龍虎榜——20250604

上證指數縮量收陽線,量能依然在5天線上,股價也在5天線上。 深證指數放量收陽線,量能站上5天均線,但仍受中期60天均線壓制。 2025年6月4日龍虎榜行業方向分析 1. 黃金 代表標的:曼卡龍、菜百股份。 驅動邏輯&#…

Viggle:開啟視頻人物替換新紀元

Viggle 的出現,為視頻人物替換帶來了前所未有的變革,為創作者和愛好者們打開了一扇通往無限可能的大門。 一、Viggle 技術原理剖析 Viggle 是一款基于先進人工智能技術的創新平臺,其核心在于能夠精準實現靜態圖片與動態視頻的融合轉化。它…

【BUG解決】關于BigDecimal與0的比較問題

這是一個很細小的知識點,但是很容易被忽略掉,導致系統問題,因此記錄下來 問題背景 明明邏輯上看a和b都不為0才會調用除法,但是系統會報錯:java.lang.ArithmeticException異常: if (!a.equals(BigDecimal…

千年之后再出發,銅官窯駛入微短劇的數字航道

過去一年里,微短劇已經成為走向全民關注、平臺扶持、政策引導的“內容新主流”。從市值百億的爆款平臺到走出國門的“短劇出海”,微短劇正在重塑中國數字文化的表達方式與產業結構,也成為各地競相爭奪的“新藍海”。 就在這樣的背景下&#…

數據庫管理-第333期 Oracle 23ai:RAC打補丁完全不用停機(20250604)

數據庫管理333期 2025-06-04 數據庫管理-第333期 Oracle 23ai:RAC打補丁完全不用停機(20250604)1 概念2 要求3 操作流程4 轉移失敗處理總結 數據庫管理-第333期 Oracle 23ai:RAC打補丁完全不用停機(20250604&#xff0…

Trae CN IDE自動生成注釋功能測試與效率提升全解析

Trae CN IDE 的自動注釋功能可以通過 AI 驅動的代碼分析生成自然語言注釋,以下是具體測試方法和優勢總結: 一、Python 代碼注釋生成測試 1. 測試環境 IDE:Trae CN IDE(需確認支持 Python)代碼示例: def …

軟考 系統架構設計師系列知識點之雜項集萃(79)

接前一篇文章:軟考 系統架構設計師系列知識點之雜項集萃(78) 第141題 軟件測試一般分為兩個大類:動態測試和靜態測試。前者通過運行程序發現錯誤,包括()等方法;后者采用人工和計算機…