MySQL數據庫設計

1. 如何設計數據庫

? ? ? ? 設計數據庫步驟

2. E-R圖的使用

我們在日常設計的數據庫多為“一對多”和“多對一”

3. 設計數據庫三大范式?

????????第一范式(1st NF):確保每列的原子性

? ? ? ? 第二范式(2st NF):每個表只描述一件事情

????????第三范式 (3nd NF):表中各列必須和主鍵直接相關,不能間接相關

4. 三大范式補充

1. 第一范式(1NF)

?核心要求?:確保每列具有原子性,即不可再分。

  • ?通俗理解?:表中的每個字段必須是不可分割的最小數據單元,不能包含集合、數組或復合結構。例如,“地址”字段若包含省份、城市、街道等信息,需拆分為多個獨立字段。
  • ?示例?:若“家庭信息”列包含“地址+成員”,需拆分為“地址”和“家庭成員”兩列以滿足1NF。

2. 第二范式(2NF)

?核心要求?:在1NF基礎上,非主鍵屬性必須完全依賴于主鍵(而非部分依賴)。

  • ?聯合主鍵場景?:若主鍵由多列組成(如訂單號+產品號),非主鍵字段(如產品價格)必須依賴整個主鍵,而非僅依賴產品號。
  • ?違反示例?:訂單表中“訂單日期”僅依賴訂單號(主鍵的一部分),需拆分表以消除部分依賴。

3. 第三范式(3NF)

?核心要求?:在2NF基礎上,消除非主鍵屬性間的傳遞依賴。

  • ?傳遞依賴問題?:若字段A依賴字段B,而B依賴主鍵,則A應直接依賴主鍵。例如,訂單表中不應直接存儲客戶姓名(依賴客戶編號),應通過外鍵關聯客戶表。
  • ?優點?:減少數據冗余(如避免重復存儲客戶信息)并避免更新異常。

注意事項

  • ?實際應用?:三大范式雖規范,但可能影響查詢性能。阿里巴巴建議關聯表不超過3張,需平衡規范性與性能。
  • ?更高范式?:存在BCNF、4NF等,但1NF~3NF最常用。
  • ?反范式設計?:為提高查詢效率,允許適度冗余(如統計字段),但需權衡數據一致性風險

5. 實際案例演示

????????應用第一范式規范化

無可繼續拆分的信息,無需應用

????????應用第二范式規范化

????????應用第三范式規范化

?

6. 反范式設計(補充說明)

一、基本概念

反范式設計是數據庫設計中的一種優化手段,指在數據庫建模過程中,通過適當違反范式規則(如增加冗余數據、合并表等),來提高數據庫的讀取性能。它是對范式設計(追求數據一致性和減少冗余)的一種權衡,適用于讀取操作頻繁、寫入操作較少的場景。

二、核心思想
  • 犧牲部分一致性,換取查詢效率:通過引入冗余數據或合并表,減少查詢時的表連接(JOIN)操作,從而提升查詢速度。
  • 平衡性能與維護成本:在數據冗余帶來的查詢優化和數據更新、維護成本之間尋找平衡點。
三、常見方法

以下是反范式設計的常用手段,可根據具體場景組合使用:

1.?增加冗余字段
  • 做法:在多個表中保留相同的字段,避免跨表查詢。
    :訂單表(Order)中包含用戶姓名(User.Name),避免每次查詢訂單時 JOIN 用戶表(User)。
  • 適用場景:冗余字段更新頻率低,且查詢時頻繁需要關聯的場景。
2.?合并表
  • 做法:將經常一起查詢的多個表合并為一個表,減少 JOIN 操作。
    :將用戶表(User)和用戶詳情表(UserDetail)合并為一個表。
  • 適用場景:表之間存在強關聯,且合并后不會導致大量空字段的場景。
3.?拆分表
  • 垂直拆分:將表中不常用的字段拆分到單獨的擴展表中,減少主表數據量,提升查詢速度。
    :將用戶表中的 “頭像 URL”“簡介” 等低頻字段拆分到擴展表。
  • 水平拆分:按條件(如時間、ID 范圍)將表數據拆分到多個子表中,降低單表數據量。
    :按年份將訂單表拆分為Order_2023Order_2024等表。
4.?增加派生字段
  • 做法:通過計算或聚合生成新字段,直接存儲結果,避免查詢時實時計算。
    :在用戶表中存儲 “總訂單數” 字段,通過定時任務更新,避免每次查詢時統計。
四、適用場景

反范式設計適用于以下場景:

  1. 讀多寫少:如報表系統、日志系統、歷史數據查詢等。
  2. 實時性要求高:如電商商品詳情頁(需快速展示商品、分類、商家等信息)。
  3. 單表數據量龐大:當范式設計導致 JOIN 操作性能低下時,可通過冗余減少關聯。
  4. 允許一定數據延遲:如允許冗余字段定期同步,而非實時更新。
