Java面試題之資料庫三範式是什麼?

来源:https://www.cnblogs.com/marsitman/archive/2018/12/22/10162231.html
-Advertisement-
Play Games

什麼是範式? 簡言之就是,資料庫設計對數據的存儲性能,還有開發人員對數據的操作都有莫大的關係。所以建立科學的,規範的的資料庫是需要滿足一些規範的來優化數據數據存儲方式。在關係型資料庫中這些規範就可以稱為範式。 什麼是三大範式? 第一範式(1NF):強調的是列的原子性,即列不能夠再分成其他幾列。 第二 ...


什麼是範式?

簡言之就是,資料庫設計對數據的存儲性能,還有開發人員對數據的操作都有莫大的關係。所以建立科學的,規範的的資料庫是需要滿足一些規範的來優化數據數據存儲方式。在關係型資料庫中這些規範就可以稱為範式。

 

什麼是三大範式?

第一範式(1NF):強調的是列的原子性,即列不能夠再分成其他幾列。 第二範式(2NF):首先是 1NF,另外包含兩部分內容,一是表必須有一個主鍵;二是沒有包含在主鍵中的列必須完全依 賴於主鍵,而不能只依賴於主鍵的一部分。 第三範式(3NF):首先是 2NF,另外非主鍵列必須直接依賴於主鍵,不能存在傳遞依賴。即不能存在:非主鍵列 A 依賴 於非主鍵列 B,非主鍵列 B 依賴於主鍵的情況。註:關係實質上是一張二維表,其中每一行是一個元組,每一列是一個屬性

 

如何理解三大範式?

第一範式(1NF):

1)、每一列屬性都是不可再分的屬性值,確保每一列的原子性

2)、兩列的屬性相近或相似或一樣,儘量合併屬性一樣的列,確保不產生冗餘數據

如果需求說要按哪個省哪個市分類,那麼顯然第一個表格是不容易滿足需求的,也不符合第一範式。

第二範式(2NF):

每一行的數據只能與其中一列相關,即一行數據只做一件事。只要數據列中出現數據重覆,就要把表拆分開來。

一個人同時買幾件商品,就會出來一個訂單號多條數據,這樣子客戶都是重覆的,就會造成數據冗餘。我們應該把他拆開來。

ruxi

這樣這張表就不會產生數據冗餘了。

第三範式(3NF):

數據不能存在傳遞關係,即沒個屬性都跟主鍵有直接關係而不是間接關係。像:a-->b-->c  屬性之間含有這樣的關係,是不符合第三範式的。

考慮一個訂單表T_ORDER(OrderNO,PRODUCTNO,CUSTOMERID,CUSTOMERNAME,CUSTOMERPHONE,CUSTOMERCARDID)主鍵是(ORDERNO)。 

其中 PRODUCTNO,CUSTOMERID,CUSTOMERNAME,CUSTOMERPHONE,CUSTOMERCARDID 等非主鍵列都完全依賴於主鍵(ORDERNO),所以符合 2NF.

不過問題是CUSTOMERNAME,CUSTOMERPHONE,CUSTOMERCARDID 直接依賴的是 CUSTOMERID(非主鍵列),而不是直接依賴於主鍵,它是通過傳遞才依賴於主鍵,所以不符合 3NF。 

通過拆分T_ORDER為(OrderNO,PRODUCTNO,CUSTOMERID)和T_CUSTOMER(CUSTOMERID,CUSTOMERNAME,CUSTOMERPHONE,CUSTOMERCARDID)從而達到 3NF。如下圖:

 

結論

三大範式只是一般設計資料庫的基本理念,可以建立冗餘較小、結構合理的資料庫。如果有特殊情況,當然要特殊對待,資料庫設計最重要的是看需求跟性能,需求>性能>表結構。所以不能一味的去追求範式建立資料庫。

 


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

-Advertisement-
Play Games
更多相關文章
  • 文章部分圖片來自參考資料 ThreadLocal 概述 ThreadLocal 線程本地變數 ,是一個工具,可以讓多個線程保持一個變數的副本,那麼每個線程可以訪問自己內部的副本變數。 ReentranReadWriteLock中。 ThreadLocal 結構圖裡面看到有兩個內部類,一個 Suppl... ...
  • Spring Boot提倡基於Java的配置。這兩篇博文主要介紹springboot 一些常用的註解介紹@value通過@Value可以將外部的值動態註入到Bean中。添加application.properties的屬性,方便後面演示。 ...
  • CLI模式 CLI模式其實就是命令行運行模式,英文全稱Command-Line Interface(命令行介面) 以互動式Shell模式運行PHP http://php.net/manual/en/features.commandline.interactive.phpThe interactive ...
  • spring 2.5 中除了提供 @Component 註釋外,還定義了幾個擁有特殊語義的註釋,它們分別是:@Repository、@Service 和 @Controller。在目前的 Spring 版本中,這 3 個註釋和 @Component 是等效的,但是從註釋類的命名上,很容易看出這 3 ... ...
  • 1、安裝Django 終端中輸入:pip install Django==2.1.4 等於號後面的為版本,選則適合自己python的版本,如下圖 Django versionPython versions 1.8 2.7, 3.2 (until the end of 2016), 3.3, 3.4, ...
  • 文件名vsearch4web 文件名vsearch 在temolates中的三個html文件 results entry base 在static中的css樣式 hf body { font-family: Verdana, Geneva, Arial, sans-serif; font-size: ...
  • 一、背景 在後臺項目中,經常會遇到將呈現的內容導出到Excel的需求,通過都是導出單個表頭的Excel文件,如果存在級聯關係的情況下,也就需要導出多表頭的場景。今天這篇文章就是分享導出Excel單表頭或多表頭的實現,目前實現方案僅支持2行表頭場景。如有更複雜的3行表頭、4行表頭複雜需求可以自行實現。 ...
  • 一、引言 在springboot項目啟動的時候,會在console控制臺中列印出一個SPRING的圖案。有時候為了減少日誌輸出以及控制台的輸出,就需要將這些給去除;有時候需要換上個人的標簽等標識,就需要將其自定義為個人標識。 二、Banner輸出 三、控制Banner 通過啟動main方法,就會預設 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...