三範式,資料庫設計的基本準則

来源:https://www.cnblogs.com/lijizhi/archive/2019/04/11/10686839.html
-Advertisement-
Play Games

註: 本文不對三範式的概念進行介紹,只舉例說明本人對三範式的理解!歡迎斧正! 第一範式:1NF 1、確保創建表時的每一列屬性的原子性,即每一列屬性都是不可再分的屬性值。 (1)例如: (1)解釋: user_address 屬性不符合屬性的原子性,該屬性可以進一步進行拆分成,省、市、縣、詳細地址等信 ...


註: 本文不對三範式的概念進行介紹,只舉例說明本人對三範式的理解!歡迎斧正!

第一範式:1NF

1、確保創建表時的每一列屬性的原子性,即每一列屬性都是不可再分的屬性值。

(1)例如:

(1)解釋:

user_address 屬性不符合屬性的原子性,該屬性可以進一步進行拆分成,省、市、縣、詳細地址等信息!

(2)例如:

(2)解釋:

將原user_address屬性拆分成省份、地市信息(int類型數據字典值),根據具體需求可以將詳細地址進一步進行拆分,定位到城區,縣市,甚至是小區名稱,建築物名稱等!

所以所謂屬性的原子性也要結合具體需求實現相應粒度的原子性!例如:要對用戶的省市信息進行分組表1顯然不滿足需求、要對區縣信息進行分組表2仍不滿足需求,應進一步將user_address進行原子性拆分。


 

2、同一個數據表中不得存在類型相似的屬性

(1)例如:

(1)解釋:

 user_provence_2 等屬性與user_provence等屬性重覆,當前表既無法滿足用戶有多個收貨地址的情況,當只存在一個收貨地址的情況下,又會造成欄位冗餘!

創建收貨地址表,解決屬性相似問題,及多個收貨地址的情況!


 

第二範式:2NF

1、一張表在滿足1NF的前提下,表中其他非主屬性又統一直接依賴表中唯一主屬性(primary key)則滿足2NF!

2NF是對記錄的惟一性約束,要求記錄有惟一標識,即實體的惟一性,更通俗說有主鍵ID。

(1)例如:

(1)解釋:

在用戶表中存在非主屬性[order_info]不與該表主屬性[user_id]直接關聯(order_info與order_id直接關聯),即當前表不滿足2NF。

應將訂單表與用戶表分離,訂單表通過關聯用戶表user_id實現主從模式[1用戶—n訂單] 綁定。保證了一個表只保存一類業務實體。


 

 第三範式:3NF

1、數據表中不存在屬性的依賴傳遞

(1)示例:

(1)解釋:3NF是對欄位冗餘性的約束,即任何欄位不能由其他欄位派生出來,它要求欄位沒有冗餘。

  乍一看,code能決定其他非主屬性,符合2NF。但是在同系的學生中,系相關信息被保存n份。

      (1)造成了數據冗餘,同系學生的系相關信息相同。

      (2)修改系相關信息,則需要修改所有學生的系信息。

  解決辦法:分表操作!

  解決表中的依賴傳遞現象,code—>d_code  ,d_code 能決定d_name/d_address ,則code影響d_name/d_address是通過code—>d_code 進行的依賴傳遞實現的。

  

    


 

 基於三範式的資料庫設計屬於學院派的數據表設計風格,並不是所以的表設計都要滿足三範式!在真正的生產環境下,主要依據業務需求結合數據規模等各種因素的綜合影響下對錶結構進行設計!切不可拘泥於範式的約束!


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

-Advertisement-
Play Games
更多相關文章
  • SQL 中遠程調用失敗的原因 1.服務裡面的啟動許可權未能啟動,修改sql對應的服務進程許可權就可以了 2.是因為VS 和SQL 起衝突了,資料庫找不到訪問地址導致的。解決的辦法很簡單,就是卸載掉多餘的版本 方法一: Win + X 打開控制管理 電腦管理 服務和應用程式 服務,找到 SQL Serv ...
  • pt table sync Synchronize MySQL table data efficiently. pt table sync synchronizes data efficiently between MySQL tables. pt table sync 是Percona Toolk ...
  • 2019-04-1116:01:25 表空間分配10m自動擴展,向表中插入數據,看表空間達到10m以後是否會報錯。 測試過程如下: 1、創建表空間 CREATE TABLESPACE TEST DATAFILE '/u01/app/oracle/oradata/test/TESTDB/TEST01. ...
  • SQL Server的Linked Server支持使用SEQUENCE嗎? SQL Server 2012開始支持序列(SEQUENCE),今天遇到有個同事咨詢,能否在LINKED SERVER裡面調用SEQENCE, 結果我測試發現不行,但是不管官方文檔也好,網上相關資料也罷,都沒有說支持,也沒... ...
  • PGA
    PGA全稱為Program Global Area,即程式全局區 它是一塊包含一個服務進程的數據和控制信息的記憶體區域,是 Oracle 在一個服務進程啟動是創建的,是非共用的 一個Oracle進程擁有一個PGA記憶體區,一個 PGA也只能被擁有它的那個服務進程所訪問,只有這個進程中的Oracle代碼才 ...
  • 本文節選自《軟體架構設計:大型網站技術架構與業務架構融合之道》第6.4章節。 作者微信公眾號:架構之道與術。進入後,可以加入書友群,與作者和其他讀者進行深入討論。也可以在京東、天貓上購買紙質書。 6.4.1 事務的四個隔離級別 通俗地講,事務就是一個“代碼塊”,這個代碼塊要麼不執行,要麼全部執行。事 ...
  • 本文節選自《軟體架構設計:大型網站技術架構與業務架構融合之道》第6.3章節。 作者微信公眾號: 架構之道與術。進入後,可以加入書友群,與作者和其他讀者進行深入討論。也可以在京東、天貓上購買紙質書。 關係型資料庫在查詢方面有一些重要特性,是KV型的資料庫或者緩存所不具備的,比如:(1)範圍查詢。(2) ...
  • [20190409]pre_page_sga=true與連接緩慢的問題.txt--//曾經遇到11g下設置pre_page_sga=true啟動緩慢的問題(沒有使用hugepages).--//鏈接:http://blog.itpub.net/267265/viewspace-2295412/--/ ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...