五、優缺點分析
優點缺點
減少 JOIN 操作,提升查詢性能數據冗余可能導致不一致(如更新延遲)
簡化查詢邏輯,降低開發復雜度增加數據維護成本(如更新、刪除)
單表查詢效率更高占用更多存儲空間
對 OLAP(聯機分析處理)場景友好設計不當可能導致后續擴展困難
六、實施注意事項
  1. 評估場景必要性:優先使用索引、緩存(如 Redis)等優化手段,避免過度反范式。
  2. 控制冗余程度:僅對高頻查詢且低更新的數據進行冗余,避免全表冗余。
  3. 數據一致性方案
    • 定期同步:通過定時任務(如 CRON)更新冗余數據。
    • 觸發器:在寫入主表時,通過數據庫觸發器同步更新冗余字段(需注意性能影響)。
    • 應用層控制:在業務代碼中手動維護主表與冗余數據的一致性。
  4. 文檔記錄:明確標注反范式設計的字段和邏輯,方便后續維護。
  5. 監控與優化:定期分析查詢性能和數據一致性,必要時調整設計。
七、與范式設計的對比
維度范式設計反范式設計
核心目標數據一致性、減少冗余讀取性能優化
適用場景OLTP(聯機事務處理)系統OLAP 系統、讀多寫少場景
典型場景銀行交易系統、電商訂單系統報表系統、商品詳情頁
設計復雜度高(需遵循范式規則)中(需平衡冗余與維護)
八、案例說明

場景:設計一個電商平臺的 “商品詳情頁”,需展示商品信息、分類名稱、商家名稱。

  • 范式設計
    • 表結構:商品表(Goods)分類表(Category)商家表(Seller)
    • 查詢:需 JOIN 三張表,性能可能較低(尤其在高并發場景)。
  • 反范式設計
    • 商品表中增加冗余字段category_name(分類名稱)、seller_name(商家名稱)。
    • 查詢:直接單表查詢,性能顯著提升;通過定時任務或商品 / 分類 / 商家更新時同步冗余字段。
九、總結

反范式設計是數據庫優化的重要手段,但需謹慎使用。關鍵在于明確業務需求,在性能提升與數據維護成本之間找到平衡點。實際應用中,常采用 “混合設計”—— 核心業務遵循范式設計,高頻查詢場景輔以反范式優化,以兼顧一致性和性能。

7. 總結

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

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

相關文章

C#中Action的用法

Action 是 C# 中委托的一種,用于封裝無返回值的方法。它引用的方法不能有返回值,但可以有零個或多個參數。相比delegate委托,Action 委托的優點是不必顯式定義封裝無參數過程的委托,使代碼更加簡潔和易讀。 1、delegate-委托 先…

計算機視覺與深度學習 | matlab實現EMD-CNN-LSTM時間序列預測(完整源碼、數據、公式)

EMD-CNN-LSTM 一、完整代碼實現二、核心公式說明1. **經驗模態分解(EMD)**2. **1D卷積運算**3. **LSTM門控機制**4. **損失函數**三、代碼結構解析四、關鍵參數說明五、性能優化建議六、典型輸出示例以下是用MATLAB實現EMD-CNN-LSTM時間序列預測的完整方案,包含數據生成、經…

mybatis-plus實操

如何生成完全看項目,有的人是用管理系統生成,還有其他人可能是.....。博主這里是用插件生成 我是插件的話,先在ide連接上數據源,然后對表右鍵,直接來到下面這個步驟, 第一次是新增6個文件,我們…

Mergekit——任務向量合并算法Ties解析

Mergekit——高頻合并算法 TIES解析 Ties背景Ties 核心思想具體流程總結 mergekit項目地址 Mergekit提供模型合并方法可以概況為三大類:基本線性加權、基于球面插值、基于任務向量,今天我們來刷下基于任務向量的ties合并方法,熟悉原理和代碼。…

YOLOv8 在單片機上部署的缺點和應對方案

YOLOv8 在單片機上部署的主要挑戰與缺陷 將 YOLOv8 部署到單片機上確實面臨諸多技術挑戰,主要源于單片機有限的計算資源與 YOLOv8 模型的高復雜度之間的矛盾。以下是具體的缺陷和限制: 1. 計算資源嚴重不足 算力限制:典型單片機&#xff0…

搭建一個永久免費的博客

搭建永久免費的博客(1)基本介紹 HugoStackGitHub GitHub GitHub GitHub Build and ship software on a single, collaborative platform GitHub 下載安裝git Git - Downloads Edge插件authenticator 2fa client Settings->Password and auth…

基于SpringBoot的小型民營加油站管理系統

作者:計算機學姐 開發技術:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源碼”。 專欄推薦:前后端分離項目源碼、SpringBoot項目源碼、Vue項目源碼、SSM項目源碼、微信小程序源碼 精品專欄:…

推薦一個Winform開源的UI工具包

從零學習構建一個完整的系統 推薦一個開源、免費的適合.NET WinForms 控件的套件。 項目簡介 Krypton是一套開源的.Net組件,用于快速構建具有豐富UI交互的WinForms應用程序。 豐富的UI控件,提供了48個基礎控件,如按鈕、文本框、標簽、下拉…

社交平臺推出IP關聯機制:增強用戶體驗與網絡安全的新舉措

社交平臺為我們提供與親朋好友保持聯系、分享生活點滴的便捷渠道,還成為了信息傳播、觀點交流的重要平臺。然而,隨著社交平臺的普及,網絡空間中的虛假信息、惡意行為等問題也日益凸顯。為了應對這些挑戰,許多社交平臺相繼推出IP關…

系統架構設計(八):三層架構

什么是三層架構(Three-Tier Architecture) 三層架構是將系統分為三大邏輯層:表示層(Presentation)、業務邏輯層(Business Logic)、數據訪問層(Data Access),…

C語法備注01

(1)char 字符類 char 既可以是 整數 類型,也可以是 字符 類型。z字符 類型可以轉化為對應的ASC2值。 int main(){char c;char e;c 1;char d 1;e A;printf("c %d\n", c);printf("d %d\n", d);printf("e %d\n…

CVE-2015-2183 Zeuscart SQL注入漏洞

CVE-2015-2183 Zeuscart SQL注入漏洞 主頁 訪問/admin/進行登錄 訪問:http://192.168.1.3/admin/?doeditcurrency&cid1 單引號測試,發現頁面發生變化,進一步測試 order by 5 ,頁面正常,order by 6時頁面發生變…

Go 語言即時通訊系統開發日志-日志day2-5:架構設計與日志封裝

Go語言即時通訊系統開發日志day2 計劃:學習go中MySQL,Redis的使用,使用MySQL和Redis完成一個單聊demo。 總結:現在每天下午用來開發這個項目,如果有課的話可能學習時間只有3-4個小時,再加上今天的學習效率不…

對盒模型的理解

對CSS盒模型的深入理解 CSS盒模型是網頁布局的基礎概念,它描述了HTML元素在頁面中所占的空間以及如何計算這些空間。以下是關于盒模型的全面解析: 1. 盒模型的基本組成 每個HTML元素都被視為一個矩形的盒子,這個盒子由內到外由四部分組成&…

RV1126多線程獲取SMARTP的GOP模式數據和普通GOP模式數據

通過代碼的方式同時獲取SMARTP模式的VENC碼流數據和普通GOP模式的VENC碼流數據,并進行對比畫質。 一.RV1126 VI采集攝像頭數據并同時編碼SMARTP模式和普通GOP模式的編碼碼流流程 RV1126利用多線程同時獲取普通GOP的VENC碼流數據和SMARTP的碼流數據一般如上圖&#…

在Ubuntu使用 Ansible 配置 Azure 資源的動態清單

使用 Ansible 配置 Azure 資源的動態清單 簡介1.安裝pipx2.通過 pipx 安裝 Ansible3.安裝azure.azcollection4.安裝集合所需的依賴項5.生成動態庫存 簡介 在主機變化不定的云環境中,Ansible 的動態清單功能可以消除維護靜態清單文件的負擔 本教程將帶你使用 Azure…

車載診斷架構 ---車載總線對于功能尋址的處理策略

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 鈍感力的“鈍”,不是木訥、遲鈍,而是直面困境的韌勁和耐力,是面對外界噪音的通透淡然。 生活中有兩種人,一種人格外在意別人的眼光;另一種人無論…

Github 2025-05-16 Java開源項目日報 Top9

根據Github Trendings的統計,今日(2025-05-16統計)共有9個項目上榜。根據開發語言中項目的數量,匯總情況如下: 開發語言項目數量Java項目9Netty:異步事件驅動的網絡應用程序框架 創建周期:5043 天開發語言:Java協議類型:Apache License 2.0Star數量:33219 個Fork數量:…

大語言模型(LLM)如何通過“思考時間”(即推理時的計算資源)提升推理能力

大語言模型(LLM)如何通過“思考時間”(即推理時的計算資源)提升推理能力 核心圍繞人類思維機制、模型架構改進、訓練方法優化等展開 一、人類思維的啟發:快思考與慢思考 類比心理學: 人類思維分兩種模式: 快思考(系統1):直覺驅動,快速但易出錯(如估算簡單問題)。…

【ubuntu24.04】pycharm 死機結束進程

windows 遠程pycharm到ubuntu執行程序 pycharm 在調試過程中,內存耗盡,然后死機了 pycharm 進程 (base) rootk8s-master-pfsrv:/home/zhangbin/下載# ps -ef | grep pycharm root 121245 3230568 0 5月14 pts/8 00:00:00 /bin/bash --rcfile …